Главная > Умный дом > Протокол MQTT плюс Domoticz

Протокол MQTT плюс Domoticz


26 июля 2019. Разместил: dimon
Все изображения кликабельны


MQTT расшифровывается, как Message Queue Telemetry Transport - упрощённый сетевой протокол обмена данными поверх TCP/IP через порт 1883 (если используется шифрование то 8883/SSL). Протокол ориентированный для обмена сообщениями между устройствами по принципу издатель-подписчик. По сути этот протокол - icq чатик для железок laughing

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 похоже уже несколько лет последняя:

Протокол MQTT плюс Domoticz


Но если вы будете обновлять, то вот инструкция:


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




5. Запускаем сервер MQTT

sudo /etc/init.d/mosquitto start


6. Перезапускаем малинку

sudo reboot




Проверим работу брокера.

Статус сервера:

sudo service mosquitto status


service mosquitto statusservice mosquitto status


Для наблюдения за MQTT топиками воспользуемся приложением Chrome - MQTTLens. Настраиваем подключение - указываем имя, ip адресс брокера (малинки), логин и пароль для подключения, которые мы задали при настройке Mosquitto:

Протокол MQTT плюс Domoticz


Если ошибки не выдал, значит служба брокера работает и настройки мы задали правильно.

MQTTLensMQTTLens




Настройка Tasmota RF bridge для работы с MQTT брокером.

Заходим браузером на ip адрес Sonoff RF bridge с альтернативной прошивкой Tasmota. Нажимаем Configuration:

Sonoff RF bridge с альтернативной прошивкой TasmotaSonoff RF bridge с альтернативной прошивкой Tasmota


Далее Configure MQTT:

Sonoff RF bridge с альтернативной прошивкой TasmotaSonoff RF bridge с альтернативной прошивкой Tasmota


Далее настраиваем подключение к MQTT брокеру - указываем ip адрес сервера (в нашем случае это Raspberry Pi с установленным ранее брокером), логин и пароль для подключения и топик - мы для теста создадим топик с именем устройства - rfbridge2 и разделом для принятых кодов received-rfkeys:

Протокол MQTT плюс Domoticz


Теперь в MQTTLens подписываемся на все топики - для этого в поле Subscribe вводим # и нажимаем кнопку SUBSCRIBE:

Протокол MQTT плюс Domoticz


Теперь берем совместимый с приемником Sonoff пульт из прошлой темы и нажимаем на нем кнопку. Сверяем код, полученный мостом, в консоли RF bridge на Tasmota:

Консоль Sonoff RF bridge с альтернативной прошивкой TasmotaКонсоль Sonoff RF bridge с альтернативной прошивкой Tasmota


с кодом опубликованном в топике MQTT брокера:

Протокол MQTT плюс Domoticz


Коды совпадают, значит вся связка работает корректно и осталось настроить Domoticz.



Настройка MQTT клиента на Domoticz.

Почитав Wiki Domoticz, мы внезапно узнаем, что наша любимая система умного дома работает только с двумя топиками domoticz\in и domoticz\out. Как же так? Т.е. все датчики должны публиковать свои значения только в один топик? Это же получится полный бардак в показаниях...
Я реально снова задумался о переходе на Home Assistant, там ведь таких проблем нет - он работает с топиками индивидуально.

Но раз мы пока никуда не уходим, придется нам мастерить костыли на той системе, которая уже у нас работает.

Значит сначала идем на Sonoff RF bridge 433МГц и перенастраиваем клиента-издателя в соответствии с требованиями Domoticz. По сути нам нужно поменять только значение двух полей:

Протокол MQTT плюс Domoticz


Проверяем:

Протокол MQTT плюс Domoticz


Теперь настраиваем Domoticz. Идем в Настройки - Оборудование. Тип = MQTT Client Gateway with LAN interface, настраиваем адрес = localhost (у нас же брокер работает на той же Raspberry Pi, что и Domoticz), порт = 1883, логин/пароль и топик исходящих сообщений (out):

Протокол MQTT плюс Domoticz


Если все настроено верно и в логах Dz нет ошибок, то с помощью клиента-подписчика можно заметить как в топик Domoticz\out начали падать сообщения от всех датчиков умного дома:

Протокол MQTT плюс Domoticz


А теперь начинаются костыли.

Создаем в Домотикз датчик Dummy - идем Настройки - Оборудование - Создать виртуальный датчик (у Вас уже должна быть добавлена такая группа оборудования, если у вас ее нет - то сначала создаете ее (имя = VirtualSwitches, тип = Dummy (Does nothing, use for virtual switches only)):

Dummy в Domoticz RF bridge


Смотрим и запоминаем его idx в разделе Настройки - Устройства:

Протокол MQTT плюс Domoticz


Потом идем в Domoticz - Переключатели, ищем наш переключатель и меняем тип на Push On Button:

Протокол MQTT плюс Domoticz


Теперь снова идем на Sonoff RF bridge с Tasmoto в раздел Configuration - Configure Domoticz и везде указываем idx этого виртуального датчика:

Протокол MQTT плюс Domoticz


Теперь нам нужен код кнопки пульта, который передается в домотикз посредствам 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 пульте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 code



PS: Стоит обратить внимание, что мост принимает код не в десятиной системе, а передается в домотокз в десятичной, и соответственно в скриптах в секции if/elseif надо сравнивать код с десятичным значением:

Протокол MQTT плюс Domoticz

Вернуться назад