MQTT, умный дом, ESP-8266 и Plug&Play

в 19:15, , рубрики: arduino, esp8266, Plug and Play, Разработка под Arduino, умный дом

Создание умного дома подразумевает массу разных датчиков, контролирующих обстановку в доме — датчики движения, освещения, температурные и прочие. Если «умный дом» небольшой, то все выглядит просто даже с самодельными системами на базе открытых решений (MQTT, OpenHAB и т.д.) — подключили датчик, прописали его в программе OpenHAB или HomeAssistant и начали работать. Но если датчиков много, то появляется много рутинной и неблагодарной работы по прописыванию каждого из них в системе управления.

Предлагаемое решение («костыль») позволяет обойтись минимум ручных операций именно на этом этапе. Контроллер датчиков подключается к MQTT-брокеру и сам рассказывает про свои датчики и устройства в определенном формате в специальных топиках, затем небольшой скрипт на сервере умного дома создает соответствующие этим датчикам файлы конфигурации, после чего нужно только вручную определить их в специфичные для дома группы и можно приступать к созданию сценариев управления.

Конкретно эта прошивка работает на модулях с ESP-8266 (в том числе и на Sonoff Basic Switch и Sonoff Touch Wallswitch) с P&P скриптами для OpenHAB и HomeAssistant, но сам способ выдачи plug&play информации можно использовать и в других проектах.

При подключении устройства к MQTT-брокеру создаются топики вида (в данном случае — для кнопки FLASH на ESP-8266 с серийным номером 0023CB541):

  • /myhome/PNP/ESPX-0023CB541/BUTTON/name — название/описание («FLASH button» — так будет оно отображаться в веб-интерфейсе)
  • /myhome/PNP/ESPX-0023CB541/BUTTON/type — тип переменной и направление потока данных для нее, «O:Switch» обозначает датчик, который выдает информацию, а, например, «I:Dimmer» — входящий канал диммера
  • /myhome/PNP/ESPX-0023CB541/BUTTON/groups — группы, в которых эта переменная будет фигурировать по умолчанию («Switches Builtin Buttons»)
  • /myhome/PNP/ESPX-0023CB541/BUTTON/min — минимальное значение (для числовых переменных, для кнопки оно будет пустым)
  • /myhome/PNP/ESPX-0023CB541/BUTTON/max — максимальное значение (аналогично)

Скрипт, запускающийся на сервере (по крону или вручную, после подключения устройства) — скачивает список топиков из /myhome/PNP, ищет отсутствующие в OpenHAB девайсы и создает для них конфигурационные файлы. Если файл конфигурации для такого устройства уже есть, то P&P-информация полностью игнорируется, но можно этот файл удалить, при необходимости заново создать файл для устройства с изменившимся набором датчиков.

Таким вот простым и прозрачным способом — мы избавляемся от довольно большой головной боли, если нужно подключать большое количество управляемых по сети устройств в нашем самодельном умном доме.

Немного поподробнее расскажу про собственно прошивку для ESP-8266. Ее исходные коды (и скрипты поддержки для OpenHAB и HomeAssistant) можно найти на Github (конкретно скрипты поддержки лежат здесь).

Она работает на стандартных модулях ESP-8266 (а также на Sonoff Basic Switch и Sonoff Touch Wallswitch), поддерживает обновление прошивки на лету (ArduinoOTA), а также имеет простейший веб-сервер для первоначального конфигурирования параметров WiFi-сети и задания IP-адреса MQTT-брокера.

Структура прошивки модульная и можно довольно легко добавлять свои датчики/устройства. Текущий список включает в себя:

  • Инфракрасные датчики движения и радио-датчик движения Parallax X-band motion detector (до 3 штук на модуль)
  • Датчик температуры/влажности DHT22 или аналогичный
  • Мой 4-канальный диммер, управляемый по Modbus/RS-485
  • Сонары HC-SR04 и сонары MaxBotix с последовательным выводом
  • Реле на Sonoff Basic Switch и Sonoff Touch (последний можно переключить как в режим контроля реле по кнопке, так и только через OpenHAB/HomeAssistant)
  • Встроенные ADC, светодиод и кнопка Flash (для Sonoff Touch — это сенсорная кнопка)
  • Простой термостат с двумя реле для управления вентилятором (indoor unit) и компрессором (outdoor unit)

Следует заметить, что из-за нехватки пинов на ESP-8266 модули могут конфликтовать друг с другом (например, диммер с сонаром одновременно не получится подключить, если не перераспределить пины самостоятельно).

После выбора необходимых устройств в esp-sensors.h, компиляции и прошивки — модуль переключится в режим конфигурирования — поднимет свою WiFi-сеть с именем типа «espx-0023cb541», к которой нужно подключиться (можно любым смартфоном) с паролем из того же файла, затем зайти на 192.168.4.1 и задать логин и пароль сети, а также IP-адрес брокера. Эти параметры сохранятся во флеше, так что второй раз не понадобиться этого делать. При невозможности подключиться к заданной сети в течении одной минуты — оно снова переключится в режим конфигурирования на три минуты, а потом будет повторять этот цикл до успешного подключения.

Для тех кто соберется править эту прошивку, упомяну, что каждый модуль датчиков/устройств разбит на шесть функций:

  • setup_*() — конфигурирование пинов
  • loop_*() — опрос датчика на каждом цикле программы
  • refresh_*(forceSend) — обновление информации о состоянии датчика на MQTT (200 мс по умолчанию, а каждые две секунды — принудительное обновление)
  • pnp_*() — отсылка P&P-информации
  • subscribe_*() — подписка на необходимые входящие топики
  • mqtt_*() — обработка входящих mqtt-сообщений

Эти функции нужно определить в файле своего модуля, затем добавить их вызов в соответствующие места esp-sensors.ino.

Автор: vasimv

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js