IoT pt.3 — MQTT-WEB bridge and simple automation with IFTTT

m0nochr0me
4 min readAug 10, 2021

--

Ξ

Интернет вещичек — часть 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-запрос.

--

--

m0nochr0me
m0nochr0me

Written by m0nochr0me

Поделки из шишек и жёлудей

No responses yet