Все изображения кликабельны
MQTT расшифровывается, как Message Queue Telemetry Transport - упрощённый сетевой протокол обмена данными поверх TCP/IP через порт 1883 (если используется шифрование то 8883/SSL). Протокол ориентированный для обмена сообщениями между устройствами по принципу издатель-подписчик. По сути этот протокол - icq чатик для железок
MQTT имеет клиент-серверную архитектуру - обмен сообщениями происходит через центральный сервер, который называется брокером. Весь обмен сообщениями происходит через сервер, напрямую два клиента общаться не могут.
Клиенты бывают двух типов:
* Издатели (Publisher) - те которые публикуют данные на брокере. Например датчики, которые публикуют свои значения.
* Подписчики (Subscriber) - те клиенты которые считывают данные с брокера. Например устройство - термостат, он считывает данные опубликованные датчиком температуры и в зависимости от этих значений включает/выключает обогрев.
Для идентификации сущностей в MQTT используются
топики. Они имеют древовидную структуру, похожую на файловую систему в UNIX. Это удобный механизм, позволяющий называть сущности в человекопонятном виде.
Пример - датчики температуры, разнесенные по разным комнатам, публикуют значение температуры каждый в свой отдельный топик:
# Датчик температуры на кухне
home/kitchen/temperature
# Датчик температуры в спальне
home/sleeping-room/temperature
# Датчик температуры в серверной
home/server-room/temperature
В MQTT так же предусмотрена аутентификация клиентов. Клиенты могут иметь следующие свойства:
ClientId - уникальный идентификатор клиента, уникальный для каждого клиента. С версии MQTT 3.1.1 можно оставлять поле ClientId пустым. В этом случае не будет сохраняться состояния подключения.
Username - логин, может быть не уникальным. Например, группа клиентов может авторизовываться с одним и тем же логином/паролем.
Password - пароль, может посылаться только вместе с полем Username, при этом Username может передаваться без поля Password. Максимум 65535 байт. Имя и пароль передаются в открытом виде!
Вроде в теории все просто. Давайте установим брокер на малинку.
Установка MQTT брокера на Raspberry Pi.1. Первым делом обновляем систему:
sudo apt-get update && sudo apt-get upgrade
По слухам библиотеки Raspberry Pi (Orange Pi) не содержат последнюю версию Mosquitto software. Поэтому перед установкой нам нужно будет обновить библиотеки.
Я поискал нужный пакет в репозитории, потом обновил его, потом снова поискал. Версия пакетов не изменилась, так что может и не стоит париться с этим обновлением, тем более MQTT version 3.1/3.1.1 похоже уже несколько лет последняя:
Но если вы будете обновлять, то вот инструкция:
Добавляем ключ и обновляем репозиторий:
sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
sudo apt-get update
2. Устанавливаем MQTT брокер и MQTT клиент:
sudo apt-get install mosquitto mosquitto-clients
После установки mosquitto сервер будет автоматически запускаться при загрузке системы.
3. Создаем пользователя MQTT:
sudo mosquitto_passwd -c /etc/mosquitto/pwfile <username>
где вместо
подставляем логин (Username), два раза вводим пароль пользователя
4. Добавляем правила подключения к брокеру MQTT
Создаем локальный конфигурационный файл Mosquitto:
sudo nano /etc/mosquitto/conf.d/default.conf
В него добавляем 2 строчки:
allow_anonymous false
password_file /etc/mosquitto/pwfile
Сохраняем и закрываем файл - нажимаем ctrl+x, выбираем Y и нажимает Enter.
Таким образом мы прописали в каком файле хранятся пользователи и пароли для подключения к нашему MQTT брокеру, а также мы запретили подключение к серверу всем пользователям без логина и пароля. Этот файл, благодаря строке
include_dir /etc/mosquitto/conf.d в основном конфигурационном файле
/etc/mosquitto/mosquitto.conf, подтянется когда служба будет запускаться.
3. Останавливаем сервер для настройки
После установки сервер MQTT сразу запускается. Нам необходимо оставновить его, чтобы произвести последующую настройку.
sudo /etc/init.d/mosquitto stop
4. Настройка основного конфигурационного файла
sudo nano /etc/mosquitto/mosquitto.conf
и заменяем его содержимое на следующее:
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_dest topic
log_type error
log_type warning
log_type notice
log_type information
connection_messages true
log_timestamp true
include_dir /etc/mosquitto/conf.d
Сохраняем, закрываем программу nano и выходим обратно в терминал (ctrl+o, Enter, ctrl+x).
5. Запускаем сервер MQTT
sudo /etc/init.d/mosquitto start
6. Перезапускаем малинку
sudo reboot
Проверим работу брокера.Статус сервера:
sudo service mosquitto status
service mosquitto statusДля наблюдения за MQTT топиками воспользуемся приложением Chrome - MQTTLens. Настраиваем подключение - указываем имя, ip адресс брокера (малинки), логин и пароль для подключения, которые мы задали при настройке Mosquitto:
Если ошибки не выдал, значит служба брокера работает и настройки мы задали правильно.
MQTTLens Настройка Tasmota RF bridge для работы с MQTT брокером.Заходим браузером на ip адрес Sonoff RF bridge с альтернативной прошивкой Tasmota. Нажимаем
Configuration:
Sonoff RF bridge с альтернативной прошивкой TasmotaДалее
Configure MQTT:
Sonoff RF bridge с альтернативной прошивкой TasmotaДалее настраиваем подключение к MQTT брокеру - указываем ip адрес сервера (в нашем случае это Raspberry Pi с установленным ранее брокером), логин и пароль для подключения и топик - мы для теста создадим топик с именем устройства -
rfbridge2 и разделом для принятых кодов
received-rfkeys:
Теперь в MQTTLens подписываемся на все топики - для этого в поле
Subscribe вводим
# и нажимаем кнопку
SUBSCRIBE:
Теперь берем совместимый с приемником Sonoff пульт из прошлой
темы и нажимаем на нем кнопку. Сверяем код, полученный мостом, в консоли RF bridge на Tasmota:
Консоль Sonoff RF bridge с альтернативной прошивкой Tasmotaс кодом опубликованном в топике MQTT брокера:
Коды совпадают, значит вся связка работает корректно и осталось настроить Domoticz.
Настройка MQTT клиента на Domoticz.Почитав Wiki Domoticz, мы внезапно узнаем, что наша любимая система умного дома работает только с двумя топиками
domoticz\in и
domoticz\out. Как же так? Т.е. все датчики должны публиковать свои значения только в один топик? Это же получится полный бардак в показаниях...
Я реально снова задумался о переходе на Home Assistant, там ведь таких проблем нет - он работает с топиками индивидуально.
Но раз мы пока никуда не уходим, придется нам мастерить костыли на той системе, которая уже у нас работает.
Значит сначала идем на Sonoff RF bridge 433МГц и перенастраиваем клиента-издателя в соответствии с требованиями Domoticz. По сути нам нужно поменять только значение двух полей:
Проверяем:
Теперь настраиваем Domoticz. Идем в
Настройки - Оборудование. Тип =
MQTT Client Gateway with LAN interface, настраиваем адрес =
localhost (у нас же брокер работает на той же Raspberry Pi, что и Domoticz), порт = 1883, логин/пароль и топик исходящих сообщений (
out):
Если все настроено верно и в логах Dz нет ошибок, то с помощью клиента-подписчика можно заметить как в топик Domoticz\out начали падать сообщения от всех датчиков умного дома:
А теперь начинаются костыли.
Создаем в Домотикз датчик
Dummy - идем
Настройки - Оборудование - Создать виртуальный датчик (у Вас уже должна быть добавлена такая группа оборудования, если у вас ее нет - то сначала создаете ее (имя =
VirtualSwitches, тип =
Dummy (Does nothing, use for virtual switches only)):
Смотрим и запоминаем его idx в разделе
Настройки - Устройства:
Потом идем в
Domoticz - Переключатели, ищем наш переключатель и меняем тип на
Push On Button:
Теперь снова идем на Sonoff RF bridge с Tasmoto в раздел
Configuration - Configure Domoticz и везде указываем idx этого виртуального датчика:
Теперь нам нужен код кнопки пульта, который передается в домотикз посредствам MQTT.
Идем в раздел domoticz
Настройка - Журнал, нажимаем кнопку на пульте и смотрим запись в логе:
2019-07-27 01:11:46.901 MQTT: Topic: domoticz/in,
Message: {"idx":118,"nvalue":0,"svalue":"23761","Battery":200,"RSSI":10}
как мы видим idx указан нашего датчика - значит это данные присланные sonoff rf bridge, нас интересует значение
svalue, запоминаем его.
Дальше нам придется ваять костыль в разделе
Настройка - Дополнительно - События. Создаем новый скрипт с именем Rfbridge2 и кодом:
return {
active = true, -- скрипт активен
on = { devices = { "rfbridge2" }
--устройство активации
},
-- когда устройство активировано, выполним секцию execute:
execute = function(domoticz, item)
--local switch1 = dz.devices("Inside")
--если код соответствует кнопке пульта:
if item.rawData[1] == "23761" then
-- то выполнить
domoticz.email('Пульт. Кнопка D',
'нажата кнопка D на пульте 1',
'my@mail.com')
elseif item.rawData[1] == "5325076" then
-- если код соответствует другой кнопке, то выполнить
end
end
}
Т.е. когда изменяется состояние устройства
rfbridge2, срабатывает этот скрипт, он сравнивает значение, указанное в условиях
if со значением переменной
svalue, переданной мостом в наш виртуальный переключатель. Если значения совпадают, то выполняются какие-то действия.
В нашем случае - просто отправляется письмо на мыло, что было нажата кнопка D:
Email уведомление от домотикз о нажатии кнопки на RF пультеНо в разделе
execute мы можем выполнять любые действия на какие у нас хватит фантазии...
Ссылки и файлы:[1]
habr. Как общаются машины — протокол MQTT [2]
MQTT with Domoticz[3]
Add an MQTT Broker to the Raspeberry Pi[4]
Mosquitto Debian repository[5]
MQTTLens[6]
forum post with dzvents codePS: Стоит обратить внимание, что мост принимает код не в десятиной системе, а передается в домотокз в десятичной, и соответственно в скриптах в секции if/elseif надо сравнивать код с десятичным значением: