MQTT
MQTT - очередь сообщений, использующаяся в Wiren Board. Большая часть встроенных функций контроллера (АЦП, реле, транзисторный выход, watchdog) и внешних совместимых устройств транслируются туда в виде сообщений и реагируют на управляющие сообщения оттуда. Веб-интерфейс работает также через систему сообщений MQTT - нажатие кнопки в интерфейсе вызывает отправку сообщения сообщения в MQTT-брокер, изменение показания датчика, поступившее в систему сообщений, тут же транслируется в веб-интерфейс.
Базовая информация по MQTT - http://en.wikipedia.org/wiki/MQTT. Используемый демон - брокер сообщений Mosquitto.
Краткая схема работы
Архитектура ПО Wiren Board:
<img src="https://docs.google.com/drawings/d/10EKkSP6j3nM2OYGFicYATNuu1m52a-5p6MbMN6UNQes/pub?w=480&h=360">
Специальные "драйверы" (отдельный для каждой функции контроллера и внешнего устройства) транслируют данные с устройства в очередь в виде сообщений специального формата. Сообщения из этой очереди получает веб-интерфейс и движок правил. Они же могут добавлять туда новые сообщения - например, "включить реле" после получения нажатия в интерфейсе или выполнения нужных условий в каком-нибудь правиле.
Принцип работы системы сообщений
MQTT построена по следующему принципу: есть иерархическая система "топиков" (прямо как на обычных форумах), куда клиенты могут писать сообщения, и откуда могут читать. Чтобы было удобно следить за изменениями нужного топика (например, температуры), на него можно "подписаться".
Пример сообщения
Вот пример сообщения от драйвера датчика 1-Wire (драйвер регулярно опрашивает датчик и отправляет в виде сообщений значения с него):
/devices/wb-w1/controls/28-000004a7d3f9 24.687000
Часть до пробела - название топика, после - само сообщение. Здесь:
- /devices - коренной топик для всех "устройств" - как встроенных модулей Wiren Board (реле, АЦП, ...), так и подключённых внешних,
- /wb-w1 - подтопик, который наполняется драйвером 1-Wire,
- /controls - подтопик, который есть у всех устройств - именно в него записываются все их параметры, которые меняются ("включено-выключено", значение датчика, ...),
- /28-000004a7d3f9 - непосредственно сам "контрол" - топик, куда записывается значение с датчика. Его название совпадает с адресом 1-Wire датчика (аппаратно закладывается в каждый датчик на заводе),
- 24.687000 - значение температуры. Это и есть содержание сообщения, отправленного драйвером 1-Wire в топик.
Пример подписки
Клиенты, которые хотят следить за значением температуры, "подписываются" на этот топик, и им приходят все новые сообщения - меняющиеся значения температуры. Один из таких клиентов - веб-интерфейс.
Подписаться на сообщения можно и из консоли Linux при помощи утилиты mosquitto_sub:
root@wirenboard:~# mosquitto_sub -t '/devices/wb-w1/controls/28-000004a7d3f9' -v /devices/wb-w1/controls/28-000004a7d3f9 20.312000 /devices/wb-w1/controls/28-000004a7d3f9 20.312000 /devices/wb-w1/controls/28-000004a7d3f9 20.375000
(описание утилиты смотрите здесь: http://mosquitto.org/man/mosquitto_sub-1.html)
Подписаться можно не только на один топик, но и на группу по wildcard:
root@wirenboard:~# mosquitto_sub -t '/devices/wb-w1/#' -v /devices/wb-w1/meta/name 1-wire Thermometers /devices/wb-w1/controls/28-000004a7d3f9 23.312000 /devices/wb-w1/controls/28-000004a7d3f9/meta/type temperature /devices/wb-w1/controls/28-000004a7d3f9 23.312000 /devices/wb-w1/controls/28-000004a7d3f9 23.312000
# - означает любое количество топиков. Соответственно, вывелись не только значения с "контрола" устройства, но и топики с метаданными - название драйвера устройства и тип "контрола" - temperature
Полное описание системы топиков и подписок: http://mosquitto.org/man/mqtt-7.html.
/devices/wb-gpio/controls/Relay_1/on 1
/devices/wb-gpio/controls/Relay_1 1
Отображение устройств в системе сообщений
Список поддержанных функций и устройств
Смотрите https://github.com/contactless/wb-homa-drivers
Использование данных внешними программами
Для многих языков программирования есть библиотеки MQTT.
Система правил
Вы можете написать свои правила на языке Javascript. Подробнее смотрите https://github.com/contactless/wb-rules