Потянуло меня было на эксперименты, поставил HomeAssistant, NodeRed, EspHome... поигрался и забросил... остались несколько прошитых модулей на базе ESP8266 под EspHOME. А когда возникла необходимость сделать очередную светодиодную подсветку, решил использовать в Majordomo эти, валяющиеся без дела модули, прямо с прошивкой EspHOME... Полезность данной статьи - в настройке методов для интеграции штатного колорпикера ПУ RGB с управлением модулем EspHOME по MQTT.
В данной статье я не буду рассматривать как аппаратную часть устройства (о ней есть моя другая статья со всеми подробностям...), так и саму систему ESP-Home. Далее в основном настройка Majordomo. Пишу подробно и с картинками, чтобы не смотреть "как баран на новые ворота" раз в год, решив что-то поменять в системе, а открыть свою же инструкцию и посмотреть...))
Итак, для того, чтобы наш модуль на базе ESPHome скоммуницировать с Majordomo, нужно активировать в прошивке модуля ESP-Home (перед компиляцией) работу по протоколу MQTT, указав адрес брокера (в моем случае это сервер Majordomo), следующей директивой:
mqtt:
broker: 192.168.1.199
После загрузки модуля в топиках MQTT Majordomo появятся соответствующие записи:
Затем в классе SRGB необходимо создать дополнительное свойство:
state (Свойство будет хранить(передавать) команду для RGB модуля ESPHome. Связано с MQTT топиком ...rgb_light/command)
Далее возвращаемся к MQTT, заходим в топик rgb1/light/rgb_light/state и в поле "Путь(write):" и создаем командный топик:
rgb1/light/rgb_light/command
Теперь нужно создать Простое Устройство (ПУ) для этого модуля:
Находим только что созданный топик, заходим в него и напротив надписи "Устройство" нажимаем ссылку "Добавить" и заполняем необходимые поля.
После добавления ПУ так же автоматически создастся соответствующий объект с необходимыми свойствами. Теперь нужно привязать свойство state, выбрав его из выпадающего списка:
Теперь нужно отредактировать соответствующие методы класса SRGB:
Метод turnOn класса SDevices/SControllers/SRGB:
/* begin injection of {SDevices} */
require(DIR_MODULES.'devices/SRGB_turnOn.php');
/* end injection of {SDevices} */
//считываем в переменную цвет в формате HEX:
$color=$this->getProperty("color");
//переводим HEX в RGB
$color=preg_replace('/^#/','',$color);
$color=hexdec($color);
$red=round(($color >> 16 & 0xFF));
$green=round(($color >> 8 & 0xFF));
$blue=round(($color & 0xFF));
//формируем строку с цветом в формате MQTT ESPHome:
$colors = '{"r": '.$red.',"g": '.$green.',"b": '.$blue.'}';
//say($colors);
//собираем команду:
$command = '{"state": "ON", "color":'.$colors.'}';
say($command);
//Передаем команду в свойство объекта, связанное с командным топиком MQTT:
$this->setProperty('state', $command);
Для выключения, редактируем метод turnOff:
/* begin injection of {SDevices} */
require(DIR_MODULES.'devices/SRGB_turnOff.php');
/* end injection of {SDevices} */
//Передаем команду в свойство объекта, связанное с командным топиком MQTT:
$this->setProperty('state', '{"state": "OFF"}');
Остался не освещенный вопрос регулировки яркости. Нужно в интерфейс добавить слайдер и в командном топике вместе с другими командами передавать информацию о яркости, типа:
{"state": "ON","brightness": 90, "color": {"r": 0,"g": 255,"b": 0}}
Я, например, ещё использую сценарии:
setGlobal('mqttRgb02.state','{"state": "ON","brightness": 90, "color": {"r": 0,"g": 255,"b": 0}}');
setGlobal('mqttRgb02.status',1);
Ну и еще раз про 1 нюанс работы с этими методами, который я уже упоминал в редыдущей статье:
В общем в метод SRGB_setColor.php то ли ошибка закралась, то ли я не разобрался как его правильно «готовить», но так, как мне надо метод больше не работал. Т.е. если раньше, открывая цветовое поле элемента «выбор цвета» (colorPicker) я мог выбрать нужный мне цвет, нажать ОК и цвет подсветки сразу менялся на нужный, то сейчас мне ещё необходимо включить/выключить устройство, что бы передались данные. Т.е. раньше метод TurnOn вызывался после изменения цвета, то сейчас его надо вызывать специально выключая и включая объект. Сравнивая методы старый и после обновления я нашёл различия. Приведу листинг рабочего метода (метод расположен в /var/www/modules/devices/SRGB_setColor.php (Линукс):
<?php
if (!$params['color']) return;
$color=strtolower($params['color']);
$color=preg_replace('/^#/','',$color);
$transform=array(
'red'=>'ff0000',
'green'=>'00ff00',
'blue'=>'0000ff',
'white'=>'ffffff'
);
if (isset($transform[$color])) {
$color=$transform[$color];
}
if ($color == '000000') {
$this->callMethodSafe('turnOff');
} else {
$this->setProperty('color',$color);
$this->setProperty('colorSaved',$color);
$this->callMethodSafe('turnOn');
}