Sonoff RF Bridge. Strategies for receiving data

Not sure why but this isnt working for me.

This is in my config yaml.

binary_sensor:
    - platform: mqtt
      name: 'Living Room Door'
      state_topic: 'home/PatioDoor'
      device_class: door

My automation is

alias: rfbridge_demultiplexer
description: ""
trigger:
  - platform: mqtt
    topic: tele/RF_Bridge/RESULT
condition: []
action:
  - service: python_script.rfbridge_demux
    data_template:
      payload: "{{trigger.payload_json.RfReceived.Data}}"
mode: single

And this is the python script.

d = { '5A830A':['PatioDoor','ON','true'],
      '5A830E':['PatioDoor','OFF','true'],
      '2DEC73':['Living Room Window','ON','true'],
      '2DEC79':['Living Room Window','OFF','true']
      '0568D3':['Bedroom Window','ON','true'],
      '0568D9':['Bedroom Window','OFF','true']
      '06D933':['Downstairs Toilet Door','ON','true'],
      '06D939':['Downstairs Toilet Door','OFF','true']
      '05CDC3':['Fridge','ON','true'],
      '05CDC9':['Fridge','OFF','true']
      '55D60A':['Front Door','ON','true'],
      '55D60E':['Front Door','OFF','true']
      '5E600A':['Back Door','ON','true'],
      '5E600E':['Back Door','OFF','true']
    }

p = str(data.get('payload'))

if p is not None:
  if p in d.keys():
    service_data = {'topic':'home/{}'.format(d[p][0]), 'payload':'{}'.format(d[p][1]), 'qos':0, 'retain':'{}'.format(d[p][2])}
  else:
    service_data = {'topic':'home/unknown', 'payload':'{}'.format(p), 'qos':0, 'retain':'false'}
    logger.warning('<rfbridge_demux> Received unknown RF command: {}'.format(p))
  hass.services.call('mqtt', 'publish', service_data, False)


Ive also tried the sensor in my config yaml file like this

mqtt:
  binary_sensor:
    - name: "Patio Door"
      state_topic: "home/PatioDoor"
      device_class: door

According to the example in the documentation for MQTT Binary Sensor, it should look like this (assuming you have all your MQTT entities defined in configuration.yaml):

mqtt:
  - binary_sensor:
      name: "Patio Door"
      state_topic: "home/PatioDoor"
      device_class: door

I had it setup like below. Ive modified the Patio Door config to use the python script, i can see the automation is triggering but nothing updates on the sensor.

mqtt:
  binary_sensor:
    - name: "Patio Door"
#      state_topic: "tele/RF_Bridge/RESULT"
      state_topic: "home/PatioDoor"
      device_class: door
#      value_template: '{{value_json.RfReceived.Data}}'
#      payload_on: '5A830A'
#      payload_off: '5A830E'
    - name: "Living Room Window"
      state_topic: "tele/RF_Bridge/RESULT"
      value_template: '{{value_json.RfReceived.Data}}'
      payload_on: '2DEC73'
      payload_off: '2DEC79'
      device_class: window
      qos: 1
    - name: "Bedroom Window"
      state_topic: "tele/RF_Bridge/RESULT"
      value_template: '{{value_json.RfReceived.Data}}'
      payload_on: '0568D3'
      payload_off: '0568D9'
      device_class: opening
      qos: 1
    - name: "Office Window"
      state_topic: "tele/RF_Bridge/RESULT"
      value_template: '{{value_json.RfReceived.Data}}'
      payload_on: '052463'
      payload_off: '052469'
      device_class: opening
      qos: 1

The rest of my MQTT devices are in the UI but dont seem to be able to add that way

Use an MQTT client to confirm home/PatioDoor receives the payload published by the python_script.

If there’s no payload published to home/PatioDoor then it implies the python_script failed to find a match (in its dictionary) for the received code. In that case, it will publish it to the home/unknown topic.

Yeah you;re right, nothing coming through on that topic.

Anything you could see wrong in the python script or automation?

This is the output from the RFBridge, which im seeing working fine.

19:26:05 MQT: tele/RF_Bridge/RESULT = {"RfReceived":{"Sync":14000,"Low":470,"High":1390,"Data":"5A830A","RfKey":"None"}}
19:26:10 MQT: tele/RF_Bridge/RESULT = {"RfReceived":{"Sync":14100,"Low":470,"High":1390,"Data":"5A830E","RfKey":"None"}}

I should add nothing on the home/unknown topic either.


I get this error if i try to manually run that action, not sure if that due to not having any data to parse or if there is an issue with this action.

I looked at the automation trace to see what happened with the script.

Executed: November 23, 2023 at 6:33:40 PM
Result:
params:
  domain: python_script
  service: rfbridge_demux
  service_data:
    payload: 5A830A
  target: {}
running_script: true

