Запуск Mosquitto та Node-RED


Я так подумав: раз в мене вже тут вийшов у попередньому пості́ такий собі лікнеп для чайників, то треба розповісти останні деталі, а саме про Mosquitto та Node-RED.

Що це все таке

MQTT — це стандарт де-факто на комунікацію між пристроями в IoT.

Брокер MQTT просто приймає від клієнтів повідомлення і відправляє їх іншим клієнтам-підпи́сникам. Це дуже схоже на IRC, тільки сервер тут зветься «брокер», а про канал кажуть «топік». Існують різні брокери, та майже завжди йдеться про Mosquitto.

Node-RED це така своєрідна платформа, яка підходить для поєднання всякої низькорі́вневої хріні з усякою іншою низькорі́вневою хрінню: MQTT, бази даних, REST API, скрипти́.

Запуск

Mosquitto в Debian та Ubuntu можна поставити просто з репозито́рію (десь у ме́не так і є), але зазвичай мені буває зручно запускати його через Docker Compose разом з Node-RED.

docker-compose.yml

version: '3'

services:
  mqtt:
    image: eclipse-mosquitto
    ports:
      - 1883:1883
    volumes:
      - ./mosquitto.conf:/mosquitto/config/mosquitto.conf:ro

  nodered:
    image: nodered/node-red
    ports:
      - 1880:1880
    volumes:
      - ./node-red-data:/data
    links:
      - mqtt

Як видно з цього файлу, тут ще треба зробити підкаталог node-red-data, у якому зберігатимуться всі нутрощі Node-RED, та конфіг Mosquitto.

mosquitto.conf

allow_anonymous true

listener 1883

Ну і все, можна запускати docker-compose up і все ма́є запусти́тися.

Приклад використання Node-RED

Node-RED після запуску з дефо́лтними налаштува́ннями доступна за адресою http://localhost:1880/ і не потребує паро́лю.

The S in IoT Stands for Security

Насправді тут можна і пароль зробити, і різні види аутентифікац́ії прикрути́ти десь на reverse proxy, але ж ми просто граємося і бли́маємо світлодіо́дом.

Знімок екрану: порожня чиста нова Node-RED

Так, що ще треба. В головному меню Node-RED (правий верхній кут, три рисочки) треба зайти в Manage palette (це типу як паке́тний менеджер) та встановити модуль node-red-dashboard. Навіть не знаю, чому він не входить до стандартного комплекту.

Нам треба додати на наш flow два вузли з групи network, а саме mqtt in та mqtt out. Також нам треба вузол switch з групи dashboard. От я їх просто перетягну́в кудись і ще не сконфігурува́в.

Знімок екрану: три несконфігуро́ваних вузла Node-RED

Двічі клацніть на вузол mqtt in. Відкриється вікно редагування. Нам треба налаштувати сервер та топік. Сервер ми ще жоден не налашто́вували, тому треба його створити; достатньо вказати хост mqtt (не 127.0.0.1, а ім’я хосту з Docker Compose) і все інше лишити як є. Топік для вхідних повідомлень на цьому вузлі має бути board01/led.

Аналогічним чином конфігуру́ємо вузол mqtt out. Тільки топік там має бути board01/led/set, а раніше сконфігуро́ваний сервер вже буде вка́зано за замовчанням.

Тепер вузол switch. Треба створити групу (стовпчик, де він має відображатися), при створенні групи треба буде створити нову dashboard tab (сторінку, де воно все буде). Якщо нічого не міняти, то зі значеннями по замо́вченню у вас створиться tab з назвою Home та група Default.

Далі трошки неочеви́дне. Треба визначити, які значення відповідають стану «увімкнено» і що вважається станом «вимкнено» (On Payload та Off Payload, відповідно). Встанові́ть для обох тип number. Значення 1 та 0, відповідно.

Наостанок, встанові́ть йому якийсь зрозумілий label. Наприклад «LED».

Знімок екрану: конфігурація вузла switch в Node-RED

Тепер лишається поєднати мишкою всі три вузли та натиснути на Deploy.

Знімок екрану: три з'єднанних вузла Node-RED

Все! Dashboard знаходиться за адресою http://127.0.0.1:1880/ui/ (теж без паро́лю).

Знімок екрану: Node-RED dashboard з одним вимикаче́м

Якщо все вийшло правильно, то цей перемикач буде вмикати-вимика́ти світлодіо́д на платі NodeMCU з попереднього поста.

Вхідні повідомлення з топіку board01/led змінюють стан перемикача. Зміна стану перемикача (будь-яка) призводить до надсилання вихідного повідомлення до топіку board01/led/set. Дещо неефекти́вно, та йой, най буде. Краще було б не надсилати до MQTT повідомлення про ту зміну стану, яка і так є реакцією на MQTT, але я поки не знаю, як це зробити просто і елегантно.

Тестування dashboard’у

Не завжди все виходить правильно з першого разу.

Для відла́годження та для експериментів з MQTT варто встановити пакет mosquitto-clients, навіть якщо у вас Mosquitto тільки в Docker’і.

Зокрема, так я дивлюся, що відбувається на всіх топіках (wildcard #):

mosquitto_sub -h 127.0.0.1 -t "#" -v

Цей mosquitto_sub працює як tail -f, для його зупинки треба Ctrl C. Коли ви натиска́єте на перемика́ч, мають з’являтися нові повідомлення з топіком board01/led/set.

А ось так я вручну́ відправля́ю повідомлення з текстом 1 на топік board01/led, імітуючи повідомлення від NodeMCU:

mosquitto_pub -t board01/led -m 1

Ну, в принципі, і все. Отака фігня.