Разные MQTT-топики для RF433-устройств в Sonoff RF Bridge

Ещё до того, как я купил свои первые умные устройства на Wi-Fi, у меня оказалось некоторое количество железок, работающих по радиоканалу на частоте 433 МГц. В какой-то момент времени я задумался, а можно ли их как-то подключить к системе умного дома? И натолкнулся на Sonoff RF Bridge 433 Smart Hub. RF Bridge был куплен и прошит в Tasmota. Собственно, если вас заинтересовала эта заметка, значит и у вас есть этот шлюз, прошитый в Tasmota.

В работе Tasmota на Sonoff RF Bridge 433 есть одна особенность: информация обо всех распознанных радиосигналах публикуется в одном и том же MQTT-топике. В нашем примере это tele/sonoffrf/RESULT.

09:19:51 MQT: tele/sonoffrf/RESULT = {"Time":"2021-07-10T09:19:51","RfReceived":{"Sync":12480,"Low":420,"High":1230,"Data":"123456","RfKey":"None"}}

Не берусь судить о том, хорошо это или плохо, просто констатирую факт. Такая ситуация не совсем удобна, если нужно впоследствии как-то обрабатывать полученные данные. Я встречал разные её решения. Все они основаны на том, что некий софт слушает заданный топик (в нашем случае — tele/sonoffrf/RESULT), обрабатывает полученную информацию и потом уже раскидывает её по отдельным топикам, в зависимости от поля Data, где размещается код устройства, полученный из радиосигнала.

Я подумал, неужели нельзя всё это сделать локально, на самом радиошлюзе? Беглый поиск в интернетах ничего не дал, поэтому я придумал решение (см. ниже). Надеюсь, что не изобрёл велосипед. :-)

Все команды действительны для версии Tasmota 8.1.0. На момент написания статьи актуальная версия 9.5.0. Да, я не спешу обновляться. На текущей версии прошивки всё работает как задумано. Допускаю, что и на 9.5.0 всё будет работать прекрасно, но проверять не хочу — лень.

Rule1 ON RfReceived#Data DO Publish stat/sonoffrf/%value% ON ENDON
Rule1 1

Команды нужно вводить в консоли Tasmota. Это простое правило, пример работы которого привожу ниже.

09:19:51 MQT: tele/sonoffrf/RESULT = {"Time":"2021-07-10T09:19:51","RfReceived":{"Sync":12480,"Low":420,"High":1230,"Data":"123456","RfKey":"None"}}
09:19:51 RUL: RFRECEIVED#DATA performs "Publish stat/sonoffrf/123456 ON"

Tasmota получает сигнал по радио с кодом устройства 123456 и публикует строку ON в MQTT-топике stat/sonoffrf/123456. Дальше это уже можно обрабатывать в любой системе умного дома, умеющей работать с MQTT.

Я приведу пример для Home Assistant. Это описание одного и того же датчика движения в configuration.yaml.

  - platform: mqtt
    name: "Motion Sensor 123456"
    unique_id: motion_sensor_123456
    device_class: motion
    state_topic: "tele/sonoffrf/RESULT"
    value_template: >-
      {% if value_json.RfReceived.Data == '123456' %}
        ON
      {% else %}
        {{ states('binary_sensor.motion_sensor_123456') | upper }}
      {% endif %}
    off_delay: 120
    availability_topic: "tele/sonoffrf/LWT"
    payload_available: "Online"
    payload_not_available: "Offline"

Как видим, конфигурация упростилась на 6 строк.

  - platform: mqtt
    name: "Motion Sensor 123456"
    unique_id: motion_sensor_123456
    device_class: motion
    state_topic: "stat/sonoffrf/123456"
    off_delay: 120
    availability_topic: "tele/sonoffrf/LWT"
    payload_available: "Online"
    payload_not_available: "Offline"

Помимо удобства (каждому коду соответствует свой MQTT-топик), это решение положительно влияет на производительность, если используется большое количество радиоустройств. Ведь в случае, когда всё сыпется в один топик, его обработчик в системе умного дома будет каждый раз сверять прилетевший код с теми, что указаны в конфигурации. А когда коды раскиданы по разным топикам, обработка будет вестись только по топику, который соответствует прилетевшему коду. Хотя, может это и некритично, учитывая растущие как на дрожжах вычислительные мощности систем умного дома.

Традиционно, никого ни к чему не призываю, ничего не навязываю. Просто делюсь тем, как реализовал у себя. Если есть желание поделиться своими решениями или появились вопросы, заходите обсудить.

Vladimir Turekhanov ・ July 11, 2021

вернуться