Looks like its pulling the code which i have put in the script dictionary so i dont know why that isnt then sending out the device or error.

Fixed the issue! I had missed some commas in the script between each of the devices.

Oops, thanks for the help @123

  • And maybe adding a set every Topic to OFF with a trigger “When Home Assistant Restart”
  • Or even better an mqtt Auto Off value for those devices with no dual binary state so we can Finally put MQTTs to retain!?

I like this approch… Because I do not really know Python Stuff

thank you so much! was able to tweak the script a little to update some “last changed” topics too!

so now my leak sensors mimic the govee app + more - showing when things last happened, etc.

Thanks a lot for this script!

I can see the automation triggered with a motion sensor, but the mqtt binary sensor does not change its value.

Here is my demux script…

d = { '8B4F0A':['Sensore1','ON','true'],
      '8B4F0E':['Sensore1','OFF','true'],
     ....many other sensors....
      '951056':['Sensore movimento giroscale','ON','false']
    }

p = str(data.get('payload'))

if p is not None:
  if p in d.keys():
    service_data = {'topic':'home/{}'.format(d[p][0]), 'payload':'{}'.format(d[p][1]), 'qos':0, 'retain':'{}'.format(d[p][2])}
  else:
    service_data = {'topic':'home/unknown', 'payload':'{}'.format(p), 'qos':0, 'retain':'false'}
    logger.warning('<rfbridge_demux> Received unknown RF command: {}'.format(p))
  hass.services.call('mqtt', 'publish', service_data, False)

SONOFF trigger:

HASS automation:
2024-08-28_10h57_42

MQTT binary sensor states:

EMQX Topic monitor:

What am I missing?
Thanks a lot
Andrea

Hello.

The payload declared in the script does not match the payload emitted by the sensor. The codes are not the same.

30-08-2024_19-43-11

Codes not registered in the script are published in this topic:

‘topic’:‘home/unknown’

I don’t know why the sensor gives you the registered code preceded by a “0x”.

1 Like

Thank you, maybe after an update it started to send 0x…

Anyway, I didn’t find any message in home/unknown topic.
I have tried to change sensors codes, let’s see if something changes.

YEP! Gotcha!
I have to investigate anyway about this “0x”…

So I used this topic a few years ago to get my sonoff rf bridge working. It continues to work well. Recently I received a new v2 of the bridge (a white one). I have managed to put esphome on this device and I am wondering if anyone has tips for using a similar method to get status of my sensors using esphome with a python script to publish to mqtt, similarly to what I am doing now? I am receiving data but the data is not being properly passed through the python if statement.
I currently have this python script…

# New ESPHome RF Bridge
# White Unit
# http://192.168.0.159/
# Add the sensor below then update the binary sensor yaml file here
# /home/mele/homeassistant/_mqtt/b_sensor
d = {
    'E3E20A':['sensor8','ON','true'],
    'E3E20E':['sensor8','OFF','true'],
    'E3E206':['sensor8b','ON','false'],
    '0DCF0A':['sensor9','ON','true'],
    '0DCF0E':['sensor9','OFF','true'],
    '0DCF06':['sensor9b','ON','false']
}
# Create p variable of entire payload received
# p = str(msg['payload'])
p = str(data.get('payload'))

if p is not None:
  if p in d.keys():
    service_data = {'topic':'home/{}'.format(d[p][0]), 'payload':'{}'.format(d[p][1]), 'qos':0, 'retain':'true'}
    logger.info('RF-Bridge Publishing: ' + str(service_data))
  else:
    service_data = {'topic':'home/unknown', 'payload':'{}'.format(p), 'qos':0, 'retain':'false'}
    rf_command = str(p)[0:2]
    if rf_command != "00":
      logger.warning('<rfbridge_demux> Received unknown RF command: {}'.format(p))
  hass.services.call('mqtt', 'publish', service_data, False)

This Automation…

alias: ESPHome RFBridge
description: ""
trigger:
  - platform: event
    event_type: esphome.rf_code_received
condition: []
action:
  - data_template:
      payload: "{{ trigger.event }}"
    action: python_script.esphome_rfbridge
    enabled: true
mode: single

And these MQTT Sensors…

#########################
# ESPHome RF Bridge White
#########################
- name: "Bedroom Window"
  state_topic: 'home/sensor8'
  device_class: door
  unique_id: E3E20A
  qos: 1
- name: "Bedroom Window Low Battery"
  state_topic: 'home/sensor8b'
  device_class: battery
  unique_id: E3E206
  qos: 1
- name: "Bathroom Window"
  state_topic: 'home/sensor9'
  device_class: door
  unique_id: 0DCF0A
  qos: 1
- name: "Bathroom Window Low Battery"
  state_topic: 'home/sensor9b'
  device_class: battery
  unique_id: 0DCF06
  qos: 1