Страница 1 из 2

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

Добавлено: Пн мар 06, 2017 10:06 pm
Mics78
Здравствуйте, коллеги!
Возможно, ответ очевиден, но я, перерыв форум, его не нашёл. Буду благодарен за помощь.
Подскажите, пожалуйста, фрагмент кода, который позволит опубликовать значение в топик сервера 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(); - тоже не работает


Что я делаю не так?

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

Добавлено: Пн мар 06, 2017 10:11 pm
DimSun75
Модуле MQTT создаете руками новый топик и привязываете его к какому-нибудь свойству, какого-нибудь объекта. Меняете свойство, оно публикуется в топик

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

Добавлено: Пн мар 06, 2017 10:19 pm
Mics78
DimSun75 писал(а):Модуле MQTT создаете руками новый топик и привязываете его к какому-нибудь свойству, какого-нибудь объекта. Меняете свойство, оно публикуется в топик
Спасибо. Правильно ли я понимаю, что произвольно из PHP кода это сделать нельзя?

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

Добавлено: Пн мар 06, 2017 10:20 pm
DimSun75
Mics78 писал(а):
DimSun75 писал(а):Модуле MQTT создаете руками новый топик и привязываете его к какому-нибудь свойству, какого-нибудь объекта. Меняете свойство, оно публикуется в топик
Спасибо. Правильно ли я понимаю, что произвольно из PHP кода это сделать нельзя?
Можно, но зачем? Правильнее, когда все делается на уровне системы.

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

Добавлено: Пн мар 06, 2017 10:32 pm
Mics78
Я пока совсем не знаю эту систему. На это нужно время.
А для отладки того, что я сейчас делаю, мне надо формировать сложное значение, публикуемое в топике. Как это сделать средствами majordomo я не знаю.

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

Добавлено: Пн мар 06, 2017 10:38 pm
DimSun75
Mics78 писал(а):Я пока совсем не знаю эту систему. На это нужно время.
А для отладки того, что я сейчас делаю, мне надо формировать сложное значение, публикуемое в топике. Как это сделать средствами majordomo я не знаю.
Создайте какой-нибудь класс, в него добавьте свойство. Создайте объект этого класса. Далее, как я писал привязываете это свойство к топику mqtt. Далее в скрипте просто setGlobal("Object.Property",$value); Проще некуда.

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

Добавлено: Пн мар 06, 2017 10:44 pm
Mics78
Спасибо. Попробую.

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

Добавлено: Вт мар 07, 2017 6:12 am
nick7zmail
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 (или файл вообще отсутствует)...по логам то смотрите, там скорее всего эта ошибка вываливается.

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

Добавлено: Ср мар 08, 2017 7:51 pm
Mics78
Спасибо. Согласен, что правильнее делать так как задумано.
Файл есть, ошибок нет. Но не работает. Впрочем, вняв совету я получил тот результат, который хотел.

Сейчас вопрос встал несколько иначе. Я, для экспериментов, сейас использую 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".
Подозреваю, что есть что-то, что я не учитываю. Подскажите, кто может.

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

Добавлено: Ср мар 08, 2017 8:18 pm
nick7zmail
Если вы привязываете выключатель в меню к статусу, и на основе него переключаете - логика такая, что в начале в БД передаётся статус выключателя, потом на основе него выполняется код привязанного метода...
Сначала мне тоже казалось что должно быть наоборот...потом вроде стало казаться логичным.