# Analytics snippet placeholder — HearthNodes (gatherer.top) # Paste the measurement snippet here (server.js inlines any content that contains # a markup tag into on every page). No GA4 property is assigned to this # site yet, so leave this file as comments only and the build emits no tracking # code.
HearthNodesgatherer.top 已发布 11/28 EN 中文

把光伏余电导向热水罐,而不是以 4 分钱回售电网

浸没式加热器以 400 W 步进吸收光伏余电,把电网进出功率控制在 -50 W 至 +150 W 之间长达四小时。在 4.2 kWp 的阵列上,一个晴朗的 4 月日可截留 6.8 kWh,而不是按上网电价卖出。

协议 · matter 延迟 · 60000 ms 供电 · mains 发布 · 2026-09-16 3 devices
自动化 YAML energy-solar-surplus-water-heating.yaml
# HearthNodes recipe 16 - solar surplus to hot water
alias: "Energy - divert PV surplus to the cylinder"
id: hn_energy_solar_surplus_water
description: "Hold grid between -50 W and +150 W by modulating the immersion"
mode: single
max_exceeded: silent

trigger:
  - platform: numeric_state
    entity_id: sensor.grid_power
    below: -250
    for: "00:01:00"

variables:
  band_low_w: -50
  band_high_w: 150
  step_w: 400
  pwm_period_s: 10
  cylinder_c: "{{ states('sensor.cylinder_temperature') | float(0) }}"
  current_w: "{{ states('sensor.immersion_power') | float(0) }}"
  error_w: "{{ states('sensor.grid_power') | float(0) }}"
  next_w: "{{ [[current_w + (band_high_w - error_w), 0] | max, 3000] | min }}"
  duty: "{{ (next_w / 3000 * 100) | round(0) }}"

condition:
  - condition: numeric_state
    entity_id: sensor.cylinder_temperature
    below: 62
  - condition: numeric_state
    entity_id: sensor.battery_soc
    above: 55
  - condition: state
    entity_id: binary_sensor.high_power_appliance_active
    state: "off"
  - condition: template
    value_template: "{{ cylinder_c | float(0) < 62 }}"

action:
  - service: number.set_value
    target:
      entity_id: number.immersion_setpoint
    data:
      value: 62
  - service: script.pwm_switch
    data:
      switch: switch.immersion_element
      duty_pct: "{{ duty }}"
      period_s: "{{ pwm_period_s }}"
      step_w: "{{ step_w }}"
  - service: sensor.record
    data:
      entity_id: sensor.exported_energy_today
      note: "compare diversion against the feed-in rate"

# Grid meter loss -> irradiance-based forecast model, so the cylinder is never
# heated from grid import by accident. Cylinder probe failure stops diversion
# entirely: heating water to an unknown temperature is worse than exporting.
触发器 · numeric_state

sensor.grid_power

电网功率低于 -250 W(正在外送)并持续 60 秒。

把光伏余电导向热水罐,而不是以 4 分钱回售电网 topology

分步说明

  1. switch.immersion_element用 10 秒 PWM 周期以 400 W 步进调节浸没加热器;周期更长会让电表读数来回跳,调节器随之来回搜索。 PWM · 400 W steps · 10 s period
  2. number.immersion_setpoint把分流器的目标设为 62 °C,并让热水罐自身的机械温控器保持在 70 °C 作为独立安全限值。 set 62 °C · hard limit 70 °C
  3. sensor.exported_energy_today每日记录外送电量与截留电量的对比,以便依据真实上网电价评估分流策略。 log · compare against diversion
  4. input_boolean.cylinder_boost墙面按钮提供 60 分钟手动强制加热,忽略余电逻辑,用于多来一位客人的晚上。 manual 60 min boost overrides everything
分步说明
把电网稳定在少量取电,而不是零

把目标精确设为 0 W 会让系统每分钟在取电与外送之间来回震荡数次。维持在 -50 W 至 +150 W 意味着电表大多数时间看到的是极少量的取电,既稳定又几乎不花钱。这是最重要的一个整定值。

电池荷电低于 55 % 时让电池优先

在电池只剩 30 % 时把余电导向热水,意味着当晚你得买市电。55 % 这个阈值对应的是一个夜间用电 4 kWh 的家庭;请根据你自己的夜间用电量重新计算,不要直接照抄。

把分流器上限设在热水罐自身温控器之下

62 °C 目标配合 70 °C 机械限值,形成两层独立保护。一个完全信任自身传感器、没有机械兜底的分流器,距离「把热水罐烧开」只差一个探头故障。每年手动检查一次机械温控器。

硬件

型号协议连接在本链路中的作用
Matter smart relay with power metering (e.g. Shelly or equivalent) matter 有线 开合并测量浸没加热器负载;正是这个测量值闭合了控制回路。
Bidirectional grid meter (CT clamp or the inverter's own meter) matter 有线 提供带符号的电网功率值;单向电表无法区分外送与取电。
Cylinder temperature probe on a 1 m immersion pocket zigbee 无线 绑在热水罐的测温套管上,而不是管道上,这样读到的是储水温度而非流水温度。

失效时怎么办

如果电网电表失联,分流器回退到依据辐照度估算余电的光伏预报模型——精度差一些,但能避免用市电加热热水。如果热水罐探头失效,分流完全停止并发出通知——加热到一个未知温度,比便宜地外送更糟。

同一触发源的配方

条款 仅供参考。这些配方会控制市电、水路与物理门禁。当地电气与给排水规范、熔断与隔离措施、以及每一处失效保护的实际测试,都需要你自己负责。本页内容不构成专业工程、法律或安全建议。