Repository navigation
Conversation
This was referenced Oct 7, 2026
…emperature OWNd parsed *4*115#1102*#0## as "heat at -10.2 °C". The parameter of the holiday-plan WHATs 115/215/315 is the weekly program the central unit resumes afterwards (Legrand WHO 4 v2.0.0 p. 56 and p. 64: "115#parameterH", parameterH = 1101-1103). libqtdevices TS10_1_0_23 reads it as whatArgN(0) % 100 (thermal_device.cpp:241, 286). The gateway firmware (bt_termo on MyHomeServer1, F454, F459, F461, F450) accepts the frame and forwards it as D1 00 03 02 C1 14 01 00: byte 7 is the program number, there is no temperature field. The event now exposes program (also for 11xx/21xx/31xx WHATs) and scenario (12xx/22xx/32xx), and keeps hvac_mode as its type. 110#T, 210#T and 312#T#2 still read the temperature. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018oHp1P4vxxoFnaLUUZpbpZ
gdluck
force-pushed
the
fix/who4-holiday-plan-program
branch
from
October 7, 2026 17:22
824a080 to
3cd1811
Compare
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
This was referenced Oct 7, 2026
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. |
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>
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.
Requested by A · project thread
Before:
*4*115#1102*#0##was read as "heat at -10.2 °C" (set_temperature = -10.2,message_type = hvac_mode_target).After: it is read as "heating, holiday daily plan, program 2" (
program = 2,set_temperature = None,message_type = hvac_mode). The event also exposesprogramfor the11xx/21xx/31xxWHATs andscenariofor12xx/22xx/32xx.110#T,210#Tand312#T#2keep reading the temperature.Evidence
Spec. p. 56 and p. 64: the WHAT of the weekend / holiday plan is
115#parameterH(heating) or215#parameterH(conditioning), where parameterH is the weekly program to resume,1101-1103/2101-2103. It is not a temperature field; temperatures appear only in110#T/210#T(p. 23, p. 56).libqtdevices TS10_1_0_23.
thermal_device.cpp:The parameter of 115/215 is
whatArgN(0) % 100, a program number;commandRange()(:350-358) splits1102into command1100+ program2.Why the old reading produced -10.2 °C: in BTicino's 4-digit temperature convention a value of 1000 or more is negative (
libqtcommonTS10_1_0_23scaleconversion.cpp:57-67,bt2Celsius(); its tests feed*#4*Z*0*1039##and*#4*Z*15*1*1010*1111##as -3.9 °C and -1.0 °C,test/test_scenevodevicescond.cpp:451-453, 495), so1102taken as a temperature is -10.2 °C. The same digits are a program code when they follow115#, which is what this change distinguishes.Firmware. bt_termo (
results/termo.tsvandtermo_f454,termo_F459,termo_f461,termo_F450.tsv, identical on all five):*4*115#1102*#0##D1 00 03 02 C1 14 01 0014holiday plan heating, byte 7 =01→ program 2*4*215#2102*#0##D1 00 03 02 C1 24 01 0024)*4*1102*#0##D1 00 03 02 C1 11 01 00*4*2102*#0##D1 00 03 02 C1 21 01 00*4*1203*#0##D1 00 03 02 C1 13 02 00*4*3113*#0##D1 00 03 02 C1 01 0C 00*4*3209*#0##D1 00 03 02 C1 03 08 00The
#1102parameter is forwarded as the one-byte program index (01, zero-based), in the same byte the plain program command uses. There is no temperature on the bus. Compare the real setpoint write*#4*#0*#14*0250*1##→D1 00 03 02 C1 12 32 00(32= 25.0 °C),REPORT.md2.1.How
OWNd/message/heating.py: a115/215/315frame with a parameter setsprogram = int(param) % 100and keepshvac_mode; the existing "mode with parameter = target temperature" branch now runs only for the other WHATs. Newprogram/scenarioproperties. Tests:tests/test_who4_holiday_plan_program.py.pytest: 1241 passed, 1 skipped.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: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