MQTT, умный дом, ESP-8266 и Plug&Play
Создание умного дома подразумевает массу разных датчиков, контролирующих обстановку в доме — датчики движения, освещения, температурные и прочие. Если «умный дом» небольшой, то все выглядит просто даже с самодельными системами на базе открытых решений (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.