跳转到内容

RF 桥接器组件

RF Bridge 组件提供使用 RF 桥接设备(例如 Sonoff RF Bridge)上的无线电微控制器发送和接收 433MHz 信号(如射频遥控器/钥匙扣)的能力。

  • 黑色 Sonoff RF Bridge(R1、R2 V1.0)有一个 ESP8266(用于 WIFI/ESPHome)和一个内置的 EFM8BB1 微控制器(433 MHz)。
  • 白色 Sonoff RF Bridge(R2 V2.0)有一个 ESP8266 和一个内置的 OB38S003 微控制器(433 MHz)。

此组件实现了 ESP8266 与 EFM8BB1 或 OB38S003 固件之间的通信协议。 无线电微控制器通过 UART 总线 连接到 ESP8266。UART 总线必须与模块的相同速度配置,即 19200bps。

WARNING

如果你使用 Logger,请确保使用 baud_rate: 0 选项禁用 uart 日志记录。

Sonoff RF Bridge 433(版本 R1 或 R2 V1.0)
# 示例配置条目
rf_bridge:
on_code_received:
- homeassistant.event:
event: esphome.rf_code_received
data:
sync: !lambda 'char buf[5]; return format_hex_to(buf, data.sync);'
low: !lambda 'char buf[5]; return format_hex_to(buf, data.low);'
high: !lambda 'char buf[5]; return format_hex_to(buf, data.high);'
code: !lambda 'char buf[9]; return format_hex_to(buf, data.code);'
  • id (可选, ID): 手动指定 RF 桥接器的 ID。
  • uart_id (可选, ID): 手动指定桥接器组件使用的 UART hub 的 ID。
  • on_code_received (可选, Automation): 收到码时执行的操作。参见 on_code_received 触发器。

借助此配置选项,你可以在这个桥接器收到码时编写复杂的自动化。要使用该码,请使用 lambda 模板。 码和相应的协议时序在该 lambda 中以名为 code、sync、high 和 low 的变量提供。

on_code_received:
- homeassistant.event:
event: esphome.rf_code_received
data:
sync: !lambda 'char buf[5]; return format_hex_to(buf, data.sync);'
low: !lambda 'char buf[5]; return format_hex_to(buf, data.low);'
high: !lambda 'char buf[5]; return format_hex_to(buf, data.high);'
code: !lambda 'char buf[9]; return format_hex_to(buf, data.code);'

使用此操作在自动化中发送一个标准(0xA5)RF 码。

on_...:
then:
- rf_bridge.send_code:
sync: 0x700
low: 0x800
high: 0x1000
code: 0xABC123

配置选项:

  • sync (必选, int, 可模板化): RF 同步时序
  • low (必选, int, 可模板化): RF 低电平时序
  • high (必选, int, 可模板化): RF 高电平时序
  • code (必选, int, 可模板化): RF 码
  • id (可选, ID): 如果你有多个桥接器或多个桥接器组件,请手动指定 RF 桥接器的 ID。

NOTE

此操作也可以在 lambdas 中编写:

id(my_rf_bridge).send_code(0x700, 0x800, 0x1000, 0xABC123);

激活内部蜂鸣器发出哔声。

on_...:
then:
- rf_bridge.beep:
duration: 100

配置选项:

  • duration (必选, int, 可模板化): 哔声持续时间,以毫秒为单位。
  • id (可选, ID): 如果你有多个组件,请手动指定 RF 桥接器的 ID。

NOTE

此操作也可以在 lambdas 中编写:

id(my_rf_bridge).beep(100);

使用此操作在自动化中指示 RF 桥接器学习新的协议时序。 带有时序的新码将返回给 on_code_received 触发器。

on_...:
then:
- rf_bridge.learn

配置选项:

  • id (可选, ID): 如果你有多个组件,请手动指定 RF 桥接器的 ID。

NOTE

此操作也可以在 lambdas 中编写:

id(my_rf_bridge).learn();

向板载无线电芯片发送一条原始命令。OEM RF 固件只能原始发送标准信号(通常较短);对于其他信号(B0 传输),需要用 Portisch 或 Mightymos 固件刷写 RF 芯片。

这可用于在自动化中发送原始 RF 码,主要用于不受支持的协议。 如果你安装了 Portisch 或 Mightymos 固件,可以通过 rf_bridge.start_bucket_sniffing 操作 获取这些原始码。

