Публикация топика в MQTT

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Mics78
Сообщения: 28
Зарегистрирован: Чт фев 02, 2017 8:41 pm
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Публикация топика в MQTT

Сообщение Mics78 » Пн мар 06, 2017 10:06 pm

Здравствуйте, коллеги!
Возможно, ответ очевиден, но я, перерыв форум, его не нашёл. Буду благодарен за помощь.
Подскажите, пожалуйста, фрагмент кода, который позволит опубликовать значение в топик сервера MQTT из PHP Majordomo.

Я пробовал:
1. $mqtt->publish("/topic", "test"); - не работает

2. require("phpMQTT.php");
$addr="localhost";
$port=1883;
$user="user";
$pass="password";

$mqtt1 = new phpMQTT($addr, $port, "MajorDoMo MQTT Client");
$mqtt1->connect(true, NULL, $user, $pass);
$mqtt1->publish("/topic", "test");
$mqtt1->close(); - тоже не работает


Что я делаю не так?
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

Re: Публикация топика в MQTT

Сообщение DimSun75 » Пн мар 06, 2017 10:11 pm

Модуле MQTT создаете руками новый топик и привязываете его к какому-нибудь свойству, какого-нибудь объекта. Меняете свойство, оно публикуется в топик
Mics78
Сообщения: 28
Зарегистрирован: Чт фев 02, 2017 8:41 pm
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Re: Публикация топика в MQTT

Сообщение Mics78 » Пн мар 06, 2017 10:19 pm

DimSun75 писал(а):Модуле MQTT создаете руками новый топик и привязываете его к какому-нибудь свойству, какого-нибудь объекта. Меняете свойство, оно публикуется в топик
Спасибо. Правильно ли я понимаю, что произвольно из PHP кода это сделать нельзя?
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

Re: Публикация топика в MQTT

Сообщение DimSun75 » Пн мар 06, 2017 10:20 pm

Mics78 писал(а):
DimSun75 писал(а):Модуле MQTT создаете руками новый топик и привязываете его к какому-нибудь свойству, какого-нибудь объекта. Меняете свойство, оно публикуется в топик
Спасибо. Правильно ли я понимаю, что произвольно из PHP кода это сделать нельзя?
Можно, но зачем? Правильнее, когда все делается на уровне системы.
Mics78
Сообщения: 28
Зарегистрирован: Чт фев 02, 2017 8:41 pm
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Re: Публикация топика в MQTT

Сообщение Mics78 » Пн мар 06, 2017 10:32 pm

Я пока совсем не знаю эту систему. На это нужно время.
А для отладки того, что я сейчас делаю, мне надо формировать сложное значение, публикуемое в топике. Как это сделать средствами majordomo я не знаю.
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

Re: Публикация топика в MQTT

Сообщение DimSun75 » Пн мар 06, 2017 10:38 pm

Mics78 писал(а):Я пока совсем не знаю эту систему. На это нужно время.
А для отладки того, что я сейчас делаю, мне надо формировать сложное значение, публикуемое в топике. Как это сделать средствами majordomo я не знаю.
Создайте какой-нибудь класс, в него добавьте свойство. Создайте объект этого класса. Далее, как я писал привязываете это свойство к топику mqtt. Далее в скрипте просто setGlobal("Object.Property",$value); Проще некуда.
За это сообщение автора DimSun75 поблагодарили (всего 2):
Mics78 (Пн мар 06, 2017 11:11 pm) • craber (Ср мар 08, 2017 1:20 pm)
Рейтинг: 2.33%
Mics78
Сообщения: 28
Зарегистрирован: Чт фев 02, 2017 8:41 pm
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Re: Публикация топика в MQTT

Сообщение Mics78 » Пн мар 06, 2017 10:44 pm

Спасибо. Попробую.
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Публикация топика в MQTT

Сообщение nick7zmail » Вт мар 07, 2017 6:12 am

Mics78 писал(а):Спасибо. Правильно ли я понимаю, что произвольно из PHP кода это сделать нельзя?
Конечно можно. Правильный вопрос - оно вам надо?))
Mics78 писал(а): Я пробовал:
1. $mqtt->publish("/topic", "test"); - не работает

2. require("phpMQTT.php");
$addr="localhost";
$port=1883;
$user="user";
$pass="password";

