给 Home Assistant 做桥接设备时,ESPHome 和 OpenMQTTGateway 不是“功能更多者胜出”的关系。如果桥接节点要把一组确定的传感器、继电器、Modbus 寄存器或红外动作稳定映射成 Home Assistant 实体,并在节点本地保留少量逻辑,优先选 ESPHome;如果目标是用一个节点接收多种 BLE 广播、315/433 MHz RF、IR 或串口数据,再统一发布到 MQTT,优先选 OpenMQTTGateway。
最关键的区别是建模方向:ESPHome 从“这台节点上有哪些实体和自动化”出发,OpenMQTTGateway 从“哪些异构协议需要被收进 MQTT”出发。前者更像可配置的设备固件,后者更像多协议采集网关。
| 你的首要目标 | 更合适的选择 | 需要接受的代价 |
|---|---|---|
| Home Assistant 原生实体、低延迟状态更新、节点级逻辑 | ESPHome | 每类硬件要维护 YAML、组件配置和固件构建 |
| BLE / RF / IR 等多协议统一进 MQTT | OpenMQTTGateway | 需要维护 broker、topic、discovery 和解码器边界 |
| RS485 / Modbus 寄存器直接映射成实体 | ESPHome | 需要准确维护寄存器地址、类型、倍率和轮询周期 |
| 大量广播型传感器的集中发现与转发 | OpenMQTTGateway | 设备支持度取决于解码库和射频硬件组合 |
| 同一住宅同时有固定控制节点与长尾无线传感器 | 两者共存 | 运维上要明确命名、责任边界和故障域 |
这张表给出的不是绝对能力清单,而是长期维护的主路径。两套固件都能碰到 MQTT、BLE、IR 或 RF,但如果选错主路径,后续代价会表现为越来越多的自定义 topic、模板实体、lambda 或私有补丁。

