Ещё до того, как я купил свои первые умные устройства на 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