Add WPL33 heat pump support#373
Open
mhosse wants to merge 13 commits into
Open
Add WPL33 heat pump support#373mhosse wants to merge 13 commits into
mhosse wants to merge 13 commits into
Conversation
Moved these three out of wpl_base.yaml's shared assumptions (MFG/HK1/MFG, inherited from WPL13/17/23) into per-variant declarations, since WPL33's unit only responds on HK1/Kessel/Manager respectively. WPL13/17/23 keep their existing MFG/HK1/MFG targets unchanged, now declared locally instead of via the shared package.
…ved data handling
…s in WPL33 configuration
The old key is deprecated (removal planned for 2026.12.0) and build_unflags is silently ignored under the native ESP-IDF toolchain anyway -- RTTI is already handled via sdkconfig_options in core.yaml. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
core.yaml's Home Assistant Sensors block unconditionally writes HA's own room temperature/humidity to CanNode::HK1 via these properties for every device family. They were dropped in the earlier property.h cleanup because wpl33.yaml itself doesn't poll them (confirmed dead as a read via FET), which broke the WPL33 build. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Discovery aid for extending property.h: logs (once per newly-seen id) and persists via flash any CAN property id that arrives on the bus but has no property.h entry, and exposes the running list as a diagnostic text_sensor. Off by default (core.yaml's track_unmapped_properties substitution) since it writes to flash on every newly-seen id -- override per-device to "true" to enable. Confirmed working on the WPL33 unit, already surfacing real ids. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
GERAETEKONFIGURATION, ACCESS_EEPROM, and INITIALISIERUNG arrive on the bus unprompted (confirmed via the unmapped-property tracker) and must never be actively requested -- templates/wp_generic_passive.yaml is templates/wp_generic.yaml minus both queueRequest calls (no self-poll, no one-shot request at boot), registering only a receive callback. INITIALISIERUNG is wired up once per CAN node it was seen on (HK1/Kessel/Manager/Heizmodul). Also reworded the property.h comments for the WPL33 block to name the specific properties they describe, and added blank lines between groups -- the association between comment and property was previously ambiguous. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
No longer clear why this had its own et_err_nr/text_sensor path for WPL33 only -- likely leftover from an early test. Since no actual error codes have come up in practice, align it with every other device family: plain numeric error code via templates/wp_generic.yaml. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
track() only checked for duplicates before appending -- nothing ever removed an entry once its property id got a real property.h mapping, so the flash state kept showing already-fixed ids forever. Now checks each loaded entry against property.h and drops (and re-saves) any that no longer resolve to "UNKNOWN". Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Both are broadcast unsolicited by the unit on Heizmodul (confirmed via the unmapped-property tracker) alongside the properties added earlier. BUSKONFIGURATION is untyped, wired up like GERAETEKONFIGURATION/ACCESS_EEPROM/ INITIALISIERUNG. GERAETE_ID is string-valued (Type::et_dev_id, a major-minor device id) rather than numeric, so it needs a new templates/wp_text_passive.yaml -- templates/wp_text.yaml minus the queueRequest calls, mirroring how wp_generic_passive.yaml relates to wp_generic.yaml. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
# Conflicts: # yaml/core.yaml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds full support for the Stiebel-Eltron WPL33 heat pump variant as a
new device family, following the same conventions as the existing WPL13/17/23 profiles.
Along the way this also fixes a couple of small pre-existing issues and adds a generally
useful, opt-in addition to the shared
wp_corecomponent.What's new
yaml/wpl33.yaml: new device profile, gated by the-DWPL_33build flag (mirrorswpl13.yaml/wpl17.yaml/wpl23.yaml).wpl_base.yaml(unlike WPL13/17/23): a large fraction of the propertieswpl_base.yamlassumes exist turned out to never return real data on this unit, confirmed vialive CAN bus logs from a real device. Rather than fight
!extend/!removearound bakedon_bootlambda code (doesn't clean up after itself),wpl33.yamlopts in explicitly toeverything it actually needs, one property at a time — easy to trim further as more turn out
to be unsupported.
on CAN id
0x500(vs. default0x514), datetime synced via theManagerCAN node instead ofKessel.mapper.cpp— this unit's modenames differ from WPL13/17/23.
New shared templates (usable by any future device family)
templates/wp_text.yaml: string-valued CAN properties (Type::et_err_nr,et_dev_id,etc.) as
text_sensor, actively polled — parallel towp_temperature.yaml/wp_generic.yamlfor numeric properties.
templates/wp_binary_property.yaml: bool-typed CAN properties as properbinary_sensorentities, instead of forcing them through a numeric sensor (which crashes with
bad_variant_accesson a bool-holding value).templates/wp_generic_passive.yaml/templates/wp_text_passive.yaml: for propertiesthe unit broadcasts unsolicited (never in response to a request) — identical to
wp_generic.yaml/wp_text.yamlbut without anyqueueRequestcalls, so they're neveractively polled, only passively received.
templates/wp_datetime.yaml: parameterized with atargetCAN node (wpl_base.yamlpasses it through via a new
datetime_targetsubstitution), since WPL33 needsManagerinstead of the family default
Kessel.Diagnostics: opt-in unmapped-property tracker
components/wp_core/unmapped_tracker.h— logs and persists (via flash) any CAN property idthat arrives on the bus but has no
property.hentry, exposed as atext_sensor. Purely adiscovery aid for extending
property.hon new/unfamiliar units; off by default(
core.yaml'strack_unmapped_propertiessubstitution) since it writes to flash on everynewly-seen id. Prunes entries on load once their property id gets a real mapping, so the list
doesn't accumulate stale/fixed ids forever.
Fixes picked up along the way (affect all device families)
esphome.platformio_options.build_flags/build_unflagsto the newflat
esphome.build_flagsacross every device config (support for the old key is beingremoved in ESPHome 2026.12.0).
build_unflagswas dropped outright rather than migrated —it's silently ignored under the native ESP-IDF toolchain, so it was already dead.
esp32-poe-technik.yaml: added a commented-outwpl33package line for discoverability,matching how
wpl13/wpl17/wpl23are already listed (not enabled — this example configruns THZ504).
Testing
telemetry; several properties present in the original draft were confirmed dead on this
hardware and removed to reduce bus load; a few genuinely missing ones were added back with
corrected CAN node targets).
esphome configvalidated for every touched device family (wpl13/17/23, thz304/404/504/5_5_eco, ttf07) to confirm the shared-file changes (
wpl_base.yaml,core.yaml, templaterenames) don't regress anything outside WPL33.