Repository navigation
Conversation
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
The deprecation docstring and warning of OWNHeatingCommand.central_status said gateways refuse `*michnovka#4*WHERE*14##`. In the firmware oracle (trace-corpus) six of the twelve emulated gateways forward it to the bus (nack/out: F453, F453AV, F460, F461, MH200N, MyHomeServer1) and six refuse it (nack/silent); either way it goes unanswered without a central unit (live F461 2.0.11 and MyHomeServer1 3.87.13 NACK it after the bus timeout). The warning now points to status('#0'). The frame is unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
becff50 to
7024ffa
Compare
…undefined in the WHO 4 document The Legrand WHO 4 document reads dimension 14 on zones 1..99 only (p. 18) and, on #0, dimensions 30 and 31 (pp. 57-58); the central unit's set point comes back inside the *4*110#T*#0## reply to *michnovka#4*#0## (p. 56). Text only. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
GreenGrassBlueOcean
left a comment
There was a problem hiding this comment.
Tested 8194705 merged with current master (050dc1d): auto-merges cleanly, 2107 passed (master: 2105 passed), ruff, mypy OWNd tests/typing, scripts/verify_library_standards.py, scripts/sync_documentation.py --check, and tools/golden/validate_corpus.py (166 frames) all pass, as do the MyHOME WHO 4 / live-trace suites.
Stepping back: is there a concrete benefit to doing this?
Before iterating on the wording, do you see a concrete benefit to merging this PR? Personally I do not see it:
OWNHeatingCommand.central_status()has zero callers inMyHOMEand zero callers inOWNd. It wasn't inOWNd 0.xeither — it was introduced during the2.0.0beta (0d14322) and deprecated shortly after in#77.- Runtime behavior, signature, wire frame (
*#4*WHERE*14##), andDeprecationWarningcategory are completely unchanged. - On
master, the existing warning already gives any hypothetical caller the actionable takeaway: do not usecentral_status(), usestatus(where)(status("#0")) instead. Adding a 17-line SKU breakdown on a dead helper, a dedicated 39-line test file asserting prose substrings in__doc__, and aCHANGELOG.mdFixedentry adds maintenance and rebase noise without helping users. Protocol details on$049900300Evs$04990030C0fit much better inOpenWebNet-Encyclopedia/own-firmware-oracle(or we can simply removecentral_status()before2.0.0final).
Unless there is a concrete use case I am missing, I would prefer to close this PR and leave master as-is.
Audit of the current diff (if there is a reason to keep it)
If there is a concrete reason to keep a text update here, several claims in the current diff contradict the captures or go beyond what is verified:
-
"Only a central unit answers it" / "unanswered without a central unit" is contradicted by
MyHOME#629and unverified on forwarding gateways (OWNd/message/heating.py,CHANGELOG.md, PR summary & state diagram):OpenWebNet-HA/MyHOME#629had a central unit, and*#4*#0*14##did not time out there. ThatF454(1.0.34) plant had a live 99-zone central unit at#0— which is why*#4*#0##answered in0.134 s(*4*202*#0##,*4*21*#0##,*4*22*#0##,*4*24*#0##). On that same plant,*#4*#0*14##failed with a fast local NACK in0.098 s(retry0.513 s), matching the oracle'sF454 020051nack/silentverdict (test_f454_rejects_dim14_central_status_fast). The8.02 stimeout inMyHOME#629was*#4*#0#1##(probing a non-existent 4-zone unit), not*#4*#0*14##.- The new
DeprecationWarningmisleads callers who do have a central unit."builds *#4*WHERE*14##, which goes unanswered without a central unit"implies the frame works when a central unit is present, whereas on the sixnack/silentgateways (F450,F454,F459,H4684,MH200,MH202) it is dropped locally even with a#0central unit on the bus (MyHOME#629). - No source establishes that a
3550or4695answers*#4*#0*14##even when forwarded. The docstring states "Forwarded or not, only a central unit answers it" and the state diagram states "answered only by a 3550 / 4695 central unit". Neitherown-firmware-oracle(the3550030020M16C image is static-only with no QEMU target, and no4695image exists), nor any live capture (f461_live_2026-10-23andmyhomeserver1_live_2026-10-24had no central unit), norlibqtdevices/BtExperience, nor the WHO 4 specification establishes that a3550or4695ever answers$049900300E/$0049900300E(which is just the per-zone Dimension 14 read template$0499<ZZ>300Ewith<ZZ>=00after#is stripped). As8194705notes,*#4*#0*14##is undefined in the WHO 4 document — that (plus 6 local refusals and 0 observed replies anywhere) is the proven reason, and whether a3550/4695behind a forwarding gateway would answer$049900300Eis unverified.
-
*4*110#T*#0##is only returned when the central unit is in manual heating mode (OWNd/message/heating.py, PR summary):8194705says "and the central unit's set point comes back inside the*4*110#T*#0##reply to*#4*#0##(p. 56)."110#Tis manual heating (210#Tis manual conditioning); p. 56's flow example happens to show manual heating. When#0is in protection/off (*4*202*#0##, as inMyHOME#629), weekly program (1101..1103/2101..2103), scenario (1201..1216/2201..2216), or holiday (115#P/13DDD#P),*#4*#0##returns that mode frame plus status flags (20..24,30..31) and no*4*110#T*#0##/ setpoint.
-
Drift with
tests/test_issue_77_firmware_findings.py,CHANGELOG.md, and#0#Nguidance:test_central_status_is_deprecated_and_unchangedintests/test_issue_77_firmware_findings.pystill carries the old"""Capture + Gateway: gateways refuse ``*#4*#0*14##``..."""docstring thattests/test_who4_central_status_text.pyasserts is removed. Rather than adding a second test file that pins prose substrings ("trace-corpus","F461") in__doc__,test_issue_77_firmware_findings.pyshould be updated in place, andCHANGELOG.mdshouldn't carry a### Fixedentry when no runtime behavior changed (note also that8194705leftCHANGELOG.mdon the commit-1 wording).*#4*#0##is verified in bothtrace-corpus(OUT (Bus)on all 12 gateways) andMyHOME#629, whereas*#4*#0#1##has not been replayed in the oracle andMyHOMEskips#0#1in status polling — avoid implyingstatus('#0#1')is oracle/capture-verified.
-
Housekeeping:
- Commit
8194705has author/committerMac Book <macbook@Macs-MacBook-Pro.local>(--reset-author/ squash on rebase). - PR description still lists
OpenWebNet-HA/MyHOME#799 (open)twice (merged2026-10-24), describesMyHOME#629as a dimension-14 timeout, and quotes1909 passed, 1 skipped (master: 1907 passed, 1 skipped)(2107/2105on050dc1d).
- Commit
|
Agreed, there is no concrete benefit: Your audit stands, and two of its corrections apply beyond this PR, so for the record: MyHOME#629 had a live 99-zone central unit and |
Requested by A
Summary
The deprecation docstring and warning of
OWNHeatingCommand.central_status()said that gateways refuse*#4*WHERE*14##. They do not all refuse it: in the firmware oracle six of the twelve emulated gateways forward*#4*#0*14##to the bus and six refuse it. The reason the frame never answers on the plants that reported it is that only a central unit answers it. The old text also pointed tostatus(where)without saying which address to use. Documentation and warning text only; the frame is unchanged. Note (PDF audit of 2026-10-26): the Legrand WHO 4 document defines the dimension 14 read on zones 1..99 only (p. 18) and, on#0, reads of dimensions 30 and 31 (pp. 57-58);*#4*#0*14##is undefined there, and the central unit's set point comes back inside the*4*110#T*#0##reply to*#4*#0##(p. 56). The docstring now says so.Refs #77 (the MyHomeServer1 3.1.8 probe),
OpenWebNet-HA/MyHOME#629(F454 timeout). Split out of #137 so that the validator change and this text change can be reviewed and reverted on their own.Changes
OWNd/message/heating.py,central_status: the docstring names the six forwarding and the six refusing gateways from the oracle and says the frame goes unanswered without a central unit (live F461 2.0.11 and MyHomeServer1 3.87.13 without one, the Suggestions #77 MyHomeServer1 3.1.8 probe, theOpenWebNet-HA/MyHOME#629F454 timeout). The warning reads "...which goes unanswered without a central unit; useOWNHeatingCommand.status('#0')(OWNHeatingCommand.status(where)) instead". The existingmatch=r"use OWNHeatingCommand\.status"test (tests/test_issue_77_firmware_findings.py) still passes.CHANGELOG.md: entry under[Unreleased]/Fixed.State Diagram
stateDiagram-v2 direction LR state "central_status('#0') -> *#4*#0*14## (frame unchanged)" as Call state "Forwarded to the bus (nack/out): F453, F453AV, F460, F461, MH200N, MyHomeServer1" as Fwd state "Refused by the gateway (nack/silent): F450, F454, F459, H4684, MH200, MH202" as Ref state "Unanswered without a central unit (live F461 2.0.11, MyHomeServer1 3.87.13); answered only by a 3550 / 4695 central unit" as Out [*] --> Call Call --> Fwd : oracle trace-corpus Call --> Ref : oracle trace-corpus Fwd --> Out Ref --> OutWhere are the traces
OpenWebNet-HA/MyHOME#799(open),f461_live_2026-10-23run 1 (run1_oracle_replay_readonly)*#4*#0*14##NACK after the bus timeout (about 2.1 s): forwarded, unansweredOpenWebNet-HA/MyHOME#799(open),myhomeserver1_live_2026-10-24run 2 (run2_reads_thermo_sound_alarm_lights)*#4*#0##and*#4*#0*14##NACK after ~4.2 s (forwarded, unanswered, one OWNd retry)OpenWebNet-HA/MyHOME#629(F454: dimension 14 timed out while*#4*#0##answered in 0.13 s)*#4*#0*14##What does the Oracle say
Suite
trace-corpus,results/<P>/<V>/oracle/full/trace-corpus.tsv, input*#4*#0*14##:010100, F453AV030014, MH200N010108, MyHomeServer1028206nack/out$049900300E(request forwarded; no central unit on the emulated bus)020012, F461020011nack/out$0049900300E(same request, the 3-digit RPMsg form of these two images)020010, F454020051, F459020105, H4684020054, MH200020102, MH202010024nack/silentTesting
tests/test_who4_central_status_text.py(new, 2 cases):test_central_status_deprecation_names_the_real_reason(docstring no longer says "which gateways refuse", namestrace-corpusand the F461; the warning is aDeprecationWarningthat says "unanswered without a central unit" andstatus('#0'); the frame is still*#4*#0*14##),test_central_status_frame_and_default_are_unchanged(#0default,#0#1).master1 fails (the old text), 1 passes; on this branch both pass.1909 passed, 1 skipped(master:1907 passed, 1 skipped); 100 % statement coverage,mypyclean,ruffclean,scripts/sync_documentation.py --checkandscripts/verify_library_standards.pypass.Live retest (2026-10-24)
Not exercised live: documentation and warning text only; the frame it describes is unchanged (its live outcome is in the traces table).
Companion
None. Split from #137 (
set_central_modevalidator).🤖 Generated with Claude Code