跳转到内容

bridges.toml

把 rha 的实体暴露给外部生态(HomeKit 等)。这份文件是可选的——不接对外协议就不用 建,没有它就没有任何对外端口和广播。

方向别搞反:要把外部生态的设备接进来不走这里,那是南向 adapter,写在 devices.toml 里。

[[bridge]]
name = "home"
type = "homekit"
pin = "031-45-154"
export = ["plug_bedroom.switch_s2_on_p1", "thermo_demo.temperature"]
exclude = ["*.indicator_light_*"]

name / type / enabled / export / exclude 是所有协议共有的字段,其余键都是该 type 的私有参数(上例里的 pin 就是)。私有参数的字段表见各协议页,目前是 HomeKit

export 的 glob 与 [storage] 的一样,但空表含义相反

Section titled “export 的 glob 与 [storage] 的一样,但空表含义相反”

export / exclude 的 glob 与 [storage]record / exclude同一份实现,写法可以照搬。但空表的含义正好相反record = [] 是全记,而 export 没有默认值、必须显式写,压根没有「留空」这个选项——照着存储那边的习惯留空, 这里是 check 期错误。

被导出的实体会自动进入高频轮询集合,与被规则引用的实体同等待遇。

不并的话它们走 cold(默认 300s):你在米家 App 里关掉插座、或者按了插座上的物理键, HomeKit 里最长 5 分钟才更新。hot 的定义是「有活跃消费者」,而「我把它导出到 HomeKit」 就等价于「有人会实时看它、点它」——规则引用只是消费者的一种,不是全部。

enabled = false 的语义见下表,这里说的是它一个不太直观的后果:关掉的桥连参数都不 校验。这是跟 [storage].enabled 对齐的——一个已经关掉的东西不该因为参数写错而挡住 整份配置。代价是错误留到重新开启时才报,所以启动日志里会明说「配了但关着」。

bridge 变更不参与热重载rha reload 只重读 automations/。这一点与设备变更一样。

字段类型默认说明
enabledbooleantrue

关掉这个 bridge, 但把配置留着。缺省开启, 与 [storage] enabled 同一套语义。

关掉 = 当它不存在: 不监听、不广播、不校验, 导出集也不并进 hot 集合 (否则关掉 HomeKit 之后那些实体还在被高频轮询, 白烧一份请求)。

必须是显式字段, 不能落进下面的 params —— 它是所有协议共有的开关, 落进 params 就成了每个 bridge 实现各自解析一遍的东西。

excludearray[]

export 之后生效的排除表。语法与 [storage] exclude 完全一致 —— 共用 rha_core::glob, 不是两套看着一样、行为不同的实现。

export*array

导出白名单(实体 id 的 glob, 只支持 *)。

没有默认值, 必须显式写。 从官方 spec 生成型号表后一台插座有 28 个实体, 「默认全导」会把上电默认状态、充电保护、告警阈值一股脑推到 HomeKit 里。

name*string

这个 bridge 的名字。跨 bridges.toml 不能重名(报 duplicate bridge name)。

与设备名不同, 它不要求 snake_case —— 因为它会被当成对外显示名用出去: HomeKit 桥就拿它作「家庭」里看到的桥接器名字和 mDNS 广播名。

配对状态也按它落盘(<配置目录>/bridges/<name>/), 所以给一个已经配对好的桥改名, 等于换了一个全新的桥: 旧目录留在原地, 已配对的控制器要重新配一遍。

type*string

bridge 类型, 对应 BridgeFactory::id()