Skip to content

docs(heating): central_status deprecation text names the real reason - #143

Closed
gdluck wants to merge 2 commits into
OpenWebNet-HA:masterfrom
gdluck:docs/who4-central-status-deprecation-text
Closed

gdluck wants to merge 2 commits into
OpenWebNet-HA:masterfrom
gdluck:docs/who4-central-status-deprecation-text

Conversation

@gdluck

@gdluck gdluck commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

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 to status(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, the OpenWebNet-HA/MyHOME#629 F454 timeout). The warning reads "...which goes unanswered without a central unit; use OWNHeatingCommand.status('#0') (OWNHeatingCommand.status(where)) instead". The existing match=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 --> Out
Loading

Where are the traces

Subsystem Capture Plant Frames verified by this PR
WHO 4 dimension 14 on the central-unit address trace PR: OpenWebNet-HA/MyHOME#799 (open), f461_live_2026-10-23 run 1 (run1_oracle_replay_readonly) BTicino F461 2.0.11, no central unit *#4*#0*14## NACK after the bus timeout (about 2.1 s): forwarded, unanswered
same trace PR: OpenWebNet-HA/MyHOME#799 (open), myhomeserver1_live_2026-10-24 run 2 (run2_reads_thermo_sound_alarm_lights) MyHomeServer1 3.87.13, no 3550 / 4695 central unit *#4*#0## and *#4*#0*14## NACK after ~4.2 s (forwarded, unanswered, one OWNd retry)
earlier reports #77 (MyHomeServer1 3.1.8 gateway probe: NACK), OpenWebNet-HA/MyHOME#629 (F454: dimension 14 timed out while *#4*#0## answered in 0.13 s) MyHomeServer1 3.1.8; F454 *#4*#0*14##

What does the Oracle say

Suite trace-corpus, results/<P>/<V>/oracle/full/trace-corpus.tsv, input *#4*#0*14##:

Gateway Reply / verdict Bus output
F453 010100, F453AV 030014, MH200N 010108, MyHomeServer1 028206 nack / out $049900300E (request forwarded; no central unit on the emulated bus)
F460 020012, F461 020011 nack / out $0049900300E (same request, the 3-digit RPMsg form of these two images)
F450 020010, F454 020051, F459 020105, H4684 020054, MH200 020102, MH202 010024 nack / silent none

Testing

  • 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", names trace-corpus and the F461; the warning is a DeprecationWarning that says "unanswered without a central unit" and status('#0'); the frame is still *#4*#0*14##), test_central_status_frame_and_default_are_unchanged (#0 default, #0#1).
  • Fail before / pass after: on master 1 fails (the old text), 1 passes; on this branch both pass.
  • Full suite: 1909 passed, 1 skipped (master: 1907 passed, 1 skipped); 100 % statement coverage, mypy clean, ruff clean, scripts/sync_documentation.py --check and scripts/verify_library_standards.py pass.

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_mode validator).

🤖 Generated with Claude Code

@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!

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>
@gdluck
gdluck force-pushed the docs/who4-central-status-deprecation-text branch from becff50 to 7024ffa Compare October 26, 2026 08:56
@gdluck

gdluck commented Oct 26, 2026

Copy link
Copy Markdown
Contributor Author

