IoT pt.3 — MQTT-WEB bridge and simple automation with IFTTT
Интернет вещичек — часть 3 — MQTT-WEB мост и простая автоматизация с помощью IFTTT
И вновь привет. В этой статье мы соберем люстру с дистанционным управлением и заставим её включаться и выключаться по расписанию, а так же по другим, определенным нами, событиям.
Внутри корпуса люстры будут спрятан модуль ESP-12 с необходимой обвязкой, и пара электромагнитных реле. Скрипт в модуле подписан на топики, соответствующие этим реле.
На сервере работает еще один скрипт моста, связывающий WEB-запросы с некоторыми топиками MQTT (далее — бридж).
Для автоматизации событий используется сервис IFTTT, который взаимодействует с люстрой через мост.
Материалы:
Для контроллера люстры понадобятся:
- Модуль ESP-12F
- Двухсторонняя макетная плата 70x30
- Резистор 4.7k
- Линейный стабилизатор LM1117–3.3
- Конденсаторы 10uF и 0.1uF по две штуки каждого
- Монтажный провод
- Двухканальный релейный модуль с рабочим напряжением 5V
- Блок питания 5V/1A
Реле должны быть рассчитаны на напряжение 250В и ток 10А.
В качестве блока питания я использовал внутренности от старого зарядного устройства для телефона.
Между блоком питания и нашим устройством желательно включить предохранитель на ~1.5А
Схема:
К пинам P1 и P2 подключается адаптер питания на 5V.
Я использовал миниатюрный модуль понижающего DC-DC преобразователя вместо линейного стабилизатора LM1117–3.3 ради чуть лучших показателей энергопотребления.
Как оказалось, реле при переключении создают достаточно мощную помеху, которая в одном случае из десяти перезагружает контроллер. Не страшно, но иногда приходится ждать дополнительные 10 секунд пока свет всё-таки загорится. Схема с симисторами была бы избавлена от этого недостатка.
На схеме не отображены лампы люстры. Они подключаются к “горячей” половине релейного модуля к нормально разомкнутым (NO) контактам.
Код прошивки контроллера:
Процесс прошивки аналогичен описанному в конце статьи про тикерный монитор.
Код MQTT-WEB бриджа:
Я бы мог назвать этот код разными словами, но давайте поверим, что он самодокументируемый >__>
Мы можем поменять или добавить элементы в списки subscribe_topics
и publish_topics
Первый определяет топики, которые мы можем только просматривать, а второй те, в которые допускается публикация.
Так как тут используется лишь слабый намек на безопасность (в документации по Basic HTTP Server прямо написано — не используйте в продакшене), не следует добавлять в список топиков, допускающих публикацию, те которые управляют критической инфраструктурой — газовые вентили или центрифуги для обогащения урана. Иначе кто-то, кто может подслушать ваш трафик, легко саботирует ваше производство ядерного оружия. Мы будем считать, что лампочки в люстре достаточно безопасны для использования с этим кодом.
Подготовка к запуску
Чтобы всё это работало, нужно настроить и запустить MQTT брокер Mosquitto.
О том как это сделать я писал в более ранней статье.
В коде бриджа и прошивки контроллера нужно задать пользователя и пароль для подключения к брокеру в соответствующих переменных.
Переменные MQTTSRV
и MQTTPORT
определяют адрес и порт, на котором работает брокер.
WEBADDR
и WEBPORT
задают адрес и порт, на котором будет слушать наш бридж.
Желательно придумать какой-нибудь TOKEN
авторизации, который будет передаваться в HTTP заголовке Auth-Token. Например так:
$ head -n 1024 /dev/random | sha1sum
9ce1e1d92ddbcfe1cae0324f4da33bdc5dbc5be7
Использование токена всё еще не делает сервис безопасным — трафик остается не зашифрованным, и, гипотетически, может быть подслушан злоумышленниками. Это следует учитывать, если открывать доступ к бриджу из интернета.
Запуск
Когда всё готово запускаем бридж:
$ python mqtt-web-bridge.py
Проверить работу можно с помощью curl
, например:
$ curl 127.0.0.1:8000/pub/lamp0?payload=1 -H "Auth-Token: 9ce1e1d92ddbcfe1cae0324f4da33bdc5dbc5be7"
И как только начнут запрос будет обработан в консоли появится запись:
127.0.0.1 — — [09/Aug/2021 08:01:54] “GET /pub/lamp0?payload=1 HTTP/1.1” 200 -
Если люстра уже подключена, то одна из ламп должна включиться.
Автоматизация
Реализовать автоматизацию в этой системе можно разными способами. Например, для включения-отключения по расписанию использовать cron или Systemd Timers. В этом случае бридж даже не понадобится.
Сейчас мы используем IFTTT чтобы включить лампу, когда определенный смартфон приближается к дому, и соответственно, выключить лампу, когда тот отдаляется от дома.
Прежде всего потребуется установить официальное приложение из Play Market’а
В нем мы создаем новый апплет, где условием будет Location →Enter an area
А выполняемым действием Webhooks →Web request:
Чтобы web-запрос сработал бридж должен быть доступен из интернета.
Также не забываем указать в поле Additional Headers токен, который мы создали ранее Auth-Token: 9ce1e1d92ddbcfe1cae0324f4da33bdc5dbc5be7
Создание более трёх собственных апплетов требует подписки $3.40/месяц.
Аналогичным образом создается апплет для события выхода из определенной зоны.
Триггер Location можно заменить на Google Assistant →Say a phrase with a number и управлять лампами с помощью простых голосовых команд.
Заключение
WEB-MQTT бридж еще пригодится нам в будущем — с его помощью можно связать с нашей системой любое ПО или устройство, способное выполнить web-запрос.