Подключение модулей Sonoff к OpenHAB через MQTT
Для автоматизации дома я использую разные стандарты и подсистемы. Наиболее критичная — отопление управляется через KNX, остальные системы шлюзуюся в проводной Ethernet, где в том числе подаётся PoE питание от инвертора с парой 100Ач аккумуляторов. Однако, проводов не всегда хватает и появляются новые «хотелки» особенно в плане управления освещением, которое наименее критично, но всё же хочется иметь на нём некую логику управления. В частности, возникают точки куда просто совсем нет витой пары, например, беседка во дворе, но гирлянды там хочется включать не каждый день, например. Для этих целей я решил применить WiFi контроллеры Sonoff так как было понятно как их подружить с OpenHAB, который у меня отвечает за сценарии управления освещением в частности и служит платформой интеграции разных систем и стандартов. Сразу скажу, что у меня развёрнута WiFi сеть из 5 точек доступа бесшовным переключением и с них раздаётся 3 совсем разных сети. Одна из них DMZ, другая гостевая и третья внутренняя в двух диапазонах и так как все быстрые устройства живут в домашней сети на 5ГГц, то сеть 2,4 как раз годится для неспешных устройств и никаких гостей там не бывает. Ровно это стечение исходных данных подтолкнуло меня не париться с очередным протоколом (рассматривался ZigBee), а использовать готовую отлично работающую и всё покрывающую инфраструктуру.
Прошивка модулей
Для прошивки потребуется:
- Скачать саму прошивку Sonoff/Tasmota отсюда, внимательно почитав что там написано;
- USB-serial адаптер с возможностью выбора напряжения 3,3 Вольта (это важно ибо пишут, что подача 5 Вольт может быть фатальна) и выводом на провода. Моём случае это BTE13-009 купленный когда-то давно на Ali;
- ПО для прошивки контроллера;
- На всякий случай терминальная программа для доступа к консоли (для MacOS я использовал вот эту, но есть много иных). Так же через консоль можно поменять часовую зону и установить время отличное от NTP (установка по умолчанию) команда «timezone HH:MM». Впрочем, команды можно и иначе передавать контроллерам https://github.com/arendst/Sonoff-Tasmota/wiki/Commands.
Если на плате нет разъёма, то надо его припаять. и подключать согласно разметке на плате. В частности на контроллерах TH10 разъёма нет, а вот на 4CH он есть сразу с завода.
GND подключаем к GND, VCC3,3 к VCC3,3, а вот TX к RX и наоборот RX к ТX, с последними может быть путаница, но их переключение безболезненно. После подачи питания контроллеры Sonoff начинают равномерно мигать синим светодиодом. Полезно после включения проверить работает ли управление кнопкой по звуку реле и индикации красного светодиода.
- Запускаем программу NodeMCU, в ней указываем нужный порт USB-Serial, скорость 115200, режим прошивки DOUT (годится только он), включаем стирание flash-памяти.
- Отключаем питание, например, выдернув один проводок;
- Нажимаем кнопку (любую);
- Подключаем питание;
- Отпускаем кнопку;
- Запускаем процесс прошивки в программе.
Использование кнопок в прошивке описано тут.
Настройка модулей
После успешной прошивки устройство нужно перезагрузить выключением и включение питания (достаточно один проводок дёрнуть и обратно аккуратно воткнуть). Далее подключиться к контроллеру через WiFi сеть с названием sonoff-NNNN без пароля по адресу http://192.168.4.1. В меню настроек выбрать поиск сетей и выбрать нужную сеть для подключения или прописать SSID на память. Указать пароль для доступа к сети. После этого устройство перезагрузится и на консоль сообщит какой IP-адрес оно получило от DHCP-сервера. Можно смотреть на консоль, а можно найти устройство в списке выданных адресов DHCP-сервера по упоминанию Sonoff в имени хоста. Ну и можно сканером его найти. Ну и далее просто подключиться опять же к контроллеру броузером. переключаем в нём в разделе Modules нужный тип контроллера и проверим работоспособность кнопок что б быть уверенным, что всё работает штатно. Из замеченных глюков одним разом выбрать модель контроллера и подключенного датчика у меня не получилось, то есть модель датчика не запомнилась просто. Если есть внешний датчик, то надо проверить его после подключения. Данные с него отображаются вместе с индикацией переключателя.
Настройка MQTT
Сервер
По идее в OpenHAB есть свой read-only MQTT брокер и можно им ограничиться, но я решил поставить отдельный сервер на ту же машинку, где крутится OpenHAB (в моём случае это PasberyPi в некоем специальном исполнении. В качестве сервер а я использовал Mosquitto от Eclipse, который весьма популярен и есть в частности в репозитории raspbian. В комплекте с сервером идут и утилиты для тестирования как в качестве клиента, так и в качестве подписчика. Сами настройки сервер минимальны, разве что надо определиться с тем будет доступ по паролю или нет. Если совсем не хочется делать сеть локальной и автономной, то, конечно, же есть публичные сервисы и даже совершенно бесплатные, но лично я бы их использовал только для разработки и отладки, но никак не для боевого применения, конечно.
Контроллер
В конфигурации в разделе MQTT нужно указать параметры куда и как подключаться (я использую авторизованный доступ, так что, прописываю логин и пароль, но, к сожалению, шифрование тут не поддерживается, так что, можно и без пароля, конечно ибо по сути всё равно вся безопасность на уровне пароля от WiFi-сети получается ну и степенью изолированности сети определяется, конечно.
Так же полезно переименовать название MQTT-клиента (Client) и MQTT-топика (Topic) что бы идентифицировать устройство. Как вариант использование последних 6 цифр MAC-адреса, но можно пойти своим путём, конечно.
Результат я контролирую на консоли MQTT-сервера.
Конфигурация OpenHAB 2.4
Для удобства я делаю предварительные настройки в PaperUI, а правила и sitemap уже редактирую вручную.
Первым делом надо добавить AddOnns -> Bindings -> MQTT Binding. После этого нужно вручную добавить две сущности (дословно things переводится как «вещь», но мне кажется что «сущность» более точно отражает смысл в данном контексте): MQTT Broker и Generic MQTT Things. При добавлении брокера нужно указать адрес сервера, опционально раздел (вкладку) отображения (Location) для удобства и если необходимо, то параметры безопасности (логин пароль или сертификат). При настройке Generic MQTT Things нужно просто выбрать брокер и опционально раздел.
В Configuration -> Things найти Generic MQTT Things и там далее добавлять каналы (Channels) и внитри них уже компоненты (items). Название сущности (things) тут логично указывать своё. По задумке OpenHAB, точне SmartHome от Eclipse, сущность соответсвует физическому объекту, а каналы его свойствам, насколько я понимаю эти абстракции.
При создании Channels нужно указывать :
- Тип канала, например, выключатель или число;
- ID канала (произвольный, но лучше читаемый);
- Название канала (label) для отображения;
- MQTT топик для получения состояния можно сразу с шаблоном JSONPATH для выделения значений из JSON-ответов, например, «stat/sonoff-490666/RESULT:state:JSONPATH($.POWER3)«;
- MQTT топик для отправки команд (я встречал примеры с явным указанием, что ON надо транслировать в ON, но и без них прекрасно работает), например, «cmnd/sonoff-492698/POWER3«;
- не забыть нажать кнопку SAVE!!!
В случае если датчик выдаёт два или больше полезных значений, то под каждое нужно создавать канал в котором указывать JSONPATH для выделения искомого значения из JSON. Например, это температура «tele/sonoff-3314C0/SENSOR:state:JSONPATH:$.AM2301.Temperature«, а это влажность «tele/sonoff-3314C0/SENSOR:state:JSONPATH:$.AM2301.Humidity» с того же датчика. Посмотреть что сообщает клиент брокеру можно используя вот такую утилиту, которая ставится вместе с сервером, в данном случае с Mosquitto: «mosquitto_sub -h 192.168.51.7 -t +/sonoff-3314C0/# -v» тут вот контроллер присылал примерно такое: «tele/sonoff-3314C0/SENSOR {«Time»:»2019-04-22T13:04:19″,»AM2301″:{«Temperature»:26.5,»Humidity»:42.2},»TempUnit»:»C»}«. Если есть сомнения в JSONPATH шаблонах, то их легко проверить на сайте https://jsonpath.curiousconcept.com/ где указывается как исходный JSON, шаблон и получаемый результат. Важное замечание: OpenHAB обрабатывает значения по мере их поступления, то есть после того как вы написали правило нужно ещё и подождать пока контроллер отправит сообщение брокеру с данными!
После создания каналов нужно к каждому из них привязать items. Для этого нужно нажать на синий кружок если у него центр или на скобки вверх-вниз после иконки корзины справа в строке канала. Профиль указываем по умолчанию, а в меню «Please select the item to link:» выбираем » + Create new item…» и далее выбираем имя items (я делаю читаемые имена так как sitemap редактирую в текстовом виде), Важно указать отображаемое название чтобы потом не путаться, у и тип тут тоже указывается. По идее можно к одному каналу создавать несколько items с разными типами, но на мой взгляд удобнее и логичнее создавать новые каналы если много переменных.
После создания Item в разделе Control PaperUI появляется панелька соответствующая сущности со всеми созданными в ней компонентами. Где их можно уже наблюдать или управлять реле.
На этом настройка закончена и можно оформлять внешний вид и сценарии управления.
6 комментариев
slava
Чтобы JSONPATH заработало нужно дополнительно установить JsonPath Transformation Service (в Add-on — Transformations).
Evgeniy
Добрый день. Имеется «Sonoff TH» с датчиком «SI7021», «JsonPath Transformation» установлен.
MQTT брокер получает такую телеметрию
«tele/TH/SENSOR» «{«Time»:»2020-02-17T17:29:45″,»SI7021″:{«Temperature»:22.2,»Humidity»:18.8},»TempUnit»:»C»}».
Канал создаю с числом, ввожу в «MQTT State Topic» это «tele/TH/SENSOR:state:JSONPATH:$.SI7021.Temperature»,
но ни чего не работает. Во вкладке»SHOW MORE» есть поле для в вода «Incoming Value Transformations» туда надо что-то вводить?
Хотел проверить «JSONPATH шаблон», но не могу понять что там нужно вводить. Перерыл кучу информации, но скорей всего не там искал.
Решил написать здесь, может кто подскажет, что я делаю не так или где найти информацию в этом направлении.
ae
У меня MQTT State Topic: tele/sonoff-32E290/SENSOR и Incoming Value Transformations: JSONPATH:$.AM2301.Temperature
Насколько я вижу (хотя JSON битый получился в тексте) только название датчика поменять и должно работать… для отладки можно использовать какой-нибудь JSON Viewer (есть онлайн, если программы), который покажет дерево и тогда легко будет понять где топик, где значение… опять же есть так же MQTT эксплореры…
Evgeniy
Спасибо большое! Заменил название датчика, теперь всё работает.
edgi
Не могу победить один момент. Все работает все ок НО. К примеру запускаю на телефоне с утра приложение а в нем кнопка в положении ON но свет на самом деле выключен и это подтверждается статусом команды проверки reachable или unreachable. Приходиться нажимать на кнопку сначало выключить(выключенный свет), а потом заново включить. Иногда состояние кнопки запоминается иногда нет не пойму от чего зависит.
ae
это зависит от того обновляется или нет статус item в OpenHab, там есть опция обновлять его автоматом или нет. Однозначно без анализа логов сложно сказать, но мне кажется дело в этом. У меня такое бывает в случае если не работает обновление состояния умышленно или по ошибке.