mightymos / ReedTripRadio

Alternative firmware for wireless 433MHz door/window reed sensors triggered by magnetic contacts.
BSD 2-Clause "Simplified" License
155 stars 7 forks source link

ESPHome - RF Bridge Component #11

Closed seganku closed 1 month ago

seganku commented 1 year ago

Thank you so much for this project. It's really exactly what I was looking for. I wanted to pass along some ESPHome info, because ESPHome is awesome and loads of fun to use.

Flashing ESPHome was very easy for my Sonoff RF Bridge R2 v2.2:

This will forward all RF captures to Home Assistant. Users can set up Home Assistant to map codes to binary sensors, do automations, alerts, etc.

Or: ESPHome can decode these, but it requires a recompile + OTA to add new sensors.

Config:

substitutions:
  name: "rf-bridge"
  friendly_name: "RF Bridge"
  wifi_static_ip: "192.168.100.191"
  wifi_gateway: "192.168.100.1"
  api_encryption_key: "ptLta2XBJ/pXdWX4ZHWP1haYFCDy3c6bCZse4r3V3pY="

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  libraries:
    - iostream
    - regex
    - string.h

esp8266:
  board: esp01_1m

wifi:
  fast_connect: true
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: ${wifi_static_ip}
    gateway: ${wifi_gateway}
    subnet: 255.255.255.0
  ap:
    ssid: ${name} Fallback Hotspot
    password: !secret wifi_password

uart:
  tx_pin: 1
  rx_pin: 3
  baud_rate: 19200

rf_bridge:
  on_code_received:

    # static const unsigned char gBatteryLow  = 0x06;
    # static const unsigned char gTamperOpen  = 0x07;
    # static const unsigned char gTamperClose = 0x08;
    # static const unsigned char gBatteryOk   = 0x09;
    # static const unsigned char gReedOpen    = 0x0a;
    # static const unsigned char gReedClose   = 0x0e;

    - if:
        condition:
          or:
            - lambda: |-
                int trunc_code = int(data.code/256)*256;
                if (
                     trunc_code == 0x72FF00 ||
                     trunc_code == 0x11E500 ||
                     trunc_code == 0xEF7900 ||
                     trunc_code == 0x745400 ||
                     trunc_code == 0xEF3B00
                    )
                  return 1;
                else
                  return 0;
        then:
          - homeassistant.event:
              event: esphome.rf_code_received
              data:
                sync: !lambda 'return format_hex(data.sync);'
                low:  !lambda 'return format_hex(data.low);'
                high: !lambda 'return format_hex(data.high);'
                code: !lambda 'return format_hex(data.code);'
          # 001: Front Door (0x72FF)
          # 001: 0x72FF0A / 0x72FF0E
          - if:
              condition:
                lambda: 'return data.code == 0x72FF0A || data.code == 0x72FF0E;'
              then:
                - lambda: 'id(rf_sensor_001).publish_state(data.code == 0x72FF0A);'
          # 001_tamper: 0x72FF07 / 0x72FF08
          - if:
              condition:
                lambda: 'return data.code == 0x72FF07 || data.code == 0x72FF08;'
              then:
                - lambda: 'id(rf_sensor_001_tamper).publish_state(data.code == 0x72FF07);'
          # 001_battery: 0x72FF06 / 0x72FF09
          - if:
              condition:
                lambda: 'return data.code == 0x72FF06 || data.code == 0x72FF09;'
              then:
                - lambda: 'id(rf_sensor_001_battery).publish_state(data.code == 0x72FF06);'

          # 002: Garage Side Door
          # 002: 0x11E50A / 0x11E50E
          - if:
              condition:
                lambda: 'return data.code == 0x11E50A || data.code == 0x11E50E;'
              then:
                - lambda: 'id(rf_sensor_002).publish_state(data.code == 0x11E50A);'
          # 002_tamper: 0x11E507 / 0x11E508
          - if:
              condition:
                lambda: 'return data.code == 0x11E507 || data.code == 0x11E508;'
              then:
                - lambda: 'id(rf_sensor_002_tamper).publish_state(data.code == 0x11E507);'
          # 002_battery: 0x11E506 / 0x11E509
          - if:
              condition:
                lambda: 'return data.code == 0x11E506 || data.code == 0x11E509;'
              then:
                - lambda: 'id(rf_sensor_002_battery).publish_state(data.code == 0x11E506);'

          # 003: Dining Room Window
          # 003: 0xEF790A / 0xEF790E
          - if:
              condition:
                lambda: 'return data.code == 0xEF790A || data.code == 0xEF790E;'
              then:
                - lambda: 'id(rf_sensor_003).publish_state(data.code == 0xEF790A);'
          # 003_tamper: 0xEF7907 / 0xEF7908
          - if:
              condition:
                lambda: 'return data.code == 0xEF7907 || data.code == 0xEF7908;'
              then:
                - lambda: 'id(rf_sensor_003_tamper).publish_state(data.code == 0xEF7907);'
          # 003_battery: 0xEF7906 / 0xEF7909
          - if:
              condition:
                lambda: 'return data.code == 0xEF7906 || data.code == 0xEF7909;'
              then:
                - lambda: 'id(rf_sensor_003_battery).publish_state(data.code == 0xEF7906);'

          # 004: Back Door
          # 004: 0x74540A / 0x74540E
          - if:
              condition:
                lambda: 'return data.code == 0x74540A || data.code == 0x74540E;'
              then:
                - lambda: 'id(rf_sensor_004).publish_state(data.code == 0x74540A);'
          # 004_tamper: 0x745407 / 0x745408
          - if:
              condition:
                lambda: 'return data.code == 0x745407 || data.code == 0x745408;'
              then:
                - lambda: 'id(rf_sensor_004_tamper).publish_state(data.code == 0x745407);'
          # 004_battery: 0x745406 / 0x745409
          - if:
              condition:
                lambda: 'return data.code == 0x745406 || data.code == 0x745409;'
              then:
                - lambda: 'id(rf_sensor_004_battery).publish_state(data.code == 0x745406);'

          # 005: Family Room Window
          # 005: 0xEF3B0A / 0xEF3B0E
          - if:
              condition:
                lambda: 'return data.code == 0xEF3B0A || data.code == 0xEF3B0E;'
              then:
                - lambda: 'id(rf_sensor_005).publish_state(data.code == 0xEF3B0A);'
          # 005_tamper: 0xEF3B07 / 0xEF3B08
          - if:
              condition:
                lambda: 'return data.code == 0xEF3B07 || data.code == 0xEF3B08;'
              then:
                - lambda: 'id(rf_sensor_005_tamper).publish_state(data.code == 0xEF3B07);'
          # 005_battery: 0xEF3B06 / 0xEF3B09
          - if:
              condition:
                lambda: 'return data.code == 0xEF3B06 || data.code == 0xEF3B09;'
              then:
                - lambda: 'id(rf_sensor_005_battery).publish_state(data.code == 0xEF3B06);'

