Skip to content

Commit 70d2cbd

Browse files
committed
WPE-I: decode the pump's own status words, add panel-verified entities
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)
1 parent 354c114 commit 70d2cbd

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

components/wp_core/property.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,14 @@ struct Property : public oe32trta::detail::Property {
361361
// WPL13 status word (observed raw 280/285 = 28.0/28.5 l/min while idle
362362
// in passive cooling, matching VOLUMENSTROM 0x4f47 = 27.7 l/min)
363363
PROPERTY(WP_WASSERVOLUMENSTROM, 0x02e2, Type::et_dec_val);
364+
// the WPE-I's Wärmepumpen-Status word (broadcast by Kessel; 0x8000 while
365+
// in standby). Panel-verified bits: 4 = passive cooling active; two of
366+
// {2, 13} = Kühlbetrieb mode / Netzversorgung Inverter.
367+
PROPERTY(WAERMEPUMPEN_STATUS, 0x4eda);
368+
PROPERTY(EVU_SPERRE_AKTIV, 0x0074);
369+
PROPERTY(REGELABWEICHUNG, 0x033d, Type::et_dec_val);
370+
PROPERTY(WAERMEERTRAG_2WE_HEIZ_SUM_KWH, 0x0928);
371+
PROPERTY(WAERMEERTRAG_2WE_HEIZ_SUM_MWH, 0x0929, Type::et_double_val);
364372
// runtime counters; property ids shared with WPL17 (0x4efb..) / WPL17+23 (NHZ)
365373
PROPERTY(LAUFZEIT_VD_HEIZEN, 0x4efb);
366374
PROPERTY(LAUFZEIT_NHZ1, 0x0259);

yaml/wpe-i.yaml

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,56 @@ esphome:
1313
platformio_options:
1414
build_flags:
1515
- "-DWPE_I"
16+
on_boot:
17+
- priority: -50
18+
then:
19+
- lambda: |-
20+
// Wärmepumpen-Status word 0x4eda: only panel-verified bits are decoded.
21+
// The raw word is exposed as a sensor so the remaining bits can be
22+
// identified from recorded history when the pump changes state.
23+
CallbackHandler::instance().addCallback(std::make_pair(CanNode::Kessel,Property::kWAERMEPUMPEN_STATUS),[](const SimpleVariant& value){
24+
const auto word{static_cast<std::uint16_t>(value)};
25+
id(WP_STATUS_RAW).publish_state(word);
26+
if (word != 0x8000U) { // 0x8000 = standby (Bereitschaft)
27+
const std::bitset<16U> status_bits{word};
28+
id(PASSIVKUEHLUNG_AKTIV).publish_state(status_bits.test(4U));
29+
}
30+
});
31+
// Anlagen-Status word 0x4ecd is broadcast by the pump towards the
32+
// room unit and arrives carrying HK2's sender id.
33+
CallbackHandler::instance().addCallback(std::make_pair(CanNode::HK2,Property::kBETRIEBS_STATUS),[](const SimpleVariant& value){
34+
const auto word{static_cast<std::uint16_t>(value)};
35+
const std::bitset<16U> status_bits{word};
36+
id(ANLAGE_STATUS_RAW).publish_state(word);
37+
id(HEIZKREISPUMPE_2).publish_state(status_bits.test(2U));
38+
});
39+
// EVU-Sperre-aktiv flag 0x0074, broadcast periodically (Manager id)
40+
CallbackHandler::instance().addCallback(std::make_pair(CanNode::Manager,Property::kEVU_SPERRE_AKTIV),[](const SimpleVariant& value){
41+
id(EVU_SPERRE_AKTIV).publish_state(static_cast<std::uint16_t>(value) == 1U);
42+
});
43+
- priority: -100
44+
then:
45+
- lambda: |-
46+
queueRequest(CanNode::Kessel, Property::kWAERMEPUMPEN_STATUS);
47+
48+
#########################################
49+
# #
50+
# Status raw words (diagnostic) #
51+
# #
52+
#########################################
53+
sensor:
54+
- platform: template
55+
name: WP_STATUS_RAW
56+
id: WP_STATUS_RAW
57+
icon: "mdi:numeric"
58+
accuracy_decimals: 0
59+
update_interval: never
60+
- platform: template
61+
name: ANLAGE_STATUS_RAW
62+
id: ANLAGE_STATUS_RAW
63+
icon: "mdi:numeric"
64+
accuracy_decimals: 0
65+
update_interval: never
1666

1767
#########################################
1868
# #
@@ -42,3 +92,12 @@ packages:
4292
LAUFZEIT_NHZ1: !include { file: templates/wp_generic.yaml, vars: { property: "LAUFZEIT_NHZ1", unit: "h", target: "Heizmodul" }}
4393
LAUFZEIT_NHZ2: !include { file: templates/wp_generic.yaml, vars: { property: "LAUFZEIT_NHZ2", unit: "h", target: "Heizmodul" }}
4494
LAUFZEIT_NHZ1_2: !include { file: templates/wp_generic.yaml, vars: { property: "LAUFZEIT_NHZ1_2", unit: "h", target: "Heizmodul" }}
95+
96+
# status binaries decoded from the WPE-I's own status words (panel-verified bits only)
97+
PASSIVKUEHLUNG_AKTIV: !include { file: templates/wp_binary.yaml, vars: { name: "PASSIVKUEHLUNG_AKTIV" }}
98+
HEIZKREISPUMPE_2: !include { file: templates/wp_binary.yaml, vars: { name: "HEIZKREISPUMPE_2" }}
99+
EVU_SPERRE_AKTIV: !include { file: templates/wp_binary.yaml, vars: { name: "EVU_SPERRE_AKTIV" }}
100+
101+
# further panel-verified values
102+
REGELABWEICHUNG: !include { file: templates/wp_generic.yaml, vars: { property: "REGELABWEICHUNG", unit: "K", accuracy_decimals: "1", target: "Manager" }}
103+
WAERMEERTRAG_2WE_HEIZ_SUMME_MWH: !include { file: templates/wp_generic_combined.yaml, vars: { sensor_name: "WAERMEERTRAG_2WE_HEIZ_SUMME_MWH" , scaled_property: "WAERMEERTRAG_2WE_HEIZ_SUM_KWH" , property: "WAERMEERTRAG_2WE_HEIZ_SUM_MWH" , unit: "MWh", accuracy_decimals: "3", icon: "mdi:fire" , target: "Heizmodul", state_class: "total_increasing" }}

0 commit comments

Comments
 (0)