跳转到内容

非侵入式功率计

让家庭智能化的一个重要部分是了解全天的用电量。跟踪这可能很困难,通常需要安装全新的电表,这往往需要花费大量资金。然而,相当多的电表正面有一个红色 LED,每消耗一瓦时就会闪烁一次。

因此,简单的想法是:我们为什么不利用这个功能让电表物联网化?我们只需要在前面提到的 LED 前面连接一个简单的光敏电阻,并跟踪接收到的脉冲数量。然后使用 ESPHome,我们可以立即让电表显示在 Home Assistant 中 🎉

连接所有设备非常简单:只需购买合适的光敏电阻(确保波长与电表的大致匹配)。然后使用简单的可变电阻分压器连接它(参见这篇文章获取灵感)。然后…应该就可以了 :)

NOTE

一些电表有暴露的 S0 端口(本质上只是一个闭合的开关),如果是这种情况,可以用以下连接替换光电二极管:

S0 ------------ VCC
S0 --+-- 10k -- GND
. |
. +--------- GPIO12

对于 ESPHome,您可以使用 脉冲计量传感器,使用以下配置:

sensor:
- platform: pulse_meter
name: '功率'
id: sensor_pulse_meter # 可选 ID,如果要计算每日总能量则需要
unit_of_measurement: 'W'
device_class: power
state_class: measurement
accuracy_decimals: 0
pin: GPIO12
filters:
- multiply: 6 # (60s / 脉冲常数) * (1000W / 1kW)

当然要调整 GPIO12 以匹配您的设置。脉冲计数传感器的输出单位是脉冲/分钟,我们也知道 LED 的 10000 个脉冲应该等于 1kWh 的用电量。因此,重新排列表达式得出从脉冲/分钟到 W 的比例因子为 6。

NOTE

pulse_meter 传感器每次检测到脉冲时都会发送更新。这可能导致亚秒级更新,这对 Home Assistant 来说可能有点多。为避免这种情况,您可以使用 throttle_average 过滤器仅在所需间隔内发送更新:

sensor:
- platform: pulse_meter
# ...
filters:
- throttle_average: 10s
- filter_out: NaN

NOTE

pulse_meter 传感器有一个内部过滤器用于对输入信号进行消抖。此过滤器默认设置为 13us。要增加安全裕度,您可以增加此值。为此,您需要知道在预期负载范围内电表可能产生的最小脉冲宽度

最小脉冲宽度阈值通过考虑电表设计处理的负载上限以及电表的脉冲常数(x 脉冲 / kWh)来确定。以下是涉及的计算:

  • 以瓦特为单位的负载限制:确定电表设计测量的负载上限。例如,如果限制是 16 kW(16,000 瓦特),这将成为参考点。

  • 脉冲率计算:确定对应于此负载限制的脉冲率。为此我们需要知道脉冲常数。在我们的示例中,电表的脉冲常数为 10000 脉冲/kWh,导致在最大 16 kW 负载下每小时 160000 个脉冲,即 44.4 脉冲/秒。

  • 最小脉冲宽度计算:使用脉冲率计算最小脉冲宽度阈值。在我们的示例中,最大脉冲率为 44.4/秒,我们期望看到的最小脉冲宽度约为 22.5 毫秒。选择比此略小的值以避免丢失脉冲。

sensor:
- platform: pulse_meter
# ...
internal_filter: 20ms

如果技术人员出现并对您对电表做了什么感到困惑,告诉他们 ESPHome 😉

当配置了 total 传感器时,pulse_meter 还报告测量的总脉冲数。用于电表时,这可用于测量以 kWh 为单位的总传输能量。

# 配置条目示例
sensor:
- platform: pulse_meter
# ...
total:
name: "总电量"
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 3
filters:
- multiply: 0.0001 # (1/10000 每 kWh 脉冲数)
# - throttle_average: 10s
# - filter_out: NaN

使用此动作,您可以重置/设置总脉冲计数。如果您希望 total 传感器与您尝试匹配的电表上看到的数值匹配,这可能很有用。

api:
actions:
- action: set_total
variables:
new_total: int
then:
- pulse_meter.set_total_pulses:
id: sensor_pulse_meter
value: !lambda 'return new_total * 1000;'

此外,您还可以计算每日总发电量,可以使用 每日总能量 使用以下配置:

sensor:
#(...)
- platform: total_daily_energy
name: '每日总能量'
id: sensor_total_daily_energy
power_id: sensor_pulse_meter
unit_of_measurement: 'kWh'
state_class: total_increasing
device_class: energy
accuracy_decimals: 3
filters:
# 从 W 到 kW 的乘法因子是 0.001
- multiply: 0.001
time:
- platform: homeassistant
id: homeassistant_time

虽然理论上您也可以使用 home assistant 的 integration 集成来完成此操作,但这样做的好处是它可以在 home assistant 无法处理数值的时间段(如更新、重启等)继续积分功率。