Остановимся на основных особенностях протокола MQTT.
Для обмена данными между устройствами в протоколе MQTT используется принцип «издатель-подписчик». Издатель является источником данных, подписчик – их получателем. Взаимодействие между издателями и подписчиками осуществляется через «посредника», который в MQTT называется «брокер»
Рассмотрим пример работы протокола MQTT (рис.1).
Рис. 1
Допустим, нам необходимо передать данные с датчика температуры на компьютер пользователя. В этом случае датчик температуры (P) является издателем, а компьютер (PC1) – подписчиком. Издатель отправляет данные брокеру, который ретранслирует эти данные на компьютер пользователя. Причем, эти данные также получат все, кто подписан на рассылку от датчика температуры (т.е. и компьютер PC2).
В рассмотренном примере датчик температуры (а точнее устройство, в котором он установлен) выполняет только функцию издателя. Но если это устройство имеет не только функцию измерения и контроля (датчик температуры), но и функцию управления извне (реле), то устройство является издателем и подписчиком одновременно (P/S) – через издание передаются данные от датчика, а через подписку – принимаются команды управления реле.
Брокер может быть организован как в локальной сети пользователя, так и в глобальной сети интернет. Применительно к системе домашней автоматизации, лучше создать брокера именно в локальной сети. Для Raspberry Pi наиболее оптимальным вариантом является брокер Mosquitto. Интеграция Mosquitto, а также сопутствующих пакетов в WebHomePi уже реализована и появится в ближайшем обновлении системы. Но вы можете установить брокер в текущую версию и самостоятельно. Как это сделать, я попробую сейчас рассказать. Ну и заодно рассмотрим демонстрационный контроллер, работающий по протоколу MQTT.
Для установки Mosquitto в первую очередь выполним обновление операционной системы Raspbian и установленных пакетов:
sudo apt-get update
sudo apt-get update
Импортируем ключ GPG (ключ необходим для подтверждения подлинности устанавливаемого пакета Mosquitto) :
sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
sudo rm mosquitto-repo.gpg.key
Скачиваем из репозитория и устанавливаем брокер и клиент Mosquitto:
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-stretch.list
sudo apt-get update
sudo apt-get install mosquitto
sudo apt-get install mosquitto mosquitto-clients
Далее, для взаимодействия Mosquitto со скриптами Python, необходимо установить пакет Paho:
sudo git clone https://github.com/eclipse/paho.mqtt.python.git
cd paho.mqtt.python
sudo python3 setup.py install
Выполнив установку Mosquitto и Paho, мы фактически реализовали поддержку протокола MQTT в Raspberry Pi. Далее переходим к скриптам, которые обеспечивают работу WebHomePi с этим протоколом.
Скопируйте прилагаемые файлы mqtt. html и mqtt.py соответственно в папки в html и python. Но сначала откройте в текстовом редакторе файл mqtt.py и замените в строке
client.connect("192.168.1.12", 1883, 60)
указанный IP адрес "192.168.1.12" на адрес вашего Raspberry Pi. Аналогичную замену адреса необходимо выполнять и в строках макросов управление реле.
В директорию html/logs скопируйте файл mqtt_dht22.txt
Настройку WebHomePi для работы по протоколу MQTT можно считать законченной. Переходим к «клиентской» части – контроллеру.
Устройства, предназначенные для работы по протоколу MQTT, вне зависимости от своего статуса (издатель, подписчик, издатель/подписчик) должны иметь сетевой интерфейс Ethernet или Wi-Fi. Поэтому, наиболее оптимальным вариантом для разработки таких устройств являются популярные модули ESP8266. Они позволяют создать сегмент беспроводных контроллеров, которые могут рассматриваться как альтернатива существующему в WebHomePi радиомодулю и радиодатчикам. Причем, альтернатива довольно серьезная.
В качестве примера рассмотрим тестовое устройство, построенное на ESP8266 и имеющее функцию измерения температуры и влажности, а также функцию управления электромагнитным реле. Это позволит продемонстрировать работу протокола MQTT, когда данное устройство выступает в роли и издателя, и подписчика. Подключение датчика температуры DHT22 и электромагнитного реле к портам модуля ESP8266, приведено на рис.2
Рис. 2
Программирование модуля ESP8266 выполняется в среде Arduino IDE. Для работы модуля в вашей локальной сети, в скетч MQTT_DHT_GPIO.ino необходимо внести следующие изменения:
const char *ssid = "Network" – имя точки доступа (роутера)
const char *pass = "11111111"- пароль точки доступа
const char *mqtt_server = "192.168.1.12" – IP адрес сервера MQTT (Raspberry Pi)
Загружаем отредактированный и скомпилированный скетч в ESP8266, подключаем датчик DHT22 и реле в соответствии со схемой на рис.2 и можно приступать к тестированию функции контроля и управления через протокол MQTT. После открытия страницы mqtt. html в web-браузере будут отображаться показания температуры и влажности, а кнопками ON/OFF можно управлять реле. Обратите внимание, что в качестве исполнительного элемента на схеме показан релейный модуль с транзисторным ключом без оптронной развязки. Если вы используете релейный модуль с оптронной развязкой, то управляющие сигналы для него необходимо инвертировать, т.к. в таком модуле, как правило, включение реле производится низким уровнем, а выключение, соответственно, высоким уровнем.
Также на web-страницу выводится график изменения температуры и влажности (рис.3)
Рис. 3
Данные температуры и влажности обновляются на web-странице приблизительно каждые 20 секунд. Записывать с такой высокой дискретностью данные в лог-файл и строить по ним график температуры и влажности, большого смысла нет, поэтому данные записываются приблизительно каждые 15 минут. Впрочем, если требуется иная дискретность записи, достаточно в скрипте mqtt.py изменить значение константы count.
Подводя итог применению протокола MQTT в системе домашней автоматики необходимо отметить следующее. Использование MQTT позволяет максимально упростить построение системы домашней автоматизации. Например, все функции контроля и управления можно возложить на сегмент распределенных контроллеров, построенных на ESP8266 , и Raspberry Pi в этом случае будет использоваться только в качестве web-сервера и брокера MQTT (рис.4)
Рис. 4
Реализуя подобную концепцию построения системы домашней автоматизации, вам не придется прокладывать дополнительные коммуникации для организации каналов связи. Достаточно подключить к роутеру домашней сети Raspberry Pi (через кабель или Wi-Fi), установить в нужных местах контроллеры, которые будут подключаться через Wi-Fi, и, в принципе, инфраструктура сети готова. А учитывая, что в настоящее время для модулей ESP8266 написано огромное количество библиотек, вы без проблем сможете создавать беспроводные контроллеры с различным функционалом под свои требования и цели.
Вместе с тем, при всей безупречности построения системы по такому принципу, справедливости ради отметим и некоторые недостатки. Во-первых, появляется дополнительный «буфер» между Raspberry Pi и контроллерами (датчиками, исполнительными устройствами) – роутер (точка доступа Wi-Fi), в случае отключения или выхода из строя которого, работа системы будет нарушена. Это в очередной раз подтверждает мнение, что в системах домашней автоматизации каждый контроллер должен быть самодостаточным устройством и не зависеть от работоспособности центрального модуля.
Второй момент – если контроллеров очень много, то домашняя сеть значительно разрастается, т.к. каждому модулю ESP8266 нужно выделить IP-адрес. Причем, это IP-адрес очень желательно сделать статическим (разумеется, в рамках локальной сети). Следовательно, пользователю придется немного позаниматься и администрированием сети, по крайней мере на первоначальном этапе наладки системы.
И третий момент – это применение «беспроводного» метода передачи данных в сети. Конечно, Wi-Fi это актуально и современно, не нужно прокладывать линии связи, но для дома в первую очередь нужна надежность. А надежнее «проводных» каналов пока еще ничего не придумано.
Тем не менее, преимуществ у протокола MQTT значительно больше, чем недостатков, что и подтверждает его широкое использование в сфере IoT (интернета вещей).
В завершение небольшое видео по тестированию контроллера (для контроля управления вместо реле используется светодиод):
Архив к статье (скрипты, скетч для ESP8266)