Skip to content

Add support for WPE-I (brine/water, no DHW) - #367

Draft
adrai wants to merge 6 commits into
kr0ner:masterfrom
adrai:wpe-i-support
Draft

Add support for WPE-I (brine/water, no DHW)#367
adrai wants to merge 6 commits into
kr0ner:masterfrom
adrai:wpe-i-support

Conversation

@adrai

@adrai adrai commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Closes the WPE-I part of #363. Everything below is panel-verified on a
WPE-I 08 HK 230 Premium (video/photo evidence available on request).

What the WPE-I shares with the WPL13 (all values matched the panel
exactly): water/refrigerant temperatures, HK1/HK2 setpoints and heat curves,
energy counters (16.829 MWh), efficiency (6.34), VERDICHTER_STARTS (2209),
low-byte Betriebsart map — so WPE_I joins the existing property groups.

Differences handled by the variant (yaml/wpe-i.yaml, -DWPE_I):

  • No DHW → WW counters not included (per the wpl_base restructure).
  • 0x02e2 = WP_WASSERVOLUMENSTROM (as on WPL17), not the WPL13
    status word — it tracks the circulation flow (28.0/28.5 l/min alongside
    VOLUMENSTROM 27.7; the panel's Prozessdaten shows the same value).
  • Betriebsart is sent as a low byte (raw 0x02 captured while the panel
    showed Programmbetrieb) → no <<8 shift. Select verified read and
    write
    (mode switch from the ESP round-trips; the pump broadcasts the new
    value and the panel follows).
  • Own status words (identified via a controlled standby experiment,
    panel videoed in each state):
    • WAERMEPUMPEN_STATUS (0x4eda, Kessel): bit 4 = passive cooling active;
      two of bits {2,13} = Kühlbetrieb mode / Netzversorgung Inverter;
      0x8000 in Bereitschaft.
    • Anlagen-Status (BETRIEBS_STATUS 0x4ecd broadcast towards the room
      unit, HK2 sender id): bit 2 = Heizkreispumpe 2 (word went 4→0→4 in
      sync with the standby flip).
    • The Manager word (WPL decode source) always reads 0 on this machine.
    • Only verified bits become binaries; both raw words are exposed as
      diagnostic sensors so remaining bits can be identified from history.
  • Additional panel-verified entities: LAUFZEIT_VD_HEIZEN (6327 h),
    LAUFZEIT_NHZ1/2/1_2 (0/0/4 h), REGELABWEICHUNG (-1.7…-2.1 K),
    EVU_SPERRE_AKTIV, WAERMEERTRAG_2WE_HEIZ_SUMME_MWH (0.036 MWh =
    panel "NHZ HEIZEN SUMME").
  • Room values note: the physical FET2's display values are not
    addressable via standard indices — the RAUM* entities show the active
    room reference (the ESP's own injected values), which is the intended
    behavior of the FET emulation.

Tested on: WPE-I 08 HK 230 Premium via ESP32-C6-Zero (esp32_can),
ESPHome 2026.6.5, running in production since 2026-07-09.

Opened as a draft pending your answer on #363. The branch stacks on #364, #365 and the wpl_base restructure PR — the diff shrinks to just the variant once those land, and I'll rebase after each merge.

adrai added 6 commits July 18, 2026 17:23
Scaled numeric types passed raw sentinel words through the int16 cast:
- 0x8000 ("not available"): et_dec_val rendered -3276.8, et_double_val
  rendered energy counters as 32768 (observed on a WPE-I 08 HK without
  DHW: WAERMEERTRAG_WW_SUMME_MWH = 32.768 MWh,
  EL_ENERGIEAUFNAHME_WW_SUMME_KWH = 32,768,000 kWh).
- 0x9000 ("AUS" for et_dec_val settings): MINTEMP raw 36864 rendered
  -2867.2 while the panel shows AUS (verified on HK2, panel photo).

Return NAN for these words so ESPHome/HA report the entity as
unavailable instead of publishing impossible values.
The combined kWh sensor must scale the MWh part by 1000 and add the kWh
part. The vars had it backwards (kWh part scaled by 1000, MWh part added
raw), so the total was off by three orders of magnitude.

Verified on a WPE-I 08 HK 230 Premium: pump returns
EL_ENERGIEAUFNAHME_HEIZ_SUM_KWH (0x0920) = 623 and _SUM_MWH (0x0921) = 2;
sensor showed 623,002 kWh while the panel (Leistungsaufnahme, VD HEIZEN
SUMME) shows 2.623 MWh. Panel efficiency cross-check: 6.34 = 16.829 MWh
yield / 2.623 MWh intake.

The WAERMEERTRAG_*_SUMME_MWH sensors are not affected (their MWh part is
the unscaled base, kWh part is scaled by 0.001), same for
VERDICHTER_STARTS (thousands part scaled by 1000).
…ants

Not every WPM-family heat pump has integrated domestic hot water: the
WPE-I ... HK models are heating/cooling only, and their controller
answers the WW energy properties with the 0x8000 "not available"
sentinel (observed on a WPE-I 08 HK 230 Premium as 32.768 MWh /
32,768,000 kWh before the sentinel fix).

Keep wpl_base.yaml model-agnostic by moving the four WW counters
(WAERMEERTRAG_WW_SUMME_MWH, EL_ENERGIEAUFNAHME_WW_SUMME_KWH and both
_TAG_ variants) into wpl13/wpl17/wpl23, which all have DHW. No behavior
change for existing models; a WW-less variant can now simply not
include them.
Panel-verified against a WPE-I 08 HK 230 Premium: the WPE-I family
speaks the same WPM protocol as the WPL13 (temperatures, setpoints,
heat curves, energy counters, VERDICHTER_STARTS and efficiency all
match the panel exactly), so WPE_I joins the existing WPL property
groups and the low-byte Betriebsart map.

Differences handled here:
- no Warmwasser energy counters (the model has no integrated DHW; the
  controller answers those properties with the 0x8000 sentinel)
- 0x02e2 is WP_WASSERVOLUMENSTROM as on the WPL17, NOT the WPL13
  WAERMEPUMPEN_STATUS word: it tracks the circulation flow (raw
  280/285 = 28.0/28.5 l/min alongside VOLUMENSTROM = 27.7 l/min) while
  the panel's Status Wärmepumpe checkboxes contradict a bit decode.
  The WPL13 status-bit binaries are therefore omitted until the
  WPE-I's real status property is identified.
- runtime counters exposed, panel-exact from Heizmodul:
  LAUFZEIT_VD_HEIZEN (6327 h, id shared with WPL17) and
  LAUFZEIT_NHZ1/NHZ2/NHZ1_2 (0/0/4 h, ids shared with WPL17/23).
  LAUFZEIT_VD_KUEHLEN answers 0x8000 (WPE-I only cools passively) and
  is not exposed.

Note: unlike WPL_13 builds, WPE_I does not shift the Betriebsart raw
value by 8 bits — the WPE-I sends PROGRAMMSCHALTER (0x4f1b) as a low
byte (raw 0x02 = Programm, verified while the panel showed
PROGRAMMBETRIEB).
…ants

The Manager (0x480) BETRIEBS_STATUS word is not served on every
WPM-family pump: a WPE-I 08 HK 230 Premium answers the read but the
word stays 0 regardless of state (verified with the panel showing
Heizkreispumpe 2 running while all twelve binaries read off; the WPE-I
publishes its plant status in other words instead, see the WPE-I
variant). Keep wpl_base model-agnostic by moving the twelve binaries
and their bit decode into wpl13/wpl17/wpl23 — no behavior change for
those models.
The WPE-I publishes its status in two words of its own (verified by a
controlled standby experiment with the panel videoed in each state):

- WAERMEPUMPEN_STATUS (0x4eda, Kessel): bit 4 = passive cooling active
  (valve in cooling position; flips with the panel's Passivkühlventil
  checkboxes), two of bits {2, 13} = Kühlbetrieb mode / Netzversorgung
  Inverter. Reads 0x8000 in Bereitschaft.
- Anlagen-Status (BETRIEBS_STATUS 0x4ecd), broadcast towards the room
  unit with HK2's sender id: bit 2 = Heizkreispumpe 2 (word went 4->0->4
  in sync with the standby flip; panel Status Anlage confirmed).

Only panel-verified bits become binaries; both raw words are exposed as
diagnostic sensors so the remaining bits can be identified from recorded
history when the pump changes state (e.g. season change). The Manager
BETRIEBS_STATUS word — the WPL decode source — always reads 0 on this
machine.

Also adds, each panel-verified:
- EVU_SPERRE_AKTIV (0x0074, broadcast flag; panel Inbetriebnahme shows
  EVU SPERRE EIN)
- REGELABWEICHUNG (0x033d, -1.7..-2.1 K matching the Analyse menu)
- WAERMEERTRAG_2WE_HEIZ_SUMME_MWH (0x0928/0x0929 = 36 kWh, matching the
  panel's NHZ HEIZEN SUMME 0.036 MWh)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant