ZmiterIv

 
<<< Back

Костыль для RGB подсветки на базе модуля ESPHome.

Потянуло меня было на эксперименты, поставил HomeAssistant, NodeRed, EspHome... поигрался и забросил... остались несколько прошитых модулей на базе ESP8266 под EspHOME. А когда возникла необходимость сделать очередную светодиодную подсветку, решил использовать в Majordomo эти, валяющиеся без дела модули, прямо с прошивкой EspHOME... Полезность данной статьи - в настройке методов для интеграции штатного колорпикера ПУ RGB с управлением модулем EspHOME по MQTT.

В данной статье я не буду рассматривать как аппаратную часть устройства (о ней есть моя другая статья со всеми подробностям...), так и саму систему ESP-Home. Далее в основном настройка Majordomo. Пишу подробно и с картинками, чтобы не смотреть "как баран на новые ворота" раз в год, решив что-то поменять в системе, а открыть свою же инструкцию и посмотреть...))

cp

Итак, для того, чтобы наш модуль на базе ESPHome скоммуницировать с Majordomo, нужно активировать в прошивке модуля ESP-Home (перед компиляцией) работу по протоколу MQTT, указав адрес брокера (в моем случае это сервер Majordomo), следующей директивой:

mqtt:
  broker: 192.168.1.199

После загрузки модуля в топиках MQTT Majordomo появятся соответствующие записи:

mqtt1

Затем в классе SRGB необходимо создать дополнительное свойство:
state (Свойство будет хранить(передавать) команду для RGB модуля ESPHome. Связано с MQTT топиком ...rgb_light/command)

SRGB_Prop

Далее возвращаемся к MQTT, заходим в топик rgb1/light/rgb_light/state и в поле "Путь(write):" и создаем командный топик:
rgb1/light/rgb_light/command

mqtt2

Теперь нужно создать Простое Устройство (ПУ) для этого модуля:
Находим только что созданный топик, заходим в него и напротив надписи "Устройство" нажимаем ссылку "Добавить" и заполняем необходимые поля.

PU1

После добавления ПУ так же автоматически создастся соответствующий объект с необходимыми свойствами. Теперь нужно привязать свойство state, выбрав его из выпадающего списка:

mqtt3

Теперь нужно отредактировать соответствующие методы класса 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);

metod

Для выключения, редактируем метод turnOff:

/* begin injection of {SDevices} */
require(DIR_MODULES.'devices/SRGB_turnOff.php');
/* end injection of {SDevices} */

//Передаем команду в свойство объекта, связанное с командным топиком MQTT:
$this->setProperty('state', '{"state": "OFF"}');

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');
}

Discuss (0) (4)

See also:
2022-04-15 Ночная подсветка по датчику движения
2019-04-22 Мониторинг логов в линукс на примере модуля Noolite.
2019-03-29 RGB подсветка своими руками.

Минск, Беларусь

На форуме: Дмитрий Иванов

Web-site URL:
http://blogid.by