利用三个 DIN 导轨三相电表构建一个监控仪器
这是一个车间自动化项目,从配电箱开始。三个 DIN 导轨三相电表、一个 ESP32 控制器、九个分流式电流互感器,以及一条决定这些数据是否有意义的接线规则。
为何从配电箱开始?
这家店铺最终希望 Home Assistant 能掌控整个场所——开关柜中的保护装置、压缩机监控、摄像头、照明系统等。但实际能实现多少功能,取决于业主及其预算。因此,我们把项目范围设定为一个独立运行的配电箱,让之后的所有设备操作都更加便捷。
我们从能源计量开始,并非因为电费账单特别高——这是一家小型店铺,而非工厂。我们选择从这里开始,主要有三个原因。
配电箱现在是开放的。电流互感器安装在配电箱内部的带电导体周围。在装修期间完成这项工作只需二十分钟;但事后进行则会导致停电,还必须花一整天时间处理。同样,RS-485 通信线路和所有其他设备所依赖的 24V 电源线路也是如此。如果你打算开启一次配电板,就请在此次访问中将所有需要的设备都从里面取出。
计量是其余一切的基础。保护装置需要测量数据才能发挥作用。负荷削减必须知道每个电路的用电情况。“压缩机在不该运行时仍在运行”是一个电流读数,而在此之前才到自动化阶段。先构建感知层,之后的每一个阶段只需几行YAML代码,无需再次钻孔。
这些模块本身已自带输出接口。每个电表都配有两个干接点继电器和本地逻辑,无论网络是否正常都能运行。这项工作目前并未使用它们。如果以后车间需要为压缩机设置非工作时间切断功能,或相位丢失、低电压保护,其对应的硬件早已集成在配电箱中。
因此,本文介绍的就是感知层:九个电流通道、一个外壳,所有内容在Home Assistant中可见,无需云账户,也无需订阅。包括我第一次搞错的那个部件。
配电箱中的组件:
三个35毫米DIN导轨上的四个模块:
MicroPLC — ESP32,RS-485主控,通过原生ESPHome API连接至Home Assistant。
3 × ENM-223-R1 — 三相电能表每个模块均为带有三个电流输入、L1/L2/L3/N/PE电压输入、两个SPDT干接点继电器以及一个RS-485端口的ATM90E32AS前端。
需要明确指出的是,由于布线设计隐蔽,ESP32本身从未直接接触过电流传感器。它仅作为RS-485主站,并通过桥接连接至Home Assistant,除此之外别无他物。每个ENM(电子测量单元)都是独立的仪器——配备RP2350和ATM90E32AS量测前端——持续进行测量,并保持本地报警逻辑运行,无论控制器、网络或服务器是否在线。
每个模块可提供各相及零线的Urms和Irms电流值,以及有符号的有功/无功/视在功率、功率因数、相位角、总谐波失真(THD)、线路频率、电路板温度,同时记录每相及总的累计进出口电能。
此外还包括九个分裂芯电流互感器、一个24V直流安全隔离电源(SELV)、端子块和机箱。整个系统共四个模块宽,安装于现有配电柜下方。
通道布局
模块 通道 电路
•ENM #1 CT1 / CT2 / CT3 主进线 L1 / L2 / L3
•ENM #2 CT1 / CT2 / CT3 车辆升降装置 L1 / L2 / L3
•ENM #3 CT1 压缩机 — 单相,3kW,接通L1
•ENM #3 CT2 照明设备,接通L2
•ENM #3 CT3 插座,接通L3
模块3上的三个负载都是单相的,因此它们可以共享一个模块——详见下一部分。本车间的压缩机恰好是单相的;如果是三相的,则需要单独的模块,就像升降机一样。
输入端给出了总和,四个子电路解释了这一点。剩余的部分——输入端减去总和的结果——就是未被计量的车间部分,而这个数值通常才是最有趣的数据。
请看最后三行中的相位,它们并非装饰。
打破简单通道规划的规则
每个当前通道都会被相同数量的电压输入值乘以。例如,CT1 与 L1 相关联,CT2 与 L2 相关,CT3 与 L3 相关。这一过程发生在计量芯片内部,而在此之前,任何 Modbus 数据都尚未到达。
对于三相负载而言,这种情况是自动且隐性的。但对于单相分支来说,却是一个硬性限制:从 L1 提供电源的分支必须固定在 CT1 上。如果将两个来自 L1 的分支连接到 CT2 和 CT3,芯片就会将它们的电流分别乘以 L2 和 L3 的电压,从而得到数值。这些数值看起来合理,但实际上错误——而且不是“量程比例偏差”导致的错误,因为电流与对应电压之间的相位角毫无意义,因此有功功率、无功功率和功率因数全都变得毫无意义。Home Assistant 中的任何算术运算都无法纠正这种错误。
我曾将两个钳位器安装在同一相上,并花了一整晚时间构建模板传感器来抵消彼此的影响,直到一个显而易见的问题突然出现。请将本节视为我最希望先读到的内容。
所以:一个三通道模块要么测量一个三相负载,要么测量三个不同相位上的单相分支。如果四个单相电路都接在L1上,你需要四个模块的CT1输入端口——或者先将负载重新分配到各相,通常面板本身也已具备这种优势。
在夹紧任何设备之前,请手持相位测试仪规划配电板上的通道,并记录每条支路的相位。
接线前其他注意事项:
仅限电流输出型CT。这些输入端需要一个额定值为毫安(mA)的二次侧,最高可达120/60/30 mA(PGA ×1 / ×2 / ×4),出厂默认为60 mA。此处使用的钳形表为YHDC SCT-013,100 A:50 mA,1级精度——在初级电流满量时仍可安全达到50 mA,远低于60 mA的默认值。电压输出型钳形表(333 mV和1 V型号,外壳外观相同)读数不准确,且1 A或5 A的二次侧与该输入不兼容,可能损坏模块。请务必查看每个钳形表上的型号;有效标识是显示“mA”的那一行,而非“A”这一行。
切勿在初级通电时打开CT的二次侧。应先将导线连接至模块,最后再安装钳形表。
方向至关重要。箭头P1→P2、K→L的方向应朝向负载,否则读数将显示负功率。
请仔细阅读丝印标签。在本模块中,CT1位于最下方一行,而CT2和CT3位于上方;电压输入线从L3、L2、L1按从右到左的顺序排列;RS-485接口为B-A-COM。同一系列中的其他模块并不完全相同,因此习惯性布线并非标准接线图。
延长CT导线时应使用屏蔽双绞线,屏蔽层仅在面板端连接,并且要避免将导线与相位导体一起放入同一束中。
安装前的标识说明:
九根相同的细黑色导线从该箱体引出,向上连接至主板。若未做标记,每次有人触碰时都需用钳形表测量。每根导线两端均需贴有标签:模块端和钳子端,标签上注明通道编号(ENM3-CT2)、电路名称(LIGHTING)、相位(L2)以及钳子方向的“LOAD”。根据IEC标准,颜色编码如下:棕色代表L1,黑色代表L2,灰色代表L3,蓝色代表N,绿色代表PE。主板的供电线路也采用相同处理方式,门内侧则标注通道调度表。
其副作用是,通过照片即可检查反向钳子的状态。
安装过程
1. 通过USB-C配置每个模块。WebConfig在Chromium浏览器中运行——无需驱动程序,无需应用程序。设置Modbus地址(1–247,三种不同值)、波特率以及与您安装的夹具相匹配的CT比率。设置信息存储在模块的闪存中。
2. 总线。每节点连接A/B双绞线加COM,仅在两个物理端进行120Ω阻抗匹配。
3. 控制器。MicroPLC 运行的是从 GitHub 直接拉取的预置 ESPHome 包,每个模块仅实例化一次,并拥有独立的 Modbus 地址和名称前缀。所有寄存器在 Home Assistant 中以实体形式呈现,无需手动编写 Modbus 寄存器映射。应将该包关联到某个标签或提交记录,而非主分支:配电箱中的面板不应因分支变动而改变其行为。
4. 在信任任何内容之前,请先确认方向和通道。开启一个已知的负载,确认哪个通道移动以及信号为正。花五分钟,就能避免一周的混乱记录。
Home Assistant
三个模板传感器值得拥有。第一个是带符号的偏差——输入电流减去各分支电流之和。保留符号:持续为负值表示各分支总和超过输入电流,这通常是线路或通道映射故障,而非负载问题;将结果用max(x, 0)包裹,正是这种故障在一个月内被忽略的原因。第二个是其正半部分,即未被夹紧的电路部分。第三个是输入端的电流不平衡度,以平均值的百分比表示——这是一种类似NEMA标准的电流指标,不同于常规数值;严格定义需要对称分量并依赖相位角,而模块已提供这些数据。
能量传感器也可直接集成到Home Assistant内置的能量仪表板中:输入电流作为电网电源,四个子回路分别显示为独立设备。输入一个电价后,系统会报告实际费用。
仪表板界面
包含两个标签页:概览页包括当前功率、今日/本周/本月能耗、输入电流的24小时趋势图、四个子回路各自对应的颜色以及堆叠式12小时图表,此外还有供电质量信息——三个电压表、含零线在内的电流、功率因数、频率以及模块温度。能源:按电路划分的今日数据饼图、过去两周每日柱状图,以及当日和双周的各电路总计。
一个值得分享的小技巧:如果你需要更改某个数值的计算方式——比如进行修正、使用不同的比例因子,或某个通道含义略有不同——请不要冲动地为它创建新的传感器。新传感器在创建当天的历史记录将从零开始,而在此之前的所有数据都会被遗弃在旧历史中。建议在渲染时直接进行计算:ApexCharts卡片可自行获取原始统计数据,并在浏览器中完成所需运算。这样修正后的数据就能覆盖整个历史记录,直至面板启用之日,而原始传感器的数据则保持不变,这正是当别人要求你解释某个数字时,你希望看到的效果。
三个值得注意的陷阱,因为它们加在一起让我浪费了一个晚上。
card-mod 和 Mushroom 的股票卡片崩溃问题。在 Home Assistant 2026.4 版本中,card-mod 4.2.1 和 Mushroom 5.2.3 均会破坏内置的仪表盘和统计卡片功能——卡片元素显示为空内容,且 ApexCharts 卡片始终停留在“加载中……”状态。移除这两个资源后,问题会立即解决。此仪表板仅使用 ApexCharts 和 stock cards。
data_generator 并非异步函数。在 apexcharts-card 2.2.3 版本中,生成器体被编译为普通函数,因此其中的 await 会抛出异常,导致卡片永远显示为“加载中”,控制台中没有任何有用信息。应返回 Promise 而不是直接返回值——即 return hass.callWS({...}).then(...)。
电源传感器没有长期统计数据。ESPHome 的电源实体不包含 state_class,因此 recorder/statistics_during_period 返回的是空集合,只有能量计数器存在。要获取电源历史记录,必须读取 history/history_during_period,并自行构建时间网格。由于能量计数器是 total_increasing 类型,因此在统计中仍表现为正常数据。
首次数据
昨天面板进入系统,商店尚未开业,因此目前所有记录均为待机状态。第一天完整记录:2.48 千瓦时,其中 2.09 千瓦时(占 84%)用于照明。压缩机消耗了 0.35 千瓦时,提升设备消耗 0.04 千瓦时,插座电路几乎不耗电。
单日数据无法构成趋势,我不会假装其他情况;真正有意义的对比是在商店开始运营之后才会出现。但这个数字已经相当具体,而非主观看法,其形态更值得一看:在空荡的建筑中,灯光并非“什么都没有”,而是几乎包含了所有事物。
这带来了哪些影响
目前尚未安装其他任何设备,是否安装则由店铺自行决定。但现有的面板已经具备了这些廉价特性:它们无需额外硬件,也无需再次上门检查:
相位损耗、欠压、过压和不平衡——这些都会作用于仪表自身的继电器,使其在电网故障时仍能正常工作。
压缩机接触器按计划运行,并可在屏幕上手动进行切换。继电器驱动接触器线圈;电机通过接触器接通,同时由其自身的电机保护装置进行保护。线圈额定电流为三安培,而非电机额定电流。
记录压缩机的运行时间和启动电流,并在发生偏差时发出警报。
这就是为什么应优先完成电气层的原因,后续再进行其他安装。
需要明确说明的是,这一点至关重要:这些模块中的报警逻辑和继电器仅作为补充性的监控与控制功能,不能替代系统所需的保护装置,且其中任何组件都不是经过认证的保护继电器。
版本
要求:安装带有 ESPHome 集成的 Home Assistant,以及使用 HACS 中的 ApexCharts Card 构建仪表盘。不要使用 card-mod 或 Mushroom — 上文已说明注意事项。
测试环境:Home Assistant 2026.4、apexcharts-card 2.2.3、ESPHome 2026.7。在 ESPHome 2026.7 版本中,Modbus 默认设置发生了变化——控制器配置会明确设置 turnaround_time: 100ms 和 send_wait_time: 250ms,若不设置这些参数,总线将立即超时。
这是否值得?
从千瓦时的角度来看并不划算,这一点需要明确指出。对于每月电费仅几十元的店铺而言,通过了解能源去向所节省的能耗,在合理的时间内无法回收硬件成本。任何推销这种说法的人,实际上是在兜售一张电子表格。
但确实值得的地方:
保护功能。一台三相电机因缺相或持续低电压而损坏,其维修成本远高于配电箱本身。电表能检测到这两种情况,继电器可本地响应,无需等待服务器。
条件而非耗电量。一个环网漏电的压缩机在相同工作条件下运行时间延长了30%,这一影响会在电流数据中很久前就显现,而账单上则要等很久才会反映出来。轴承故障会导致启动电流升高。有用的句子不是“你省下了八欧元”,而是“你没有两天没电”。
一个供电单元被分割成两个租户或两个机柜,而争论就从第一个月开始。
之后添加的任何内容。控制器、总线和24V电源线都与接下来接入的设备共享。将面板的损耗分配到整个系统,而不是仅限于计量装置。
备注与限制
这是一个监控仪器,而非认证的计费电表。精度取决于夹具。
在三相设备中,单个相上的一个夹具并不能代表该设备的全部耗电量。因此,电梯使用三个通道,而此处单相压缩机只用一个通道。安装前请务必检查。
同一箱内混合多种功能:24V上为SELV(安全保护接地)、RS-485和USB;电源输入端则用于主电源。需由合格人员进行上游保护,并符合当地法规。
本文编译自hackster.io





