Skip to content

fix(heating): name the central unit status WHATs 22, 23, 24, 30 and 31 - #89

Closed
gdluck wants to merge 1 commit into
OpenWebNet-HA:masterfrom
gdluck:fix/who4-central-status-whats
Closed

gdluck wants to merge 1 commit into
OpenWebNet-HA:masterfrom
gdluck:fix/who4-central-status-whats

Conversation

@gdluck

@gdluck gdluck commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Requested by A · project thread

Before: *4*30*#0## and *4*31*#0## logged "Zone #0's mode is unknown".

After: they log "central unit reports a failure was discovered" / "the central unit battery is KO"; 22, 23, 24 log the probe status. mode stays None and the message type is unchanged, so no consumer behaviour changes; only the log text is specific.

Evidence

Spec. p. 5, p. 24 and p. 64, WHAT table: 22 at least one probe OFF, 23 at least one probe in protection, 24 at least one probe in manual, 30 failure discovered, 31 central unit battery KO. All five are status frames the central unit sends.

libqtdevices TS10_1_0_23. thermal_device.cpp:

 46: 	REMOTE_CONTROL = 21,             // remote control enabled
 47: 	MALFUNCTIONING_FOUND = 30,       // malfunctioning found
 48: 	BATTERY_KO = 31,                 // battery ko
214: 	case REMOTE_CONTROL:
215: 	case MALFUNCTIONING_FOUND:
216: 	case BATTERY_KO:
217: 		break;

The client knows 30 and 31 by name and deliberately leaves the mode untouched for them, which is what OWNd does.

Firmware. Not a command: none of these WHATs is in the bt_termo command set (REPORT.md 2.1 lists every accepted zone / central command), and the emitted corpus (reference/hex2own_corpus.tsv, 26,810 lines) contains none of them, so this slice is spec-backed only. It changes no parsing result.

How

OWNd/message/heating.py: one elif self._mode in (22, 23, 24, 30, 31) branch before the "unknown" fallback. Tests: tests/test_who4_central_status_whats.py. pytest: 1243 passed, 1 skipped.


How to check. libqtdevices quotes are from tag TS10_1_0_23 of OpenWebNet-HA/libqtdevices (BTicino's 2010 touch-screen client, used only as a second client, not as the reference). Firmware rows are replays of the exact frame on the original gateway translator binaries (ARM, from the MyHomeServer1, F454, F459, F461 and F450 images) under QEMU on a fake SCS bus: ACK = *#*1##, NACK = *#*0##, the bus body is what the program put on the SCS bus (hex, without the A8 / checksum / A3 framing). Spec = Legrand/BTicino "Open Web Net Language, WHO = 4" v2.0.0 (2013-11-27). Raw logs, command lists, the harness and the report are in firmware_validation.zip (results/<program>[_<image>].tsv, results/*.cl / *.stub / *.mon, REPORT.md). The firmware images themselves are not included.

Split out of #86 so each change can be checked on its own; the eight slices (#87-#94) merge together in any order without conflicts, and the merged union passes 1285 tests with 100 % coverage of OWNd/message (checked locally on 2026-10-07 after the review rework of #94).

🤖 Generated with Claude Code

https://claude.ai/code/session_018oHp1P4vxxoFnaLUUZpbpZ

OWNd logged *4*30*#0## and *4*31*#0## as "mode is unknown". The Legrand
WHO 4 specification v2.0.0 lists them as central unit status reports
(p. 5, p. 24, p. 64): 22 at least one probe OFF, 23 at least one probe in
protection, 24 at least one probe in manual, 30 failure discovered,
31 central unit battery KO. libqtdevices TS10_1_0_23 names 30 and 31
(thermal_device.cpp:47-48, MALFUNCTIONING_FOUND and BATTERY_KO) and
ignores them for the mode (:214-217). No behaviour change: mode stays
None, only the log text is specific.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018oHp1P4vxxoFnaLUUZpbpZ
@codecov-commenter

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@gdluck

gdluck commented Oct 7, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #97, which carries this change verbatim together with the other WHO 4 heating fixes. Closing as agreed in OpenWebNet-HA/MyHOME#649.

@gdluck gdluck closed this Oct 7, 2026
GreenGrassBlueOcean added a commit that referenced this pull request Oct 16, 2026
…#88, #89, #94)

Consolidate the four domain-focused WHO 4 heating improvements into a single cohesive branch:
1. WHAT 1 / 0 decoded as season (MESSAGE_TYPE_SEASON: hvac_season) with typed .season
   attribute (heating / conditioning), leaving .mode as None so season updates do
   not flip active AUTO/manual operating modes (OWNd#94).
2. WHAT 115#/215#/315# parameter read as weekly program (1..16), not negative temperature,
   exposing .program and .scenario properties on OWNHeatingEvent (OWNd#87).
3. WHAT 13xxx (heating) and 23xxx (conditioning) holiday days assigned to respective
   seasonal modes rather than generic auto, exposing .holiday_days (OWNd#88).
4. WHATs 22, 23, 24, 30, and 31 recognized as central unit system status frames with
   descriptive telemetry logs, leaving mode as None (OWNd#89).

Co-authored-by: gdluck <9041273+gdluck@users.noreply.github.com>
GreenGrassBlueOcean added a commit that referenced this pull request Oct 16, 2026
…d-heating

fix(heating): correct season status, holiday programs, and CU diagnostics (#87, #88, #89, #94)
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.

2 participants