on_...:
then:
- rf_bridge.send_raw: # 在 OEM 固件中
raw: 'AAA5070008001000ABC12355'
- rf_bridge.send_raw: # 在 Portisch 固件中
raw: 'AAB04C0408137702440111139B38192A192A1A1A19292A192A1A19292929292A1A1A1A1A192A19292A1A192A192A1A1A1A1A1A1A1A192A1A1A1A1A1A1A1A1A1A1A1A192A1929292A192A1A1929292955'

配置选项:

  • raw (必选, string, 可模板化): RF 原始字符串
  • id (可选, ID): 如果你有多个组件,请手动指定 RF 桥接器的 ID。

NOTE

此操作也可以在 lambdas 中编写:

id(my_rf_bridge).send_raw("AAA5070008001000ABC12355");

无线电微控制器(MCU)可以刷入替代固件,除了标准接收/传输(0xA4,0xA5)之外,它还可以嗅探和传输 高级协议(例如 raw、0xB0、0xB1、0xA8)。 如果你已经用 Portisch 固件 或 Mightymos 固件 刷写了次要 MCU, ESPHome 能够接收这些额外的协议,它们可以被解码,并且可以激活其他受支持的模式。下面的触发器/操作仅适用于 Portisch 固件。 你可以在 Portisch Wiki 中查看可用命令和格式的列表。

类似于 on_code_received 触发器,此触发器在高级嗅探开始后接收码。 要使用该码,请使用 lambda 模板,码以及相应的协议和长度 在该 lambda 中以名为 code、protocol 和 length 的变量提供。

on_advanced_code_received:
- homeassistant.event:
event: esphome.rf_advanced_code_received
data:
length: !lambda 'char buf[3]; return format_hex_to(buf, data.length);'
protocol: !lambda 'char buf[3]; return format_hex_to(buf, data.protocol);'
code: !lambda 'return data.code;'

使用此操作在自动化中发送一个 RF 码。

on_...:
then:
- rf_bridge.send_advanced_code:
length: 0x04
protocol: 0x01
code: "ABC123"

配置选项:

  • length (必选, int, 可模板化): 码加上协议的长度
  • protocol (必选, int, 可模板化): RF 协议
  • code (必选, string, 可模板化): RF 码
  • id (可选, ID): 如果你有多个组件,请手动指定 RF 桥接器的 ID。

NOTE

此操作也可以在 lambdas 中编写:

id(my_rf_bridge).send_advanced_code({0x04, 0x01, "ABC123"});

指示 RF 桥接器监听 portisch 固件中定义的高级/额外协议。 带长度和协议的解码码将返回给 on_advanced_code_received 触发器。

on_...:
then:
- rf_bridge.start_advanced_sniffing

配置选项:

  • id (可选, ID): 如果你有多个组件,请手动指定 RF 桥接器的 ID。

NOTE

此操作也可以在 lambdas 中编写:

id(my_rf_bridge).start_advanced_sniffing();

指示 RF 桥接器停止监听 portisch 固件中定义的高级/额外协议。

on_...:
then:
- rf_bridge.stop_advanced_sniffing

配置选项:

  • id (可选, ID): 如果你有多个组件,请手动指定 RF 桥接器的 ID。

NOTE

此操作也可以在 lambdas 中编写:

id(my_rf_bridge).stop_advanced_sniffing();

指示 RF 桥接器转储原始嗅探数据。对于获取不受支持协议的码很有用。 原始数据将在日志中可用,之后可以与 rf_bridge.send_raw 操作 一起使用。

NOTE

应将 B1(接收)原始格式转换为 B0(发送)原始命令格式。 为此,你可以使用 B1 转换器 工具。

NOTE

Portisch 固件似乎存在溢出问题,过一段时间后,桶嗅探就会停止。 你应该重新调用该操作以重置并重新开始嗅探。此问题在 Mightymos 固件中已修复。

on_...:
then:
- rf_bridge.start_bucket_sniffing

配置选项:

  • id (可选, ID): 如果你有多个组件,请手动指定 RF 桥接器的 ID。

NOTE

此操作也可以在 lambdas 中编写:

id(my_rf_bridge).start_bucket_sniffing();

适用于 Portisch 或 Mightymos 固件

