跳转到内容

非侵入式功率计

让家庭智能化的一个重要部分是了解它一天消耗了多少电量。追踪这一点可能很困难,通常需要安装一个全新的电表,这往往需要花费不少钱。然而,不少电表前面都有一个红色LED,每消耗1瓦时就闪烁一次。

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

连接起来非常简单:只需购买一个合适的光敏电阻(确保波长与电表的大致匹配)。然后使用一个简单的可变电阻分压器连接(参见这篇文章获取灵感)。然后…这样就完成了 :)

NOTE

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

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

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

sensor:
- platform: pulse_meter
name: 'Power'
id: sensor_pulse_meter # Optional ID, necessary if you want to calculate the total daily energy
unit_of_measurement: 'W'
device_class: power
state_class: measurement
accuracy_decimals: 0
pin: GPIO12
filters:
- multiply: 6 # (60s / impulse constant) * (1000W / 1kW)

当然,请将 GPIO12 调整为您的实际设置。脉冲计数器传感器的输出单位为脉冲/分钟,我们也知道LED的10000个脉冲对应1kWh的用电量。因此,通过表达式换算,从脉冲/分钟到瓦特的比例因子为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的事吧😉

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

# Example configuration entry
sensor:
- platform: pulse_meter
# ...
total:
name: "Electricity Total"
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
accuracy_decimals: 3
filters:
- multiply: 0.0001 # (1/10000 pulses per 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: 'Total Daily Energy'
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:
# Multiplication factor from W to kW is 0.001
- multiply: 0.001
time:
- platform: homeassistant
id: homeassistant_time

虽然理论上您也可以使用Home Assistant的积分集成来实现,但这样做的好处是,它在Home Assistant无法处理数值时(例如更新、重启等期间)仍能继续积分功率数据。