$mqtt1 = new phpMQTT($addr, $port, "MajorDoMo MQTT Client");
$mqtt1->connect(true, NULL, $user, $pass);
$mqtt1->publish("/topic", "test");
$mqtt1->close(); - тоже не работает


Что я делаю не так?
Согласен с предыдущими ораторами, что правильнее на уровне системы, но всё же отвечу на вопрос =D
1) Просто команды publish в php не существует, она не заведется
2) Правильная попытка инициализировать mqtt, но скорее всего не правильный путь библиотеки phpMQTT.php (или файл вообще отсутствует)...по логам то смотрите, там скорее всего эта ошибка вываливается.
За это сообщение автора nick7zmail поблагодарил:
Mics78 (Ср мар 08, 2017 8:30 pm)
Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Mics78
Сообщения: 28
Зарегистрирован: Чт фев 02, 2017 8:41 pm
Благодарил (а): 3 раза
Поблагодарили: 3 раза

Re: Публикация топика в MQTT

Сообщение Mics78 » Ср мар 08, 2017 7:51 pm

Спасибо. Согласен, что правильнее делать так как задумано.
Файл есть, ошибок нет. Но не работает. Впрочем, вняв совету я получил тот результат, который хотел.

Сейчас вопрос встал несколько иначе. Я, для экспериментов, сейас использую ESP8266 с ESPEasy, MQTT и Majordomo. Потом железяка будет другой и софт на ней тоже другой, но это не важно.
ESPEasy принимает команды через MQTT в виде "gpio, порт, значение". Возвращает json вида: { "log": "GPIO 5 Set to 1", "plugin": 1, "pin": 5, "mode": "output", "state": 1 }. На каждую управляющую посылку на топик "/устройство/cmd" приходит ответ в топик "/устройство/status". Я хочу настроить управление ESP'шкой через MQTT от третьего устройства и с Majordomo переключателем. Так, чтобы при приходе внешней команды (от третьего устройства) переключатель на Majordomo принимал реальное значение.
Для этого я создал класс со свойствами "position" - это положение переключателя MAjordomo, "status" - принимаемый от MQTT ответ в топике "/устройство/status" и "set" - публикуемое в MQTT значение команды. Создал объект, связал с ним по свойствам топики "status" и "set". Создал переключатель связал по свойству "position".
Создал 2 метода:
Receive_statusПоказать
$data=json_decode($this->getProperty("status"));
$status=$data->state;
$this->setProperty("position", $status);
SwitchПоказать
$status=$this->getProperty("position");

if (!$status) {
$this->setProperty("set","gpio,5,0");
} else {
$this->setProperty("set","gpio,5,1");
}
Пререключатель связал с методом "Switch", свойство "status" с методом "Receive_status".
Всё работает в той конфигурации как я описал.
Логика работы следующая:
1. При приходе внешней команды, ESP отрабатывает её и публикует статус в json.
2. Запускается метод "Receive_status", который устанавливает значение положения переключателя ("position") в соответствии со статусом.
3. Переключатель принимает указанное значение.

4. При использовании переключателя в Majordomo, исполняется метод "switch". Который считывает текущее состояние "position" и передаёт в MQTT команду с инверсным состоянием.
5. Через MQTT в метод "Receive_status" приходит status и меняет свойство "position" и положение переключателя.

Вопрос в следующем:
В методе Switch, команды, с моей точки зрения, переставлены местами. По моему пониманию, при состоянии "position" "0", должна передаваться команда для перехода в состояние "1". Однако , создаётся ощущение, что, при переводе переключателя в другое положение, значение свойства "position" меняется до того как метод инициализируется. В результате при исходном значении "position" "0" (это я проверяю через X-Ray) выполняется условие для "1".
Подозреваю, что есть что-то, что я не учитываю. Подскажите, кто может.
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Публикация топика в MQTT

Сообщение nick7zmail » Ср мар 08, 2017 8:18 pm

Если вы привязываете выключатель в меню к статусу, и на основе него переключаете - логика такая, что в начале в БД передаётся статус выключателя, потом на основе него выполняется код привязанного метода...
Сначала мне тоже казалось что должно быть наоборот...потом вроде стало казаться логичным.
За это сообщение автора nick7zmail поблагодарил:
Mics78 (Ср мар 08, 2017 8:28 pm)
Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Ответить