Главная > Умный дом > Протокол MQTT плюс Domoticz
Протокол MQTT плюс Domoticz26 июля 2019. Разместил: dimon |
Все изображения кликабельны MQTT расшифровывается, как Message Queue Telemetry Transport - упрощённый сетевой протокол обмена данными поверх TCP/IP через порт 1883 (если используется шифрование то 8883/SSL). Протокол ориентированный для обмена сообщениями между устройствами по принципу издатель-подписчик. По сути этот протокол - icq чатик для железок MQTT имеет клиент-серверную архитектуру - обмен сообщениями происходит через центральный сервер, который называется брокером. Весь обмен сообщениями происходит через сервер, напрямую два клиента общаться не могут. Клиенты бывают двух типов: * Издатели (Publisher) - те которые публикуют данные на брокере. Например датчики, которые публикуют свои значения. * Подписчики (Subscriber) - те клиенты которые считывают данные с брокера. Например устройство - термостат, он считывает данные опубликованные датчиком температуры и в зависимости от этих значений включает/выключает обогрев. Для идентификации сущностей в MQTT используются топики. Они имеют древовидную структуру, похожую на файловую систему в UNIX. Это удобный механизм, позволяющий называть сущности в человекопонятном виде. Пример - датчики температуры, разнесенные по разным комнатам, публикуют значение температуры каждый в свой отдельный топик:
В MQTT так же предусмотрена аутентификация клиентов. Клиенты могут иметь следующие свойства: ClientId - уникальный идентификатор клиента, уникальный для каждого клиента. С версии MQTT 3.1.1 можно оставлять поле ClientId пустым. В этом случае не будет сохраняться состояния подключения. Username - логин, может быть не уникальным. Например, группа клиентов может авторизовываться с одним и тем же логином/паролем. Password - пароль, может посылаться только вместе с полем Username, при этом Username может передаваться без поля Password. Максимум 65535 байт. Имя и пароль передаются в открытом виде! Вроде в теории все просто. Давайте установим брокер на малинку. Установка MQTT брокера на Raspberry Pi. 1. Первым делом обновляем систему:
По слухам библиотеки Raspberry Pi (Orange Pi) не содержат последнюю версию Mosquitto software. Поэтому перед установкой нам нужно будет обновить библиотеки. Я поискал нужный пакет в репозитории, потом обновил его, потом снова поискал. Версия пакетов не изменилась, так что может и не стоит париться с этим обновлением, тем более MQTT version 3.1/3.1.1 похоже уже несколько лет последняя: Но если вы будете обновлять, то вот инструкция: 2. Устанавливаем MQTT брокер и MQTT клиент:
После установки mosquitto сервер будет автоматически запускаться при загрузке системы. 3. Создаем пользователя MQTT:
где вместо 4. Добавляем правила подключения к брокеру MQTT Создаем локальный конфигурационный файл Mosquitto:
В него добавляем 2 строчки:
Сохраняем и закрываем файл - нажимаем ctrl+x, выбираем Y и нажимает Enter. Таким образом мы прописали в каком файле хранятся пользователи и пароли для подключения к нашему MQTT брокеру, а также мы запретили подключение к серверу всем пользователям без логина и пароля. Этот файл, благодаря строке include_dir /etc/mosquitto/conf.d в основном конфигурационном файле /etc/mosquitto/mosquitto.conf, подтянется когда служба будет запускаться. 3. Останавливаем сервер для настройки После установки сервер MQTT сразу запускается. Нам необходимо оставновить его, чтобы произвести последующую настройку.
5. Запускаем сервер MQTT
6. Перезапускаем малинку
Проверим работу брокера. Статус сервера:
Для наблюдения за MQTT топиками воспользуемся приложением Chrome - MQTTLens. Настраиваем подключение - указываем имя, ip адресс брокера (малинки), логин и пароль для подключения, которые мы задали при настройке Mosquitto: Если ошибки не выдал, значит служба брокера работает и настройки мы задали правильно. Настройка Tasmota RF bridge для работы с MQTT брокером. Заходим браузером на ip адрес Sonoff RF bridge с альтернативной прошивкой Tasmota. Нажимаем Configuration: Далее Configure MQTT: Далее настраиваем подключение к MQTT брокеру - указываем ip адрес сервера (в нашем случае это Raspberry Pi с установленным ранее брокером), логин и пароль для подключения и топик - мы для теста создадим топик с именем устройства - rfbridge2 и разделом для принятых кодов received-rfkeys: Теперь в MQTTLens подписываемся на все топики - для этого в поле Subscribe вводим # и нажимаем кнопку SUBSCRIBE: Теперь берем совместимый с приемником 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 Настройка - Журнал, нажимаем кнопку на пульте и смотрим запись в логе:
как мы видим idx указан нашего датчика - значит это данные присланные sonoff rf bridge, нас интересует значение svalue, запоминаем его. Дальше нам придется ваять костыль в разделе Настройка - Дополнительно - События. Создаем новый скрипт с именем Rfbridge2 и кодом:
Т.е. когда изменяется состояние устройства rfbridge2, срабатывает этот скрипт, он сравнивает значение, указанное в условиях if со значением переменной svalue, переданной мостом в наш виртуальный переключатель. Если значения совпадают, то выполняются какие-то действия. В нашем случае - просто отправляется письмо на мыло, что было нажата кнопка D: Но в разделе 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 надо сравнивать код с десятичным значением: Вернуться назад |