гаджеты и прочие приборы,  дом,  софт,  стройка

Подключение модулей 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 эксплореры…

  • edgi

    Не могу победить один момент. Все работает все ок НО. К примеру запускаю на телефоне с утра приложение а в нем кнопка в положении ON но свет на самом деле выключен и это подтверждается статусом команды проверки reachable или unreachable. Приходиться нажимать на кнопку сначало выключить(выключенный свет), а потом заново включить. Иногда состояние кнопки запоминается иногда нет не пойму от чего зависит.

    • ae

      это зависит от того обновляется или нет статус item в OpenHab, там есть опция обновлять его автоматом или нет. Однозначно без анализа логов сложно сказать, но мне кажется дело в этом. У меня такое бывает в случае если не работает обновление состояния умышленно или по ошибке.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Спасибо!

Теперь редакторы в курсе.