Сделать стартовойДобавить в закладки  
Главная страничка Главная страничка
В номере:

    Выходит с 17 июля 2008 г. цена договорная

    Опрос

    конечно, он настанет в 2012 г.
    да, но не в 2012 г.
    нет, это фантастика
    а что такое конец света
    а мне пофиг - я буду уже мертв



    Календарь
    «    Июль 2019    »
    ПнВтСрЧтПтСбВс
    1234567
    891011121314
    15161718192021
    22232425262728
    293031 

    Архив новостей
    Сентябрь 2019 (1)
    Август 2019 (2)
    Июль 2019 (2)
    Май 2019 (2)
    Март 2019 (1)
    Январь 2019 (1)

    Информация
    Протокол MQTT плюс Domoticz
    Умный дом
    автор: dimon, опубликовано: 26 июля 2019

    Все изображения кликабельны


    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

     
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Чтобы Вам были доступны все функции Вам необходимо либо зарегистрироваться, либо зайти на сайт под своим именем.

    Другие новости по теме:

  • Domoticz. Включаем гирлянду по датчику Xiaomi Flower Monitor
  • Domoticz. Бэкап папки domoticz в сетевую папку на роутере.
  • Domoticz. Уведомление о низком уровне батарее датчиков
  • Domoricz. Сцена Ночник
  • Domoticz. Ежедневное уведомление на e-mail


  • Комментарии:

    Оставить комментарий



     
    Информация
     
    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


    Поиск по сайту:


    Облако тегов
    Android, Arduino, backup, CentOS, cmd, css, div, DLE, DLE хаки, domoticz, dzvents, event, Linux, log, LUA, Monster, ogf3, RDP, Template, VBS, w2k8, windows, WSH, бумага, бумажный самолетик, верстка, иструкция, Карты, кино, Навигация, оригами, программа, рецензия, рецепт, скрипт, фигуры, шаблон, Яндекс, яндекс-карты

    Показать все теги
    Реклама
    раскрутка сайта бесплатно
    Главная страница | Регистрация | Добавить новость | Новое на сайте | Статистика | Поддержка | Правила ресурса Copyright © 2005-2018 by dimon - all right reserved!
    Тираж:           экземпляров.   Дизайн, верстка by dimon