api:
  encryption:
    key: ${api_encryption_key}
  services:
    - service: send_rf_code
      variables:
        sync: int
        low: int
        high: int
        code: int
      then:
        - rf_bridge.send_code:
            sync: !lambda 'return sync;'
            low: !lambda 'return low;'
            high: !lambda 'return high;'
            code: !lambda 'return code;'
    - service: learn
      then:
        - rf_bridge.learn

logger:
  baud_rate: 0
  level: DEBUG

ota:

web_server:
  port: 80

button:                                
  - platform: restart
    name: "Restart"

binary_sensor:
  - platform: status
    name: "Status"

  - platform: template
    id: rf_sensor_001
    name: RF Sensor 001 Front Door
    device_class: opening
  - platform: template
    id: rf_sensor_001_tamper
    name: RF Sensor 001 Front Door Tamper
    device_class: tamper
  - platform: template
    id: rf_sensor_001_battery
    name: RF Sensor 001 Front Door Battery
    device_class: battery

  - platform: template
    id: rf_sensor_002
    name: RF Sensor 002 Garage Side Door
    device_class: opening
  - platform: template
    id: rf_sensor_002_tamper
    name: RF Sensor 002 Garage Side Door Tamper
    device_class: tamper
  - platform: template
    id: rf_sensor_002_battery
    name: RF Sensor 002 Garage Side Door Battery
    device_class: battery

  - platform: template
    id: rf_sensor_003
    name: RF Sensor 003 Dining Room Window
    device_class: opening
  - platform: template
    id: rf_sensor_003_tamper
    name: RF Sensor 003 Dining Room Window Tamper
    device_class: tamper
  - platform: template
    id: rf_sensor_003_battery
    name: RF Sensor 003 Dining Room Window Battery
    device_class: battery

  - platform: template
    id: rf_sensor_004
    name: RF Sensor 004 Back Door
    device_class: opening
  - platform: template
    id: rf_sensor_004_tamper
    name: RF Sensor 004 Back Door Tamper
    device_class: tamper
  - platform: template
    id: rf_sensor_004_battery
    name: RF Sensor 004 Back Door Battery
    device_class: battery

  - platform: template
    id: rf_sensor_005
    name: RF Sensor 005 Family Room Window
    device_class: opening
  - platform: template
    id: rf_sensor_005_tamper
    name: RF Sensor 005 Family Room Window Tamper
    device_class: tamper
  - platform: template
    id: rf_sensor_005_battery
    name: RF Sensor 005 Family Room Window Battery
    device_class: battery

status_led:
  pin:
    number: GPIO13
    inverted: yes
mightymos commented 1 year ago

That's really cool, thanks for posting!

mightymos commented 10 months ago

I hate to say it but the Sonoff board modification is looking more appealing. Apparently ESPHome has a radio receiver component built in that's based on rcswitch project: https://esphome.io/components/remote_receiver

mightymos commented 1 month ago

Now include example YAML for passthrough mode: https://github.com/mightymos/RF-Bridge-OB38S003/blob/main/example_esphome_yaml/sonoff_bridge.yaml

Can accept a pull request over on bridge project if desired.