1. 先按“实体优先”还是“协议汇聚优先”做判断
Home Assistant 官方把 ESPHome 集成定义为本地推送:Home Assistant 通过 ESPHome Native API 与每台节点保持连接,节点可以直接推送状态并接收命令。对桥接设备而言,这意味着传感器、开关、数值、选择项和在线状态在固件配置阶段就已经有清晰含义,Home Assistant 不需要先理解一套通用 MQTT 载荷。
OpenMQTTGateway 的主路径不同。它把 BLE、RF、IR、LoRa 或串口等信号转换为 MQTT,并通过 Home Assistant MQTT Discovery 创建设备和实体。这个模型更适合协议入口多、设备来源杂、广播数据多的场景,因为网关首先负责“收到并规范化消息”,具体自动化再由 broker 后面的系统处理。
flowchart TD
A("桥接节点最重要的职责是什么?"):::slate --> B("稳定映射已知设备与实体"):::blue
A --> C("汇聚多种无线或串口协议"):::orange
A --> D("两类职责同时存在"):::violet
B --> E("优先 ESPHome"):::cyan
C --> F("优先 OpenMQTTGateway"):::green
D --> G("拆成两个节点或明确双栈边界"):::violet
E --> H("Native API / 本地逻辑 / Modbus 实体"):::blue
F --> I("MQTT / BLE 广播 / RF / IR"):::orange
G --> J("统一命名、可观测性与故障隔离"):::slate
classDef blue fill:#EAF4FF,stroke:#3B82F6,color:#16324F,stroke-width:2px;
classDef cyan fill:#E9FBF8,stroke:#14B8A6,color:#134E4A,stroke-width:2px;
classDef orange fill:#FFF3E8,stroke:#F08A24,color:#7C3F00,stroke-width:2px;
classDef violet fill:#F4EDFF,stroke:#8B5CF6,color:#4C1D95,stroke-width:2px;
classDef green fill:#ECFDF3,stroke:#22C55E,color:#14532D,stroke-width:2px;
classDef slate fill:#F8FAFC,stroke:#64748B,color:#1F2937,stroke-width:2px;
如果一个节点既要承担关键控制,又要持续扫描大量广播设备,先拆分通常比把所有组件塞进同一块 ESP32 更稳。扫描、射频解码和 MQTT 重连会争用 CPU、内存与无线时隙;关键继电器或 Modbus 控制则更需要可预测的循环和故障行为。
2. BLE、IR、RF、串口与 Modbus 的选择边界
2.1 BLE:控制已知设备,还是收集大量广播
ESPHome 的 Bluetooth Proxy 让 Home Assistant 通过 ESP32 扩展蓝牙覆盖范围。它适合 Home Assistant 已经理解目标设备、需要把蓝牙链路延伸到设备附近的场景。节点仍然围绕 Home Assistant 的设备模型工作,部署路径短,诊断也集中在 ESPHome 节点与 Home Assistant 集成。
OpenMQTTGateway 更适合“扫描、解码、转发”型 BLE 网关。官方文档说明其 BLE 解码依赖 Theengs Decoder,并可把广播设备的数据送入 MQTT。若现场有大量温湿度计、胎压传感器、信标或其他广播型设备,而且还要让 Node-RED、OpenHAB 或自研服务消费同一份数据,MQTT 汇聚比只为 Home Assistant 暴露代理更自然。
因此,BLE 选择不应只看支持设备数量:Home Assistant 是唯一上层且需要紧密控制时,ESPHome Bluetooth Proxy 更直接;多个消费者需要共享广播数据时,OpenMQTTGateway 的 MQTT 边界更清楚。
2.2 IR 与 RF:固定动作节点,还是长尾协议入口
ESPHome 的 remote_receiver 与 remote_transmitter 适合已知遥控器、已知协议和固定动作。开发者可以把“学习到的码”“发送动作”和本地条件组合进同一份 YAML。对空调、风扇、幕布或少量 433 MHz 插座,这种写法容易把动作直接映射成 Home Assistant 服务或实体。
OpenMQTTGateway 更适合把 IR、315/433/868/915 MHz RF 等能力集中在一个网关。它借助 RCSwitch、Pilight、IRRemoteESP8266 等上游库覆盖多种协议,并以 MQTT 消息收发。如果目标是接入大量品牌不一的老设备,或者需要观察未知射频流量再逐步补解码,协议网关模式更省重复固件配置。
边界也很明确:如果关键控制依赖一个未验证的 RF 解码器,换成 OpenMQTTGateway 并不会自动提高可靠性;如果只是发送两个固定红外动作,部署完整 MQTT 网关也可能比 ESPHome 节点更重。
2.3 串口与 Modbus:不要把字节转发等同于设备建模
ESPHome 的 modbus_controller 可以把 coil、input、holding register 和 read register 映射为 sensor、switch、number、select 等实体。对于电表、热泵、逆变器、空调控制器或 RS485 传感器,这种“寄存器到实体”的路径通常最短。
OpenMQTTGateway 的 Serial gateway 可以在串口与 MQTT 之间发送和接收数据,也支持把串口 JSON 拆成 MQTT topic。但它解决的是串口消息搬运,不等于自动理解 Modbus 寄存器、字节序、倍率和轮询策略。若仍需在 Node-RED 或自研服务里解析 Modbus,系统只是把协议语义从桥接节点移到了服务器端。
所以在 Modbus 场景里,少量已知设备、需要直接形成 Home Assistant 实体时选 ESPHome;自定义串口协议需要先汇入通用数据总线,且团队已经有服务器端解析能力时,OpenMQTTGateway 才更有吸引力。
3. 真正拉开差距的是依赖与运维模型
| 运维维度 | ESPHome | OpenMQTTGateway |
|---|---|---|
| 上层连接 | Home Assistant Native API 为主,也可使用 MQTT | MQTT broker 为核心边界 |
| 配置单位 | 每台节点的 YAML、组件与固件 | 网关构建、WebUI / 运行配置、topic 与解码器 |
| 状态模型 | 预先定义的 Home Assistant 实体 | 协议消息先进入 MQTT,再由 discovery 或消费者解释 |
| 故障域 | 单节点与 Home Assistant 连接 | 网关、网络、broker、discovery 与消费者链路 |
| 扩展方式 | 增加组件、lambda 或外部组件 | 增加协议模块、解码器或 MQTT 消费逻辑 |
| 多系统共享 | 可以走 MQTT,但不是最短路径 | 天然适合多个 MQTT 消费者 |
ESPHome 的主要成本是配置碎片化。节点数量增加后,团队要治理 packages、secrets、板型差异、实体命名和 OTA 节奏。OpenMQTTGateway 的主要成本则是消息治理:topic 设计、retain、availability、broker 权限、发现消息和解码器版本都需要成为运维对象。
如果家庭里只有 Home Assistant,一个额外 broker 可能增加无必要的共享故障点;如果现场已经把 MQTT 当作统一事件总线,强行让所有协议都走 Home Assistant 专用连接又会限制数据复用。选择应跟现有控制平面一致,而不是另起一套中间件。
4. 三种可落地的部署方式
4.1 ESPHome 单节点:适合确定、稳定、可建模的桥接
典型组合是 ESP32 + RS485 收发器,或 ESP32 + IR 收发头。每个寄存器、开关或动作都在配置中有名字,Home Assistant 直接看到实体。它适合设备清单稳定、自动化依赖明确、出现故障时需要快速定位到具体实体的项目。
不适合的情况是协议来源不断增加,而且多数设备只有广播数据。此时每加入一种长尾设备都修改节点配置,会把本来简单的实体固件变成通用网关。
4.2 OpenMQTTGateway 单节点:适合异构协议集中采集
典型组合是 ESP32 + BLE + CC1101 / RF 模块,或 BLE + IR。网关把信号统一送入 broker,Home Assistant 通过 MQTT Discovery 获取设备,其他系统也能订阅同一数据。它适合被动传感器多、协议杂、数据消费者不止一个的现场。
不适合的情况是桥接节点承担安全相关或强确定性的本地控制。MQTT topic、broker 和消费者链越长,越需要补权限、离线策略、命令确认与审计,而不能把 discovery 成功当成控制可靠性。
4.3 混合部署:让每个节点只承担一种主要职责
最稳的混合方案通常不是一块板刷两套逻辑,而是把关键控制与协议采集分开:ESPHome 节点负责继电器、Modbus 和固定红外动作;OpenMQTTGateway 节点负责 BLE 广播与长尾 RF。Home Assistant 在上层统一自动化,但两种节点保留独立升级和回滚路径。
混合部署的代价是设备数量增加,不过它换来了更清楚的故障隔离。射频扫描异常不应拖慢冷柜控制,broker 维护也不应让本地温控节点失去基本动作能力。
5. 哪些情况下两者都不是最佳答案
- 需要认证级可靠性或安全联锁。 ESP32 桥接固件不应替代安全 PLC、硬接线保护或经验证的控制器。
- 需要 Thread / Zigbee 网络协调器。 这类网络应优先使用成熟的 Border Router、ZHA 或 Zigbee2MQTT 路径,而不是把 BLE / RF 网关当成通用协调器。
- 需要大规模设备生命周期管理。 当节点达到数百或数千台,配置仓库、OTA、证书、库存、遥测和回滚需要平台化,不能只靠家庭自动化式的节点管理。
- 协议需要复杂事务或强时序。 多步骤握手、总线仲裁或厂商私有状态机可能需要专用固件或 Linux 网关。
- 团队无法维护所选依赖。 不熟悉 MQTT 运维时不要因为“协议多”就引入 broker;不愿维护每节点配置时也不要把所有功能都做成 ESPHome YAML。
6. 开始制作桥接节点前的检查清单
- 写清上层消费者:只有 Home Assistant,还是还有 Node-RED、自研平台与数据仓库。
- 把协议分成控制型与采集型:控制需要确定性、确认与离线策略,采集更关心覆盖和解码。
- 明确设备模型放在哪里:固件实体、MQTT discovery,还是服务器端解析。
- 为 broker、Home Assistant 和节点分别定义离线行为,不把“断线重连”当作完整容错。
- 先做一台节点的长时间扫描、内存、Wi-Fi 与重连测试,再复制部署。
- 固定命名、topic、实体 ID、固件版本和回滚方式,避免后期重复实体与遗留 retained 消息。
如果前四项答不清,先不要选固件。桥接节点失败往往不是因为“少支持一个协议”,而是系统从未决定谁负责建模、谁负责命令、谁负责断线后的行为。
结论
ESPHome 更适合把已知硬件做成 Home Assistant 能直接理解和控制的设备;OpenMQTTGateway 更适合把多种无线或串口信号汇聚成可被多个系统消费的 MQTT 数据流。前者的优势是实体清晰、Native API 紧密、本地逻辑容易放置;后者的优势是协议入口广、广播设备友好、数据总线边界明确。
如果必须用一句话做选择:从“我要做哪些 Home Assistant 实体”出发,选 ESPHome;从“我要把哪些协议收进 MQTT”出发,选 OpenMQTTGateway。 同时存在两种目标时,把关键控制和长尾采集拆成不同节点,通常比追求一块万能 ESP32 更容易维护。
延伸阅读:
参考资料
- Home Assistant ESPHome integration: https://www.home-assistant.io/integrations/esphome/
- ESPHome Native API: https://esphome.io/components/api/
- ESPHome Bluetooth Proxy: https://esphome.io/components/bluetooth_proxy/
- ESPHome Modbus Controller: https://esphome.io/components/modbus_controller/
- ESPHome Remote Transmitter: https://esphome.io/components/remote_transmitter/
- OpenMQTTGateway documentation: https://docs.openmqttgateway.com/
- OpenMQTTGateway Home Assistant integration: https://docs.openmqttgateway.com/integrate/home_assistant.html
- OpenMQTTGateway Serial gateway: https://docs.openmqttgateway.com/use/serial.html