Repository navigation
Conversation
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
|
Thanks for splitting this out and for the evidence. I'm not in favour of merging it, though, because of what it does to the API surface, not because of the size of the change. The problem it points at is in OWNd. The description says Why I don't want
What I'd rather see:
The libqtdevices reference ( |
8e2bd79 to
55c266d
Compare
OpenWebNet-HA/OWNd#94 decodes *4*1*Z## / *4*0*Z## as hvac_season with a season attribute. A zone that is AUTO, HEAT or COOL keeps its mode on it; a zone that was OFF or unknown takes the season's mode; a central unit shows the season as its mode. No WHAT is read anywhere. With the pinned OWNd 2.0.0b10 the frame still arrives as hvac_mode and takes the old path. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Implemented as the maintainer asked. PR 94 is now "fix(heating): decode WHAT 1 / 0 as the season, not an operating mode" and no longer adds
One consequence to expect: PR 94's downstream "MyHOME test suite" job will stay red until #649 is merged, because MyHOME's upstream branch does not yet handle Done. PR 94's description now opens with a point-by-point follow-up to the review: each of the maintainer's six points (decoding in OWNd, no bare WHAT, nothing new on |
*4*1*Z## and *4*0*Z## are the zone operation mode frame (Legrand WHO 4 v2.0.0 p. 5, 13, 16, 19, 63): the zone, or the central unit, operates in the heating (1) or conditioning (0) season. OWNHeatingEvent read them as mode heat / cool, which made a zone running the central unit's program look like a manual heat / cool zone. They now carry message_type MESSAGE_TYPE_SEASON, season SEASON_HEATING / SEASON_CONDITIONING and mode None; every season-specific mode WHAT (1xx, 11xx, 12xx, 13xxx / 2xx, 21xx, 22xx, 23xxx) also exposes its season. Evidence: libqtdevices TS10_1_0_23 probe_device.cpp:240-253 keeps a zone in automatic on the frame; the MyHomeServer1 translator emits it with the dimension 12 setpoint report (512 of 534 reports in the emitted corpus). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
55c266d to
04ac92c
Compare
|
Superseded by #97, which carries this change verbatim together with the other WHO 4 heating fixes. Closing as agreed in OpenWebNet-HA/MyHOME#649. |
…#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>
Requested by A · project thread
Reworked after the review on the first version of this PR, which added a public
OWNMessage.what. That property is gone; the frame is decoded in OWNd, as suggested:OWNHeatingEventdecodes the frame itself; MyHOME#649 reads the typed attribute and no longer knows that WHO 4what == 1is a season frame.seasonon the WHO 4 event only.OWNMessage; the additions areMESSAGE_TYPE_SEASON,SEASON_HEATING,SEASON_CONDITIONINGandOWNHeatingEvent.season.Nonemeaning two things → not applicable any more;seasonisNoneonly for WHATs that have no season.modeshould stop conflating season and operating mode → the bare WHAT 1 / 0 frame now hasmode = Noneandmessage_type = "hvac_season"; the operating-mode WHATs (110 / 111 / 103 …) keepmodeand additionally expose their season._whatfallback goes away → done; with the pinned OWNd 2.0.0b10 the frame still arrives ashvac_modeand takes MyHOME's unchanged path, so the two can merge in either order.Before:
*4*1*Z##and*4*0*Z##were read asmode = heat/cool(message_type = hvac_mode), so a zone running the central unit's program looked like a manual heat / cool zone, and a consumer that wanted to tell the two apart had to look at the private_what.After:
OWNHeatingEventgets a typedseasonattribute (SEASON_HEATING/SEASON_CONDITIONING/None), separate from the operating mode. The bare WHAT 1 / 0 frame ismessage_type = MESSAGE_TYPE_SEASON("hvac_season"),seasonset,mode = None. Every season-specific mode WHAT also carries its season (110→ heat + heating,210→ cool + conditioning,102→ off + heating,1102→ heat + heating,2201→ cool + conditioning); the generic WHATs (3xx,31xx,32xx,33xxx) haveseason = None. Nothing else inmodechanges. No raw WHAT is exposed.Evidence
Spec. Legrand WHO 4 v2.0.0: p. 5 WHAT table,
0"Conditioning Mode",1"Heating Mode"; p. 13, 16, 19 and 63 list*4*what*where##with what = 0 conditioning / 1 heating / 102 / 202 / 303 as the "zone operation mode acquire frame", given together with the setpoint frames; the operating modes are the separate WHATs 110 / 210 (manual), 111 / 211 (automatic), 103 / 203 (off) on p. 55 and p. 65. The season digit is the hundreds / thousands digit of every mode WHAT (p. 5: 1xx / 11xx / 12xx / 13xxx heating, 2xx / 21xx / 22xx / 23xxx conditioning, 3xx / 31xx / 32xx / 33xxx generic).libqtdevices TS10_1_0_23.
probe_device.cpp:The client does not change a zone that is already manual or automatic on this frame;
thermal_device.cpp:111-119(setSummer/setWinter) sends WHAT 0 / 1 to the central unit as the season command.Firmware. The MyHomeServer1 translator emits
*4*1*Z##/*4*0*Z##with the dimension 12 setpoint report (oracle/SCS_OWN_MAP.mdsection 4, dimension12: mode byteF0→*4*1*Z##,F1→*4*0*Z##,F2→ 102,F3→ 202,FF→ 303). Emitted corpus (hex2own_corpus.tsv): 35 lines*4*1*Z##, 19 lines*4*0*Z##; 512 of the 534 dimension-12 reports are followed by such a frame. As commands,*4*1*23##/*4*0*23##are accepted and forwarded (93 17 30 00/01), identical on MyHomeServer1, F454, F459, F461 and F450 (results/termo*.tsv).How
OWNd/message/heating.py:MESSAGE_TYPE_SEASON,SEASON_HEATING,SEASON_CONDITIONING, theseasonproperty, and the WHAT 1 / 0 branch ahead of the mode classification; exported fromOWNd/message/__init__.py. Tests: newtests/test_who4_season.py;tests/test_issue_77_firmware_findings.py(fix 1) now expects the season reading for WHAT 1 / 0;tests/test_message_exhaustive.pyused the undocumented*4*1#0215*1##as a mode-target frame and now uses the documented*4*110#0215*1##(Spec p. 23).pytest: 1252 passed, 2 skipped locally (plus the metadata test that needs the package installed). Coverage ofheating.pystays 100 %.Consumer impact: a consumer that mapped
mode == heat/coolfrom the bare frame now receiveshvac_seasoninstead. OpenWebNet-HA/MyHOME#649 is updated to readseason(and no longer touches any WHAT); with the pinned OWNd 2.0.0b10 it keeps the old path.How to check.
libqtdevicesquotes are from tagTS10_1_0_23of 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. 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. 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