Rebased on master 87cafc3 (after #136): the CHANGELOG [Unreleased] entry and the heating.py regex block now sit beside the merged dimension-22 guard; content unchanged, suite and 100 % coverage green.

…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 GreenGrassBlueOcean left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 in MyHOME and zero callers in OWNd. It wasn't in OWNd 0.x either — it was introduced during the 2.0.0 beta (0d14322) and deprecated shortly after in #77.
  • Runtime behavior, signature, wire frame (*#4*WHERE*14##), and DeprecationWarning category are completely unchanged.
  • On master, the existing warning already gives any hypothetical caller the actionable takeaway: do not use central_status(), use status(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 a CHANGELOG.md Fixed entry adds maintenance and rebase noise without helping users. Protocol details on $049900300E vs $04990030C0 fit much better in OpenWebNet-Encyclopedia / own-firmware-oracle (or we can simply remove central_status() before 2.0.0 final).

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:

  1. "Only a central unit answers it" / "unanswered without a central unit" is contradicted by MyHOME#629 and unverified on forwarding gateways (OWNd/message/heating.py, CHANGELOG.md, PR summary & state diagram):

    • OpenWebNet-HA/MyHOME#629 had a central unit, and *#4*#0*14## did not time out there. That F454 (1.0.34) plant had a live 99-zone central unit at #0 — which is why *#4*#0## answered in 0.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 in 0.098 s (retry 0.513 s), matching the oracle's F454 020051 nack/silent verdict (test_f454_rejects_dim14_central_status_fast). The 8.02 s timeout in MyHOME#629 was *#4*#0#1## (probing a non-existent 4-zone unit), not *#4*#0*14##.
    • The new DeprecationWarning misleads 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 six nack/silent gateways (F450, F454, F459, H4684, MH200, MH202) it is dropped locally even with a #0 central unit on the bus (MyHOME#629).
    • No source establishes that a 3550 or 4695 answers *#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". Neither own-firmware-oracle (the 3550 030020 M16C image is static-only with no QEMU target, and no 4695 image exists), nor any live capture (f461_live_2026-10-23 and myhomeserver1_live_2026-10-24 had no central unit), nor libqtdevices / BtExperience, nor the WHO 4 specification establishes that a 3550 or 4695 ever answers $049900300E / $0049900300E (which is just the per-zone Dimension 14 read template $0499<ZZ>300E with <ZZ>=00 after # is stripped). As 8194705 notes, *#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 a 3550 / 4695 behind a forwarding gateway would answer $049900300E is unverified.
  2. *4*110#T*#0## is only returned when the central unit is in manual heating mode (OWNd/message/heating.py, PR summary):

    • 8194705 says "and the central unit's set point comes back inside the *4*110#T*#0## reply to *#4*#0## (p. 56)."
    • 110#T is manual heating (210#T is manual conditioning); p. 56's flow example happens to show manual heating. When #0 is in protection/off (*4*202*#0##, as in MyHOME#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.
  3. Drift with tests/test_issue_77_firmware_findings.py, CHANGELOG.md, and #0#N guidance:

    • test_central_status_is_deprecated_and_unchanged in tests/test_issue_77_firmware_findings.py still carries the old """Capture + Gateway: gateways refuse ``*#4*#0*14##``...""" docstring that tests/test_who4_central_status_text.py asserts is removed. Rather than adding a second test file that pins prose substrings ("trace-corpus", "F461") in __doc__, test_issue_77_firmware_findings.py should be updated in place, and CHANGELOG.md shouldn't carry a ### Fixed entry when no runtime behavior changed (note also that 8194705 left CHANGELOG.md on the commit-1 wording).
    • *#4*#0## is verified in both trace-corpus (OUT (Bus) on all 12 gateways) and MyHOME#629, whereas *#4*#0#1## has not been replayed in the oracle and MyHOME skips #0#1 in status polling — avoid implying status('#0#1') is oracle/capture-verified.
  4. Housekeeping:

    • Commit 8194705 has author/committer Mac Book <macbook@Macs-MacBook-Pro.local> (--reset-author / squash on rebase).
    • PR description still lists OpenWebNet-HA/MyHOME#799 (open) twice (merged 2026-10-24), describes MyHOME#629 as a dimension-14 timeout, and quotes 1909 passed, 1 skipped (master: 1907 passed, 1 skipped) (2107 / 2105 on 050dc1d).

@gdluck

gdluck commented Oct 26, 2026

Copy link
Copy Markdown
Contributor Author

Agreed, there is no concrete benefit: central_status() has no caller and its warning on master already says what matters. Closing this PR and leaving master as it is; removing the helper before 2.0.0 final is your call.

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 *#4*#0*14## failed there with a fast local NACK (0.098 s), the 8 s timeout was *#4*#0#1##; "only a central unit answers it" was never established by any source (no 3550 / 4695 image or capture answers $049900300E); *4*110#T*#0## is the manual-heating reply only. The protocol detail belongs in the Encyclopedia / oracle, as you say. The commit author on 8194705 (Mac Book <macbook@…local>) came from a scratch checkout without a git identity; it is fixed for every future commit, and the other open drafts that carry it will be re-authored.

@gdluck gdluck closed this Oct 26, 2026
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.

3 participants