2026/9/5 6:35:37

把空气开关接入HomeAssistant:用ESP32和PZEM-004T打造全屋用电监测系统

把空气开关接入HomeAssistant:用ESP32和PZEM-004T打造全屋用电监测系统 自从把全屋的照明、插座、新风都接入 HomeAssistant 之后我一度以为配电箱里剩下的就是“最后一块自留地”——那排安静躺在铁盒子里的空气开关。它们负责过载、短路保护是家里用电安全的底线按我的刻板印象这种东西就得纯机械、越少电子干预越好。直到我仔细盘算了一下家里的用电结构和实际需求才意识到事情没那么简单。空气开关负责“保护”但它本身不告诉我任何“状态”。哪个回路现在跑着多少千瓦厨卫的即热式热水器和烤箱是不是同时在工作出门半个月总闸到底拉没拉这些问题传统空开给不了答案。于是“把空开接入 HA”这个念头一旦冒出来就再也压不回去了。折腾了两周花了不到三百块总算把这套东西跑通了。这篇文章就把完整的思路、选型、接线、固件配置和踩坑记录都掏出来想复刻的朋友可以直接照抄。1. 项目整体设计与改造方案选择1.1 核心需求拆解比“能控”更重要的是“能看”做任何智能家居改造我习惯先花时间把需求掰开揉碎。这个项目看起来目标很单纯——把空开的状态接入 HA但往深了想其实包含三个层次远程分合闸控制这是大多数人第一反应的功能。出门之后发现某路电器忘关或者想远程给设备断电重启能通过 App 或自动化直接操作空开。实时用电参数监测包括电压、电流、功率、电量。比起“开”还是“关”这种布尔值这类连续数据更有价值能反映设备运行状态、发现老化隐患还能做能耗统计。与家庭自动化场景联动比如离家模式下自动断开非必要回路、检测到大功率设备异常启动时自动切断并推送告警。这里有个关键认知需要先纠正市面上绝大多数智能空开重点都在“控制”而我认为这套系统里“监测”的价值远高于“控制”。原因很简单——家庭配电的绝大部分操作频率极低但用电数据的价值是持续性的。如果你只是想要一个能遥控的开关花大价钱换智能空开的性价比并不高很多场景用智能插座就能解决。真正不可替代的是“对隐藏在天花板、墙体内部的固定回路进行监测”这是插座方案做不到的。所以在方案设计上我把“监测”放在第一优先级“控制”放在第二优先级如果成本或空间受限甚至可以暂时放弃控制功能。1.2 技术方案选型成品智能空开还是自建方案明确了需求接下来就是选实现路径。目前市面上可行的方案大致分三类成品智能空开像正泰、德力西、施耐德都有 NB-IoT 或 RS485 协议的智能空开产品。优点是一体化、认证齐全、即装即用缺点是价格偏高单路两三百到上千、生态封闭接入 HomeAssistant 通常要额外购买网关或自己写协议插件。普通空开智能模块在标准空开旁边加装带通信功能的测量模块比如采用 Modbus RTU 协议的电力监测仪。适合对精度有要求的场景接线稍复杂同样需要协议转换网关。普通空开自研 ESP 方案用 ESP32/ESP8266 作为主控搭配电流互感器或不间断电源供电的计量芯片把数据通过 WiFi/ESPHome 接入 HA。成本极低、灵活性最高缺点是 DIY 味道重需要自己解决供电和绝缘安全问题。我最终选择了第三种方案里更稳妥的一个变体保留配电箱里原有的空开不动只把智能电表模块加在空气开关的下级出线端这里直接测量每一路出线的电流和电压。这套方案有几个非常实在的好处第一不动原有空开的保护逻辑。热磁脱扣、短路保护、漏电保护全部还是原厂机械结构我做的只是“看着它”而不是“替它做决定”。这等于把改造风险压缩到最低。第二成本可控。一块成熟稳定的单相交流电表采集模块比如 PZEM-004T带互感器方案的价格只要三四十块钱。一个 ESP32 开发板二十多块加上电源模块和外壳一路监测的成本基本控制在六七十元以内。第三接入 HA 极其顺畅。ESPHome 对 PZEM-004T 有原生支持不需要自己啃协议文档配置几行就能出实体。这里要说明一下如果你的需求是“既监测又控制”可以在空开后面串联一个智能断路器模块或者直接上成品智能空开。但从我实测的体验来说先用监测把用电情况摸透再决定哪些回路值得花钱升级控制才是更理性的思路。2. 硬件选型与改造原理2.1 材料清单与选型逻辑以下是我实际用到的物料全部网购即可凑齐PZEM-004T V3.0 交流电表模块这是整个系统的核心感知层。它集成了电压、电流、有功功率、电量计量功能电压测量范围 80~260V AC电流有两个版本一个 100A 配开口式互感器一个 20A 配内置互感器。我用的是 100A 版本因为总进线是 63A我必须留足余量。ESP32 开发板这是系统的大脑和通信中枢。选 ESP32 而不是 ESP8266 的原因很简单——PZEM-004T 默认走 Modbus RTU 串口协议ESP32 的硬件串口有 UART0/1/2 三个可用配置更灵活。而且 ESP32 的 ADC 管脚多以后想扩展漏电流采集、温度采集都还有空间。HLK-PM01 或类似 AC-DC 电源模块把 220V 市电转为 5V 给 ESP32 供电。注意一定要选隔离型电源模块不能选非隔离的原因后面安全部分细说。导轨式 4P 小型断路器或 2P 断路器给 ESP32 和电表模块做一个独立的分路保护方便日后维护时单独断电。开口式电流互感器CTPZEM-004T 100A 版配套的就是开口式互感器好处是改造时不需要断开原有线路直接卡在火线上就行安全性提升明显。绝缘端子、热缩管、线槽、DIN 导轨端子接线和固定用的辅材。阻燃 ABS 外壳给 ESP32 和电源模块做一个绝缘保护壳绝对不能裸奔。2.2 电气原理与接线设计先搞清楚 PZEM-004T 的接线逻辑。这个模块的接线端子分为两部分电源侧模块自身供电接 220V 火线和零线模块内部有电源电路上电即工作。采样侧火线电流互感器从这里穿过同时模块的电压采样端子也并接在被测回路的火线和零线上。需要注意的是PZEM-004T 的供电电源与电压采样端是内部连通的。也就是说模块必须由“被测回路的同一相线”供电才能保证测量电压的准确性。如果你在 A 相取电、却在 B 相采样模块不但测不准还可能因为电压差引入安全隐患。实际接线方式如下入户总空开 → PZEM-004T 电压采样端子(火线、零线) → 分级空开 → 各个回路 ↓ 电流互感器(卡住火线) ↓ 连接 ESP32 串口(UART2, RX/TX/GND)这里有一个细节值得单独说明电流互感器卡的是“负载侧火线”也就是从空开出来去往负载的那根线。如果卡反了或者卡到零线上数据可能是错的或者恒为零。在配电箱里走线密集要特别留意把互感器卡到正确的那根线上。ESP32 和 PZEM-004T 之间通过串口通信接线很简单PZEM-004T TX → ESP32 GPIO16 (UART2 RX) PZEM-004T RX → ESP32 GPIO17 (UART2 TX) PZEM-004T VCC → ESP32 5V如果模块是5V版 PZEM-004T GND → ESP32 GND这里要注意电平匹配问题。PZEM-004T 的逻辑电平是 5VESP32 的 GPIO 是 3.3V 耐压。虽然实际测试中 ESP32 的 RX 引脚接 5V 的 TX 信号短时间不会烧但这不是长久之计。稳妥的做法是在串口线上加一个逻辑电平转换模块或者用分压电阻把 5V 降到 3.3V 再接入 ESP32。我用的是两枚 1kΩ 和 2kΩ 电阻做的分压便宜可靠实测一个月没出问题。2.3 为什么必须重新审视安全设计自己动手改配电相关的东西过头的话必须说在前面。配电箱内是 220V 交流电一旦操作失误后果不只是烧设备而是人身安全风险。以下几个安全原则我建议当成铁律操作前必须断总闸。并且用验电笔确认所有端子都无电之后再动手接线。这是唯一可靠的操作顺序没有商量余地。采样模块与被测回路之间必须有可靠的绝缘隔离。PZEM-004T 的采样端子虽然与内部电路是隔离的但作为 DIY 项目不要信任模块本身电源模块选隔离型、ESP 部分加外壳、所有裸露端子全部用热缩管包好。强弱电分离。在配电箱里走线时220V 线和串口信号线不要并排扎在一起我用的是不同通道的线槽中间留了物理间距。串口信号虽然只有几伏但一旦 220V 绝缘破损高压串进 ESP32整根线全完蛋。这套改造做完之后我自己还做了一次绝缘测试用 500V 摇表测了 ESP32 外壳与配电箱接地端子之间的绝缘电阻数值大于 20MΩ这才放心合总闸。3. 实操装配与接线全过程3.1 配电箱内的物理布局规划国内外标准配电箱内部空间都比较紧凑但好在 PZEM-004T 外壳尺寸比较紧凑互感器又是开口式的占不了多少地方。我的配电箱是 20 位设计当时装完所有空开还剩了 3 位导轨空间正好利用起来第 1 位2P 断路器作整个智能监测系统的总电源分路额定电流 10A 足够里面实际负载不到 1A。第 2 位HLK-PM01 电源模块用 DIN 导轨卡扣固定输出 5V 给 ESP32 供电。第 3 位ESP32 开发板放在一个 3D 打印的透明 ABS 盒子里盒子背面用免钉胶固定一个导轨卡扣安装在配电箱导轨上。PZEM-004T 模块本身不放配电箱内部而是用小导轨端子盒单独固定在箱体外的墙面。原因是配电箱内电磁环境比较复杂互感器采集到的大电流信号和 ESP32 的无线射频之间虽然不至于互相干扰但模块靠近强电走线区检修时操作空间太局促。放外面更安全也更方便日后排查故障。3.2 接线实操步骤记录下面是我当时的完整操作流程每一步都验证过。**第一步断电与验电。**拉下总闸用验电笔逐一对要操作的端子进行验电。这里注意一个细节验电笔测的是相线零线一般不带电但如果负载侧有开关电源之类的设备零线上可能会感应出电压。所以只要是接线一律按有电处理不要偷懒。**第二步安装 2P 断路器和电源模块。**将 2P 断路器的上口接到总空开的出线端下口接 HLK-PM01 的输入端。HLK-PM01 的输入输出标识很清楚我特意看了下外壳印刷L 接火、N 接零输出端 V 接 ESP32 的 5V 引脚V- 接 GND。上电前用万用表蜂鸣档测了一下输出端没有短路这才送电。**第三步安装 PZEM-004T 模块。**先接模块的电源端从 2P 断路器下口引火线和零线到模块的对应输入端子。随后把被测回路的火线穿过开口互感器注意互感器侧面有箭头指示要保证箭头方向指向负载侧。如果有多个回路要监测就并联多个 PZEM-004T 模块每个模块独立配一个互感器共用一组电源但串口线要分别接 ESP32 的不同串口。**第四步连接 ESP32 与模块的通信线。**焊接排针到 ESP32 开发板用杜邦线连接到 PZEM-004T 的 TTL 串口端。因为我在 RX 线上做了分压处理当时特意用热缩管做了标记防止插反。**第五步检查全部接线并合闸。**这步最考验耐心。我用万用表逐个端子确认了接线顺序然后用验电笔确认所有裸露端子都已包好绝缘材料。确认无误后先合监测系统的 2P 断路器观察 ESP32 指示灯是否正常启动再看电脑端 HomeAssistant 是否收到新设备上报。一切正常后再合总闸因为总闸下面是原有用电回路理论上不受影响我始终保持能少动就少动的原则。这一步踩过的第一个坑也顺带说一下PZEM-004T 模块在通电瞬间如果互感器是开路状态模块读数偶尔会出现一个短暂的尖峰几百瓦那种。这不是硬件故障而是互感器开路瞬间的空载感应。解决办法是在互感器输出端并联一个电阻或者在软件里做数据滤波ESPHome 的模板传感器加一个滑动平均过滤器就能搞定后面详细说。4. ESPHome 固件配置与 HA 接入4.1 ESPHome 的完整 YAML 配置解读ESPHome 对 PZEM-004T 的支持非常友好核心配置段是uart和modbus_controller。但这里有个坑ESPHome 官方文档里 PZEM-004T 的配置方式在不同版本之间有过变动老文档让用pzemac组件新版本则要求先用modbus_controller定义再通过寄存器地址读取数据。下面是我实测可用的 ESPhome 配置2024 年后的版本都可以用esphome: name: power-monitor platform: ESP32 board: esp32dev logger: baud_rate: 0 # 禁用串口日志避免与 Modbus 抢串口 uart: - id: mod_uart tx_pin: GPIO17 rx_pin: GPIO16 baud_rate: 9600 stop_bits: 1 modbus_controller: - id: pzem uart_id: mod_uart address: 0x01 update_interval: 10s sensor: - platform: modbus_controller modbus_controller_id: pzem name: PZEM Voltage register_type: holding address: 0x0000 unit_of_measurement: V value_type: U_WORD accuracy_decimals: 1 - platform: modbus_controller modbus_controller_id: pzem name: PZEM Current register_type: holding address: 0x0001 unit_of_measurement: A value_type: U_WORD accuracy_decimals: 2 - platform: modbus_controller modbus_controller_id: pzem name: PZEM Active Power register_type: holding address: 0x0002 unit_of_measurement: W value_type: U_DWORD_WORD_SWAP # 32位寄存器低字在前 accuracy_decimals: 0 - platform: modbus_controller modbus_controller_id: pzem name: PZEM Energy register_type: holding address: 0x0004 unit_of_measurement: kWh value_type: U_DWORD_WORD_SWAP accuracy_decimals: 1这里有两个非常重要的细节绝大多数教程不会告诉你**首先是logger的baud_rate: 0。**ESP32 默认把日志输出到 UART0这本来没什么但如果你把 ESP32 的 TTL 串口接到了 PZEM-004T 上同时日志又往同一个串口发数据就会把 Modbus 通信时序彻底打乱设备读数会时有时无。禁用串口日志后调试信息改走网络日志logger组件依然能通过 HA 界面看到。**其次是地址注册的字节序问题。**PZEM-004T 的功率和电量是两个 32 位寄存器而 Modbus 协议规定 32 位数据的高字在前但 PZEM-004T 实际存储是低字在前。如果按默认方式读取功率值会被拆成两个乱码整数。这里配置U_DWORD_WORD_SWAP就是让 ESPHome 交换高低字数值才能正确显示。这个坑当年我折腾了半个晚上最后是翻了一遍 PZEM-004T 的寄存器手册才想明白的。4.2 多路监测的固件配置扩展思路如果你想监测多个回路比如厨房、卫生间、空调各一路思路很简单每个 PZEM-004T 模块设置不同的 Modbus 地址然后并接到同一组串口线上。模块地址默认都是 0x01需要先通过串口修改模块地址。ESPHome 里可以用modbus_controller的address属性配一个虚拟的写操作来实现但更省事的做法是用电脑串口工具直接改或者干脆一个 ESP32 只接一个模块多路需求就多上几个 ESP32。我实测下来单块 ESP32 同时接 3 个模块时10 秒的更新周期稳稳的数据不丢不重但如果接了 5 个以上更新周期建议拉到 15~20 秒否则串口总线忙线会导致部分轮询超时。每个模块接一路出线互感器卡在对应回路的火线上。需要注意的是各模块的电压采样线都接在同一入户相线上这没问题因为家庭配电本来就是单相或三相同一相上电压是相同的。但电流采样一定不能串线互感器卡哪路读就是哪路的电流。4.3 HA 侧的实体整理与 UI 整合配置刷入 ESP32 后HomeAssistant 会自动发现设备并生成sensor.pzem_voltage、sensor.pzem_current、sensor.pzem_active_power、sensor.pzem_energy几个实体。实际使用时我做了以下整合Lovelace 卡片整理用entities卡片把这些传感器集中放在配电箱面板页面另加一个statistics-graph卡片展示功率的历史曲线。我用的是 Home Assistant 自带的可视化编辑器拖拽就行没有额外装插件。能源面板接入HomeAssistant 自带能源仪表盘但只支持特定的energy实体。在“能源”配置页里把 PZEM 的电量表实体添加为“电网用电”来源就能在能源面板里看到基于实际计量的耗电数据。注意这里数据类型要选“总电量”PZEM 本来就输出从零开始累计的总电量一年下来读数也不会溢出32 位寄存器足够。传感器归一化与显示优化PZEM 的功率传感器偶尔会有突跳。我在 ESPHome 配置里给功率传感器加了滑动平均过滤filters: - sliding_window_moving_average: window_size: 5 send_every: 1这样即使瞬时功率有波动显示曲线也平滑得多触发自动化也更稳定不会被噪声值误触发。5. 自动化应用与数据价值挖掘5.1 离家模式智能断电空气开关接入 HA 之后最直接的收益就是可以实现整回路级别的自动化控制。我在客厅和卧室灯控回路的空气开关出线上都加了监测模块虽然不是直接控制空开本身但只要配合智能壁装开关或断路器就能联动。这里分享一个我实际在用的自动化逻辑当所有人的手机离开地理围栏范围HA 的person实体状态全部变成away就触发以下动作——判断洗衣机、洗碗机、烤箱这类大功率设备是否处于运行状态功率阈值为 50W如果还在运行就不执行断电并推送通知提醒处理确认无大功率设备运行后延时 5 分钟依次断开非必要回路影音设备、书桌插座、客厅氛围灯保留冰箱、弱电箱、安防摄像头这类 24 小时回路的供电。自动化脚本的核心判断条件就是从空气开关的功率读数得来的。换成没有接入 HA 的传统方案你要么买一堆智能插座逐路控制要么就得专门去拉闸很难做到精细化、条件化。5.2 用电异常识别与告警空气开关本来就是保护设备但我发现接上 HA 之后还能多一层“软保护”——当数据持续异常时提前预警。一个典型的例子卫生间的即热式电热水器额定功率 5500W。正常运行时的电流约 25A电压 220V 时功率读数稳定在 5.2~5.5kW 之间。某天我发现它的功率读数掉到了 4.2kW同时电流读数明显偏低并没有报故障。仔细排查后发现是进水滤网半堵导致水流量减小加热体实际工作功率下降。这种缓慢劣化在没有计量数据的情况下根本察觉不到。类似的判断逻辑可以写成 HA 的自动化模板trigger: - platform: numeric_state entity_id: sensor.pzem_active_power above: 5500 for: hours: 0 minutes: 5 condition: - condition: time after: 00:00:00 before: 23:59:59 action: - service: notify.mobile_app_iphone data: title: 功率异常 message: 监测到用电功率超过 5500W 已持续 5 分钟请检查设备触发条件里的 5 分钟延时很关键避免电火锅、微波炉这类短时大功率设备频繁误报。5.3 能耗统计与费用估算PZEM-004T 提供电量累计值配合 HA 自带的能源面板可以做非常精细的能耗统计。我按家电类型把回路进行了分组厨房回路电饭煲、微波炉、烧水壶等特征是短时、高功率集中在饭点卫生间回路即热热水器、浴霸功率曲线与用水时间高度相关空调回路季节性明显夏季 7~9 月功率曲线突变这些数据放在一起就能回答一个很实际的问题每个月光是待机功耗到底吃掉多少度电我在客厅娱乐回路电视、机顶盒、音响、游戏机上装了监测实测一个月待机功耗居然有 3.2 度。加了几个智能插座远程断电之后直接降到 0.4 度。一个月省不了多少钱但电费明细里那种“什么东西都没开却一直走字”的困惑感彻底没有了。6. 常见问题与排查技巧实录6.1 读数为零或数据跳变现象PZEM 的电压正常电流和功率显示 0或者偶尔跳到很大的值又恢复。排查思路先用电脑串口工具单独连接模块发 Modbus 读寄存器指令确认模块本身读数是否正常。如果模块串口读数正常问题大概率出在固件配置或 ESP32 的 TTL 电平上。我之前提到的分压电阻如果虚焊RX 信号质量差就会出现概率性丢字节Modbus 读到的数据自然是坏的。重焊之后问题消失。如果模块本身读数就不正常先检查互感器是否卡对了位置、卡的方向对不对。互感器卡反电流相位直接反 180 度模块读出的功率是负数但电流绝对值还是对的这时候从 HA 里就能分辨。6.2 ESP32 频繁重启现象ESP32 上电后能跑几分钟然后自动重启日志里出现Guru Meditation Error或者 brownout。排查思路这是电源功率不足的典型症状。ESP32 的峰值电流可以到 400mA 以上如果电源模块的输出能力不够或者 ESP32 和 PZEM 模块共用同一个 5V 电源启动瞬间电压跌落会触发欠压保护。我的解决方法是把 PZEM 模块和 ESP32 的供电分开PZEM 从 2P 断路器下口取 220V模块自带电源ESP32 单独用一个 5V/1A 的 HLK-PM01 供电。两个模块之间只连串口信号线不共用电源不良互扰彻底消失。6.3 HA 实体长时间不更新现象HA 里所有实体都是正常的但刷新频率很低甚至超过 30 秒才更新一次。排查思路ESPHome 的update_interval: 10s是指轮询周期但如果你同时在 ESP32 上还跑了其他组件比如 WiFi 信号扫描、SD 卡日志WiFi 断连或延迟会影响上报。还有一个容易忽略的点ESP32 的 WiFi 天线位置如果在铁质配电箱内信号衰减很严重连接虽然显示正常但实际重传率很高导致数据更新变慢。我最后是把 ESP32 的 WiFi 天线用延长线引到了配电箱外面问题才彻底解决。如果你的配电箱是金属壳体这步基本是必须的。6.4 累计电量误差分析现象PZEM 累计电量和供电局电表读数有偏差一个月差了 3~5%。结论这个误差在合理范围内。PZEM-004T 的计量精度是 1.0 级也就是误差 1%以内但家庭供电电压波动、互感器的非线性、功率因数变化都会影响读数。另外PZEM 只计量它所在回路的负载而供电局电表计量的是全屋两者本来就不可能完全相等。如果你有强迫症想校准 PZEM 的读数可以用一个高精度的功率计插座做基准比较同一台设备在两种测量下的功率值然后在 ESPHome 里给传感器加calibrate_linear过滤器做线性校准。我实测把 1800W 电水壶作为基准负载校准后和功率计误差从 3%降到了 0.8%。6.5 安全类问题的红线总结最后这部分是我认为整套改造中最需要反复强调的。家里配电箱属于产权分界点以内的电气设施操作它必须遵守以下铁律非电工专业人士建议先找专业电工确认方案可行性再动手。任何操作前必须断总闸验电粘贴“禁止合闸”标识防止他人误操。加装的模块、电源、通信设备都要有阻燃外壳且不能遮挡原有空开的操作手柄。配线端子必须紧固不能出现压线不牢、线头裸露的情况。这套 DIY 系统只能作为辅助监测手段不能替代空开本身的保护功能更不能在空开因故障跳闸后自动合闸。任何时候都不要通过智能手段自动闭合一个因故障跳开的空气开关。我在做这套系统时前前后后拆装了三次才完全稳定下来。现在每天早上第一件事就是看一眼 HA 里全屋的功率曲线哪个设备该清洗了、哪个回路待机功耗不对都有数。空气开关在我心里的定位也从“一个不能碰的铁疙瘩”变成了“整屋用电的中枢仪表”。如果你也想给自己的配电箱装一双“眼睛”照着我这套来投入不大收获的是对家里用电情况的全新掌控感。有任何配置上的问题欢迎在评论区留言讨论。