openrig:基于ESP32与MQTT的智能继电器控制中枢及Home Assistant集成指南 收到我来用资深从业者的角度把 openrig 这个项目拆开揉碎讲清楚。先说个背景。我去年帮朋友做一套小型工作间的环境监测与控制设备翻遍了市面上的成品智能通断器要么价格离谱要么封闭协议没法二次开发要么数据根本拿不出来。后来在开源的犄角旮旯里翻到 openrig 这个项目一眼就相中了。如果你也在折腾智能家居或者小型自动化改造手里有 ESP32 开发板想用一套还算干净的开源方案把继电器、传感器、执行器统一管起来并且能无缝接进 Home Assistant那 openrig 是个很值得研究的起点。这篇就来聊聊它到底解决什么问题、怎么部署、怎么和 HA 联动以及我实际踩过的几个坑。1. openrig 是什么一枚高性价比的智能控制中枢openrig本质上是一个基于 ESP32 的固件项目它的定位很清晰把开发板变成一个可以通过 MQTT 协议远程控制的“多路继电器 多路传感器 基础自动化”组合体。你不需要自己从零写 TCP 协议不需要折腾复杂的加密通信只要把 Wi-Fi 连上、MQTT Broker 地址填对设备就能快速接入现有的家庭自动化体系。1.1 核心需求解析为什么不用成品智能插座我见过太多人一开始买一堆 WiFi 插座、红外遥控器最后发现最大的问题不是“不能控制”而是“控制不了状态”。WiFi 插座被你手动按了一下App 里还是“关”传感器电池没电了报警逻辑还挂在旧状态上。这种半吊子的状态同步在做自动化的时候非常致命。openrig 的解决思路不一样。它把设备端的开关状态、传感器读数、连接状态全部通过 MQTT 的 retained 消息实时上报Broker 端永远保存最新状态。任何新接入的客户端订阅同一个 Topic 就能立刻拿到当前设备的真实情况而不是靠轮询去猜。这一点是大量成品智能硬件做不到的。1.2 为什么是 ESP32 而不是树莓派或其他方案很多人问我跑自动化我用树莓派不是更强吗还有 Docker、Node-RED、各种 fancy 的东西。没错树莓派是更强但它强在对性能敏感的应用比如图像识别、视频流处理、复杂规则引擎。openrig 的目标场景恰好相反它要的是7x24 小时低功耗运行、启动速度快、接线简单、坏了成本低。ESP32 板子几十块钱坏了重新烧录固件五分钟恢复功耗在毫瓦级别树莓派做不到这一点。而且 ESP32 的 GPIO 引脚可以直接驱动继电器模块内置 ADC 直接读模拟传感器原生支持 WiFi 和蓝牙这些特性集中在几十块钱的开发板上性价比确实没得选。1.3 功能清单一个能打的控制面板我用了大半年openrig 给我留下的印象可以归纳成这样几个层面多通道继电器控制通过 GPIO 直接控制继电器模块支持开、关、脉冲三种模式脉冲时长可以配置到毫秒级用来控制门锁、自锁电路非常顺手。传感器接入支持读取模拟量通道和常见数字传感器比如温湿度、光照强度、水位等数据统一走 MQTT 上送。** OTA 无线升级**固件迭代不需要拆机接线直接在 Web 管理页面上传 bin 文件。** Web 配置界面**开机后设备提供 AP 模式手机连上之后就能配置 Wi-Fi、MQTT 参数不用装任何驱动软件。与 Home Assistant 原生集成通过 MQTT Discovery 实现自动发现实体接入 HA 之后设备和传感器会自动出现在仪表盘。这套组合很有吸引力因为它覆盖了“数据采集 执行控制 系统集成”整个链路而不是只做其中某一个环节。对于小型自动化项目来说一个足够简单的闭环比一堆强的模块拼起来更可靠。2. 硬件选型与首次部署从零点亮开发板项目层面无论多漂亮落地的时候还是要回到硬件。我把自己实际用的一套配置和踩坑经历写下来照抄基本能跑通。2.1 硬件清单与选型避坑核心硬件ESP32 开发板建议选 WROOM-32 模组版本的GND/GPIO 引出完整的那种。注意别买成 ESP32-C3 或者 S2引脚定义差异比较大直接照着 openrig 默认配置用 WROOM-32 最省事。继电器模块我用的两路和四路版5V 供电输入信号脚带光耦隔离。选继电器的时候重点看背后是否带续流二极管和光耦没有的话在 ESP32 断电瞬间很容易把 GPIO 打坏。传感器部分我初期只接了 DS18B20 温度传感器和一个光敏电阻模块都是 3.3V 就能驱动的型号不用额外电源。接线的时候有一个容易翻车的细节继电器模块虽然是 5V 供电但信号输入引脚的电平逻辑很微妙。部分模块直接用 5V 做上拉如果 ESP32 的 GPIO 不是开漏/耐压模式直接接 3.3V 输出是能用的但反过来如果模块要求 5V 逻辑那 ESP32 就带不动。所以买模块的时候一定要看清楚说明选“3.3V 信号兼容”的型号否则你排查半天还以为代码写错了。提示所有接线都遵循“先电源、后信号”的顺序。先把 5V 和 GND 接好再插信号杜邦线。我之前偷懒反向操作结果继电器吸合瞬间的电流尖峰把开发板复位了排查了整整一个晚上。2.2 固件烧录第一次点亮板子openrig 的固件可以在 Releases 页面直接下载编译好的二进制文件也可以自己用 PlatformIO 从源码构建。我建议新手第一轮直接下载官方固件跑通整个链路之后再考虑改代码。烧录工具我用的是 esptool.py。Windows 和 macOS 都有预编译版本安装也不复杂。接到 ESP32 之后先按住板上 BOOT 键再插 USB进入下载模式然后执行esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash \ --flash_mode dio --flash_size 4MB \ 0x1000 openrig-firmware.bin这里有个细节0x1000是 ESP32 的引导程序偏移地址不能随便改。烧录完成后按一下复位键打开串口监视器波特率调到 115200能看到设备进入 AP 模式的日志。2.3 首次配置把设备连上你的 WiFi第一次上电ESP32 会开一个名字类似openrig-xxxx的无线热点密码在项目文档里有默认值。手机连上这个热点浏览器访问192.168.4.1就能看到配置页面。页面里需要填的信息主要是无线路由器的 SSID 和密码MQTT Broker 的地址和端口默认 1883设备名称注册到 MQTT 后作为 Topic 前缀配置保存之后设备会自动重启重启后不再开热点而是连接你填的 WiFi。这里我踩过第一个坑配置页保存后如果连不上 WiFi设备会一直尝试连接这时候你想重新配置需要按住板子上某个 GPIO 按键进入“恢复模式”。不同版本触发方式不一样有的是 GPIO0 接地开机有的是按住 BOOT 再上电。我建议保存配置之前先把恢复模式的操作步骤抄下来贴在设备旁边不然你会狼狈地蹲在弱电箱前面一遍遍拔插 USB。2.4 OTA 升级后续维护不用拆机箱OpenRIG 的 Web 界面里提供了 OTA 升级入口不需要像第一次烧录那样接串口线。上传编译好的新固件.bin文件进度条走完设备自动重启。OTA 唯一的风险是新固件可能存在配置不兼容的情况升级后设备会启动失败。所以我现在的习惯是升级前先通过 Web UI 导出一份配置备份升级后如果设备反复重启就用恢复模式重新刷回旧版本。这套流程走顺了维护成本其实极低。3. 系统集成接入 Home Assistant 与自动化配置如果说烧录固件是让设备“活着”那接入 Home Assistant 就是让设备“干活”。3.1 MQTT Broker 搭建与配置没有任何 MQTT Brokeropenrig 就是个孤岛设备。我自己一直在用 Mosquitto容器化部署非常简单docker run -d --name mqtt \ -p 1883:1883 -p 9001:9001 \ -v /opt/mosquitto/config:/mosquitto/config \ eclipse-mosquitto:2如果 Mosquitto 2.0注意默认配置不允许匿名访问。在mosquitto.conf里至少加两行allow_anonymous true listener 1883不过生产环境我强烈建议关掉匿名访问创建独立用户和密码。MQTT 的 Topic 结构虽然不敏感但你家里的门锁、窗帘执行器全挂在里面的时候裸奔的 Broker 就跟你家门钥匙放门口地垫下面一样刺激。3.2 自动发现机制为什么接上就能用Home Assistant 对 MQTT 设备有一套“Discovery”协议。简单理解就是设备在特定的 Topic 上发布一个 JSON 配置HA 收到后自动创建对应实体。openrig 固件启动后会自动向homeassistant/switch/设备名/config这类 Topic 发布发现消息。只要你在 HA 的configuration.yaml里配置好了 MQTT Broker 地址设备通电连上 WiFi半分钟内 HA 里就会多出对应的开关实体和传感器实体。这里有个前置条件HA 里必须先配好 MQTT integrationmqtt: broker: 192.168.1.10 port: 1883 username: ha_user password: your_password discovery: truediscovery: true是关键。很多人配了 Broker 但没开 discovery折腾半天发现设备不自动出现就是因为少了这一行。3.3 实体映射与控制逻辑OpenRIG 在 HA 里生成的实体很有规律每个继电器通道对应一个switch.实体如switch.rig_01_channel_1每个传感器通道对应一个sensor.实体如sensor.rig_01_temperature我在 HA 里做的第一个自动化是“温度过高自动开风机”。逻辑很简单DS18B20 读到温度大于 32°C打开继电器通道 1驱动风机温度回落到 28°C 以下关闭风机避免频繁启停。自动化配置大概长这样alias: 机房降温风扇 trigger: - platform: numeric_state entity_id: sensor.rig_01_temperature above: 32 condition: [] action: - service: switch.turn_on target: entity_id: switch.rig_01_channel_1 mode: single另一个反向自动化把温度降到 28 以下时关闭。这套逻辑跑了大半年非常稳定。唯一要注意的是HA 的 numeric_state 触发有个默认的 5 秒去抖时间温度传感器跳动剧烈的话可以在 trigger 里加for: 00:00:10避免误触发。3.4 从自动化到场景实际接线示例我房间里的整套联动方案是这样的继电器通道 1桌面补光灯通过 HA 自动化让它在天气阴沉的时候自动开。继电器通道 2外接水泵花盆湿度低于阈值时浇水 30 秒。DS18B20 传感器贴在水培箱外侧监测水温。光敏传感器放在窗边用于判断“白天/夜间”状态驱动灰度逻辑。这些场景如果用成品智能硬件堆至少需要三个不同品牌的多设备配合出问题的环节成倍增加。而 openrig 一块板子全搞定信息都在同一个 Broker 上排错链路短逻辑可控性高。对我这样的单打独斗型玩家来说这个简洁度是真实生产力。4. 扩展玩法与稳定性调优项目跑稳定之后我开始折腾扩展。openrig 的好处是 GPIO 引脚富余很多加一路传感器或者执行器完全不用动固件主要逻辑。4.1 添加自定义传感器与执行器想把一个普通土壤湿度传感器接进 openrig原理很简单传感器的模拟输出接到 ESP32 的 ADC 引脚在固件配置里新增一个 ADC 通道。如果固件本身支持自定义 ADC 引脚和量程直接在 Web 界面里填参数就行不支持的话就看你自己会不会改源码。我个人是把光敏电阻模块接到了 34 号引脚这个引脚是 ESP32 的 ADC1 通道可以直接读模拟量。换算成光照百分比后在 HA 里加一个template传感器sensor: - platform: template sensors: light_level_percent: friendly_name: 光照强度 unit_of_measurement: % value_template: {{ state_attr(sensor.rig_01_analog_1, value) | int / 4095 * 100 | round(0) }}这样 HA 界面里就有了一个 0-100% 的光照百分比实体。我用这个实体触发窗帘自动化实测效果比单纯靠时间判断天气可靠得多尤其是阴雨天的时候。4.2 状态反馈与错误处理openrig 在我这跑的过程中发生过几次继电器状态和实际物理状态不一致的情况排查下来基本都是因为继电器模块触点老化、吸合不到位并不是固件问题。但这不是说固件没有贡献改进空间。我后来在自动化里加了一个“状态校验”机制HA 向 openrig 发送开灯指令后等待 2 秒重新读取传感器的回传状态如果发现没有变化就再触发一次指令或推送错误通知。这套机制虽然简单但能避免大冬天补光灯默默地罢工一整天。4.3 布线设计与电源规划电源规划这块我想单独强调一下因为直接关系到项目能否长期稳定运行。ESP32 的工作电流在 Wi-Fi 开启时峰值能到 300mA 以上如果是 5V 供电的继电器模块同时吸合多个通道瞬时电流可能冲到 1A 甚至更高。很多“不稳定”问题根本不是代码问题而是 USB 供电能力不足导致的电压跌落。我的方案是开发板用独立的 5V/2A 电源适配器供电继电器模块的 5V 也走同一路电源但两个 GND 要共地。这样信号电平有共同参考点不会有浮动电压把 GPIO 拉坏。传感器如果功耗小直接用 ESP32 的 3.3V 引脚供电功耗大的单独给传感器电源模块。4.4 低功耗与稳定性优化如果你想省电openrig 里有几个可以调的点降低 MQTT 的心跳上报频率比如温度传感器本来 5 秒一报改成 30 秒一报Broker 压力小很多。不需要频繁控制的继电器通道不要开启持续保持省下的电不多但对电源纹波是有帮助的。定时重启定时如果设备长时间跑内存泄漏导致不稳定可以在 HA 里写一个每周自动重启 openrig 的自动化。虽然是“治标不治本”但对长周期运行很有效。注意ESP32 的 ADC 默认有非线性和温漂问题如果你是用来做精确测量比如 0.1V 级别的电池电压监测需要先标定。我之前直接用默认 ADC 读电压误差最大到了 5%后来加了分压电阻和软件线性校准才把误差压到 1% 以内。5. 常见问题排查与避坑实录这部分是真正花时间熬出来的经验。我把遇到过的典型问题整理成一张速查表方便你出问题时照着排查。5.1 速查表设备问题定位现象可能原因排查步骤设备无法连接 WiFi2.4G 频段被禁用确认路由器开了 2.4G5G 频段 ESP32 不支持配置页面打不开电脑没连上 openrig 热点确认手机/电脑 WiFi 访问的是设备热点而不是自家 WiFi继电器不动作信号线接反 / 继电器供电不足测量继电器 VCC-GND 电压必须稳定在 4.5V 以上传感器读数忽高忽低电源纹波过大检查是否共地加 100uF 电容在电源端HA 中设备不自动出现discovery 未开启确认configuration.yaml里mqtt.discovery: trueMQTT 一直断线重连Broker 地址端口错误或用户名密码错误用 MQTT 客户端工具直接连接 Broker 测试排除网络问题升级固件后无限重启分区配置或配置数据异常进入恢复模式清空配置重新配置或重新刷旧版固件5.2 MQTT 消息发不出先别怀疑固件第一次调试的时候我遇到“设备已连 WiFi但 HA 里看不到设备”第一反应是刷固件。后来静下心排查才发现是 Mosquitto 2.0 的默认配置不允许匿名访问openrig 设备那边填的用户名密码不对导致设备虽然连上了 WiFi但发布消息时被 Broker 拒绝。这个排查思路后来成了我的固定流程先验证 Broker 是否通畅 → 再验证设备是否连上 Broker → 最后才考虑固件和配置问题。盲目刷固件只会把简单问题复杂化。用 MQTT 客户端工具比如 MQTT Explorer订阅一个测试 Topic如果设备发布的消息能收到说明链路没问题。收不到的话优先看 Broker 日志几秒钟就能定位拒绝原因。5.3 OTA 刷机失败还是变砖了openrig 支持 OTA但 OTA 对电源稳定性非常敏感。刷机过程中如果电压跌落可能写到一半断电导致固件分区变成半成品。我的建议是 OTA 刷机时不要在仪器已经启动的情况下进行尽量把负载设备先断电减少电源波动。另外OTA 之后一定要验证设备能正常启动再离开现场最好等个 5 分钟观察指示灯状态和串口日志。这样能把“刷机五分钟、救砖两小时”的尴尬降到最低。5.4 继电器误动作多半是信号电平问题有一阵子我的继电器会在半夜自己吸合一下排查发现是 GPIO 悬空导致。ESP32 的 GPIO 在启动期间状态不稳定如果继电器输入信号线没有默认下拉上电瞬间的高电平就可能触发一次误动作。解决方案在信号线与 GND 之间并联一个 10KΩ 下拉电阻。如果是用模块很多模块自带下拉电阻那你把板子选型时多看一眼即可。这个细节当时折腾了我两个晚上血的教训写在这里。结语从硬件选型到固件部署从 MQTT 接入到 HA 自动化openrig 给我的感觉是它不追求大而全而是把一个很务实的控制场景做到完整闭环。对于自己搭智能家居、小型工作室联网设备、甚至实验室环境监控的人来说这套方案是成本低、代码透明、可维护性很高的选择。我个人在实际操作中最深的体会就是一切自动化系统的稳定性都建立在“真实状态可获取”这个基础上。openrig 通过 MQTT retained 消息把状态时刻握在手里后面做任何逻辑、场景、告警都踏实。最后再分享一个小技巧如果你打算长时间使用记得在 HA 里给 openrig 建一个“系统监控”仪表盘把信号强度、运行时长、最近更新时间都放上去哪天出问题的时候这些数据能帮你少走很多弯路。