- rf_bridge.send_raw:
raw: 'AAFE55'

以下代码将让你快速上手,把向 Home Assistant 发送的码作为事件,并设置一个服务,以便你可以使用 RF 桥接器发送码。

uart:
tx_pin: 1
rx_pin: 3
baud_rate: 19200
logger:
baud_rate: 0
api:
actions: # 在 HA 中创建操作
# 使用整数值发送标准 RF
- action: 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;'
# 发送原始 RF
- action: send_rf_code_raw
variables:
raw: string
then:
- rf_bridge.send_raw:
raw: !lambda 'return raw;'
- action: learn
then:
- rf_bridge.learn
rf_bridge:
on_code_received: # 所有固件,可根据需要以整数、十六进制或两者形式报告。
then:
- homeassistant.event:
event: esphome.rf_code_received
data:
sync: !lambda 'char buf[5]; return format_hex_to(buf, data.sync);'
low: !lambda 'char buf[5]; return format_hex_to(buf, data.low);'
high: !lambda 'char buf[5]; return format_hex_to(buf, data.high);'
code: !lambda 'char buf[9]; return format_hex_to(buf, data.code);'
- homeassistant.event:
event: esphome.rf_code_received
data:
sync: !lambda 'return data.sync;'
low: !lambda 'return data.low;'
high: !lambda 'return data.high;'
code: !lambda 'return data.code;'
on_advanced_code_received: # 仅在 Portisch 或 mightymos 固件上
then:
- homeassistant.event:
event: esphome.rf_advanced_code_received
data:
length: !lambda 'char buf[3]; return format_hex_to(buf, data.length);'
protocol: !lambda 'char buf[3]; return format_hex_to(buf, data.protocol);'
code: !lambda 'return data.code;'

现在你最近收到的码将在一个事件中。

要从 Home Assistant 触发自动化,你可以使用此代码调用服务/操作:

automation:
# ...
action:
- action: esphome.rf_bridge_send_rf_code
data:
sync: 0x700
low: 0x800
high: 0x1000
code: 0xABC123

ESPHome 中的其他示例配置

button:
- platform: template
name: Advanced sniffing start
on_press:
then:
- rf_bridge.start_advanced_sniffing
- platform: template
name: Advanced sniffing stop
on_press:
then:
- rf_bridge.stop_advanced_sniffing
- platform: template
name: Bucket sniffing start
on_press:
then:
- rf_bridge.start_bucket_sniffing
- platform: template
name: Beep
on_press:
then:
- rf_bridge.beep:
duration: 100
- platform: template
name: Restart Radio
id: mcu_reset
on_press:
then:
- rf_bridge.send_raw:
raw: 'AAFE55'
switch:
- platform: template
name: "example LED strip"
optimistic: true
turn_on_action:
- rf_bridge.send_code:
sync: 0x2F4A
low: 0x0166
high: 0x0483
code: 0x00C301
turn_off_action:
- rf_bridge.send_code:
sync: 0x2F1A
low: 0x0184
high: 0x048C
code: 0x00C303
# 使用 bit-bucket 发送的窗户遮光帘示例。
# 仅在 Portisch/mightymos 固件上有效。
cover:
- platform: time_based
name: "Window blinds"
device_class: blind
open_action:
- rf_bridge.send_raw:
raw: 'AAB04C0408137702440111139B38192A192A1A1A19292A192A1A19292929292A1A1A1A1A192A19292A1A192A192A1A1A1A1A1A1A1A192A1A1A1A1A1A1A1A1A1A1A1A192A1929292A192A1A1929292955'
open_duration: 26.26s
close_action:
- rf_bridge.send_raw:
raw: 'AAB04C0408137E0249010E139C38192A192A1A1A19292A192A1A19292929292A1A1A1A1A192A19292A1A192A192A1A1A1A1A1A1A1A192A1A1A1A1A1A1A1A192A1A1A1A192929292A19292929292955'
close_duration: 25.99s
stop_action:
- rf_bridge.send_raw:
raw: 'AAB04C0408137502490111139F38192A192A1A1A19292A192A1A19292929292A1A1A1A1A192A19292A1A192A192A1A1A1A1A1A1A1A192A1A1A1A1A1A1A1A1A1A192A1A1A1929292A1929292929292955'
has_built_in_endstop: true
assumed_state: false