Skip to content

fix(profiles): drop WHO 16 from the F461 and MyHomeServer1 profiles - #142

Draft
gdluck wants to merge 1 commit into
OpenWebNet-HA:masterfrom
gdluck:fix/profiles-f461-mhs1-no-who16
Draft

gdluck wants to merge 1 commit into
OpenWebNet-HA:masterfrom
gdluck:fix/profiles-f461-mhs1-no-who16

Conversation

@gdluck

@gdluck gdluck commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Requested by A

Status: draft, blocked by design until the OWNd pin bump. Two required checks of this repository are red on this branch by construction (see Testing): they run the MyHOME suite, whose scripts/update_gateway_profiles.py hard-codes the F461 and MyHomeServer1 discovery rows as [1, 2, 4, 16, 18] and whose tests compare that row with profile.supports_who. The MyHOME companion that changes those rows is a draft that is red against the pinned OWNd for the same reason; the pair lands together with the OWNd release that includes this PR.

Summary

F461Profile and MyHomeServer1Profile list WHO 16 (Sound System) in supported_who. Neither gateway has a WHO 16 translator: all 86 WHO 16 inputs of the oracle suites are refused on both (and the four status requests re-sent live on 2026-10-24, *#16*0*5##, *#16*0*1##, *#16*1*5##, *#16*0*12##, NACK in 3-9 ms on F461 2.0.11 and MyHomeServer1 3.87.13), so MyHOME's startup sweep sends a *#16*0*5## that is always NACKed, a standby F461 / MyHomeServer1 claims WHO 16 events it has no translator for, and a configured WHO 16 media player produces nothing but refused frames (OpenWebNet-HA/MyHOME#424 describes the plants that speak only WHO 22). Their sound system is WHO 22, which both forward.

Refs OpenWebNet-HA/MyHOME#424, OpenWebNet-HA/MyHOME#459, OpenWebNet-HA/MyHOME#794 (the gate that reads the profile), OpenWebNet-HA/MyHOME#799 (the live NACKs).

Changes

  • OWNd/profiles.py: _WITHOUT_WHO16 = (WHO_SOUND,); the F461 and MyHomeServer1 supported_who drop it (next to the existing WHO_LOAD_CONTROL exclusion). WHO 22 stays listed and supports_audio is unchanged, so features_summary and the README profile table do not change. No new flag: supported_who already carries the meaning, and supports_who(16) is what MyHOME's sweep, sweep_bus service, standby ownership and topology delegation read.
  • Not changed, on purpose:
    • MH202 keeps WHO 16. Its oracle refuses WHO 16 commands too, but a live MH202 relays WHO 16 state frames from an F441M matrix (*#16*41*1*1##, *#16*41*1*6##; OpenWebNet-HA/MyHOME#669 trace), and supported_who also decides which gateway owns those events on a shared bus. The docstring records this. One inference, stated as such: whether an F461 / MyHomeServer1 would relay WHO 16 events from an F441M on its bus is untested (no such plant is available); the removal rests on the missing bt_difson translator, the refused inputs and the OpenWebNet-HA/MyHOME#459 statement. If the maintainers prefer to keep event ownership, a tri-state flag is the alternative.
    • F459 / F460 have no dedicated profile and resolve to GenericGatewayProfile, whose default keeps WHO 16 for the F454 / MH200N class.
  • python scripts/sync_documentation.py --update reports the README already in sync (the profile table lists features, not WHOs). CHANGELOG.md: entry under [Unreleased] / Fixed.

Topology side effect in MyHOME (from the review of the MyHOME uses of supported_who): topology.py already strips 16 / 22 for a MyHomeServer1; with this change an F461 primary lets a WHO-16-capable follower own WHO 16 (and 22) events, which is correct, and a same-tier F454 / F461 pair now picks the F454 by WHO count instead of by MAC. The standby failover (gateway_events.py) no longer lets a standby F461 / MyHomeServer1 claim WHO 16 events it cannot relay. One cost: a WHO 16 media player configured against one of these gateways polls *#16*ZONE*5## per zone at startup (media_player.py) instead of one refused sweep frame; such a player cannot work on these gateways anyway, and the MyHOME side gates that poll.

Alternative considered and not chosen: keep WHO 16 in supported_who and add a tri-state supports_who16_status_request = False flag that OpenWebNet-HA/MyHOME#794 reads for the *#16*0*5## gate. That would keep this repository's CI green today, but it would leave supported_who advertising a WHO that no capture or published source supports (the #100 rule: supported_who lists only what a capture or a published spec supports), and it would leave the standby / topology ownership of WHO 16 events on these gateways in place. The removal rests on: 86 of 86 WHO 16 oracle inputs refused on both images, no bt_difson in either firmware image, and two live NACKs on two models.

State Diagram

stateDiagram-v2
    direction TB

    state "1. MyHOME startup sweep per WHO in profile.supported_who (gateway.py)" as Sweep {
        [*] --> Who16
        Who16 --> Sent : before - 16 in F461Profile / MyHomeServer1Profile\n*#16*0*5## sent, NACK in 3-5 ms , F461 2.0.11, MyHomeServer1 3.87.13
        Who16 --> Skipped : after - 16 not in supported_who\nlog Skipping WHO=16 discovery - not supported by F461 profile. - nothing sent
        [*] --> Who22
        Who22 --> SentOk : unchanged - WHO 22 stays listed, supports_audio True
    }

    state "2. Standby / topology ownership of WHO 16 events on a shared bus (gateway_events.py, topology.py)" as Own {
        [*] --> F461primary
        F461primary --> Follower : after - a WHO-16-capable follower , F454, MH200N, MH202, ... owns WHO 16 + 22
        F461primary --> Itself : before - the F461 claimed WHO 16 events it cannot relay
    }
Loading

Where are the traces

Subsystem Capture Plant Frames verified by this PR
WHO 16 status request on the F461 trace PR: OpenWebNet-HA/MyHOME#799 (open), f461_live_2026-10-23 run 1 (run1_oracle_replay_readonly) BTicino F461 2.0.11 *#16*0*5## NACK within 5 ms; all 18 WHO 16 requests of the run NACK in under 10 ms
WHO 16 status request on the MyHomeServer1 trace PR: OpenWebNet-HA/MyHOME#799 (open), myhomeserver1_live_2026-10-24 run 2 (run2_reads_thermo_sound_alarm_lights) MyHomeServer1 3.87.13 (the oracle emulates 2.82.06) *#16*0*5## and *#16*101*5## NACK in 3 ms (immediate refusal, no bus timeout)
earlier MyHomeServer1 report upstream MyHOME fixture tests/fixtures/traces/issue_466/MyHomeServer1_dead_zone_nacks_2026-09-29T22-45.txt ("Gateway rejected status request *#16*0*5## (NACK, 0 response(s))") MyHomeServer1 *#16*0*5##
MH202 relaying WHO 16 (why MH202 keeps it) upstream MyHOME fixture tests/fixtures/traces/mh202_sound_intercom_ducking (OpenWebNet-HA/MyHOME#669) MH202 + F441M *#16*41*1*1##, *#16*41*1*6##

What does the Oracle say

Every WHO 16 frame in the suites, results/F461/020011/oracle/full/*.tsv and results/MyHomeServer1/028206/oracle/full/*.tsv: 86 distinct WHO 16 inputs per gateway (77 of them in sound-who16-source, the rest in trace-corpus and the other suites), all nack / silent, i.e. the translator never puts them on the bus. First rows of sound-who16-source.tsv on both:

Frame F461 020011 MyHomeServer1 028206
*#16*0*5## nack / silent nack / silent
*#16*100*5## nack / silent nack / silent
*#16*101*#10*1## nack / silent nack / silent
*#16*101*#6*0*107000## nack / silent nack / silent
... (73 more) nack / silent nack / silent

Firmware images (own-firmware-oracle README.md, firmware table): F461 020011 ships bt_luci, bt_device, bt_termo, bt_multi, bt_supervisione, coso (plus bt_daemon, openserver, scsserver); MyHomeServer1 028206 the same set; neither ships bt_difson (the WHO 16 translator that F453, F453AV, F454, MH200 and MH200N do ship). The F461 openserver [Stackopen] section in oracle/targets/F461/020011.yaml registers bt_multi for WHO 22 and no client for WHO 16.

WHO 22 (sound-who22, 63 inputs per gateway): put on the bus by both for 60 of the 63 inputs (44 ack/out, 16 nack/out; 1 ack/silent, 2 nack/silent; identical on F461 020011 and MyHomeServer1 028206), which is why WHO 22 and supports_audio stay. On the OpenWebNet-HA/MyHOME#459 quote: the maintainer wrote there that the MyHomeServer1 firmware "discards 5, 16, 22"; this PR uses it for 16 (and 5 is handled by OpenWebNet-HA/MyHOME#794 / OpenWebNet-HA/MyHOME#803), while for 22 the published sound-who22 rows show the frames forwarded, so WHO 22 is kept. No WHO 22 frame was sent to the live MyHomeServer1 (a real home), so that disagreement is settled by the oracle rows only.

Testing

  • tests/test_profiles.py: new test_who16_is_not_advertised_where_the_oracle_refuses_it (F461, MyHomeServer1, MHS1, MyHome Server 1: no WHO 16, WHO 22 kept, supports_audio is True) and test_who16_stays_on_gateways_that_forward_it (F454, MH200N, MH200, H4684, F453, F453AV, H4890, MH202); test_profile_lookup_accepts_common_name_variants updated for the MyHomeServer1 alias.
  • Fail before / pass after: on master 5 of the module's 70 tests fail (the four not supports_who(WHO_SOUND) cases and the alias test); on this branch all 70 pass. tests/test_firmware_oracle_conformance.py (26) still passes.
  • Full suite: 1919 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.
  • CI: 6 of 8 checks green; two red by construction (both run the MyHOME checkout against this OWNd):
    • Golden corpus & smoke gates, gate 5 tests/test_firmware_oracle_conformance.py::test_gateway_profiles_match_oracle_verdicts: "Discovery row F461 queried_whos=[1, 2, 4, 16, 18] disagrees with F461 profile [1, 2, 4, 18]" (and MyHomeServer1).
    • MyHOME test suite: 5 failed, 4411 passed: the same conformance test, test_gateway_profiles.py::test_generate_gateway_discovery_table_and_verify_oracle (expects | **F461** | WHO 1, 2, 4, 16, 18 |), test_oracle_check_rejects_patched_profile_instance, test_sync_documentation.py::test_sync_gateway_profiles_detects_drift and test_check_all_documentation_real_tree ("Gateway Discovery table out of sync in docs/getting-started/hardware-compatibility.md").
    • Cause: MyHOME's scripts/update_gateway_profiles.py hard-codes [1, 2, 4, 16, 18] for both models. The MyHOME companion changes those rows, regenerates docs/getting-started/hardware-compatibility.md and the test expectations; with it and this OWNd the MyHOME suite passes (4410 passed, 1 skipped in the combined build of 2026-10-24).

Live retest (2026-10-24)

Confirmed for this startup configuration: with this profile, four starts of the integration sent no *#16*0*5## (HA bus-monitor history) and logged Skipping WHO=16 discovery: not supported by F461 profile; the zone and humidity requests were still sent. Other gateway models were not tested live.

Companion

MyHOME companion: OpenWebNet-HA/MyHOME#808 (chore(profiles): derive the discovery rows from the OWNd profile (prep for OpenWebNet-HA/OWNd#142), draft): scripts/update_gateway_profiles.py and tests/test_gateway_profiles.py derive the F461 / MyHomeServer1 discovery rows from profile.supports_who instead of a static list, so it is green against the pinned OWNd 2.0.0b11 and against this branch; hardware-compatibility.md regenerates to WHO 1, 2, 4, 18 at the pin bump that includes this PR (sequencing: #808 → this PR → OWNd release → pin bump). OpenWebNet-HA/MyHOME#794 gates the startup *#16*0*5## request on profile.supports_who(16) with a MyHOME fallback table until this lands.

🤖 Generated with Claude Code

Both profiles advertised WHO 16 (Sound System), so MyHOME's startup sweep
sent `*OpenWebNet-HA#16*0*5##` and configured WHO 16 media players only ever produced
refused frames on these gateways.

own-firmware-oracle: all 86 WHO 16 frames of the suites (77 of them in
sound-who16-source) are nack/silent on F461 020011 and MyHomeServer1
028206, i.e. no translator forwards them; the firmware table shows both
images ship bt_multi (WHO 22) and no bt_difson (WHO 16), and the F461
openserver Stackopen lists no WHO 16 client. Live: the F461 2.0.11 NACKs
`*OpenWebNet-HA#16*0*5##` within 5 ms (2026-10-23) and a MyHomeServer1 NACKs it in the
MyHOME issue_466 trace fixture; MyHOME#459 already notes the MyHomeServer1
"firmware discards 5, 16, 22".

WHO 22 stays listed and supports_audio is unchanged: sound-who22 is
forwarded by both. No new flag: supported_who already carries the
meaning. MH202 keeps WHO 16 although its oracle refuses WHO 16 commands,
because a live MH202 relays WHO 16 state from an F441M (MyHOME#669) and
supported_who also decides which gateway owns those events. F459 and
F460 resolve to GenericGatewayProfile and are not changed.

scripts/sync_documentation.py --update reports the README already in
sync (the profile table does not list WHOs).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@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 marked this pull request as draft October 24, 2026 13:39
gdluck pushed a commit to gdluck/HomeAssistant-MyHOME that referenced this pull request Oct 24, 2026
…tical with and without OWNd (CI follow-up)

The quality-scale, test-coverage and docs CI jobs run scripts/verify_ha_standards.py and
scripts/sync_documentation.py --check without OWNd installed ("[OWND] Client library
verification skipped (OWNd not in path: No module named 'OWNd')"). The first push derived
the startup discovery rows from the installed OWNd profile only and printed
"unknown (OWNd profile not available)" otherwise, so those jobs regenerated a table that
differed from the committed docs/getting-started/hardware-compatibility.md:
"[RULE_DOCS_ANTI_DRIFT] Gateway Discovery table out of sync".

Each discovery row now carries pinned_whos, the row the pinned OWNd 2.0.0b11 yields; it is
used only when OWNd is not importable, so the generated table is byte-identical with and
without OWNd. With OWNd importable the row is still derived from profile.supports_who over
STARTUP_DISCOVERY_WHOS, as the startup gate does, and notes_without_who16 applies whenever
the row does not carry WHO 16. verify_profiles_against_oracle() flags a row whose
profile_name resolves to the generic profile (get_gateway_profile() never returns None).

Tests: without OWNd every row carries exactly its pinned_whos and the generated block equals
the committed one; with OWNd the derived block equals the committed one (installed profile ==
committed table == pinned_whos); pinned_whos is ignored when OWNd is importable. Fail-before
on the first-push script: 3 of 18 fail; all pass after. sync_documentation.py --check passes
in a venv without OWNd and with OWNd master (f04d8aa) on PYTHONPATH. Against the OWNd OpenWebNet-HA#142
branch (95dc8a5) the two docs-equality tests report the drift that the pin bump resolves
with --update together with pinned_whos.

Oracle re-check at own-firmware-oracle main 72759e8 (results/mcp_index.json, schema 1.2.0,
529 inputs): F461 020011 and MyHomeServer1 028206 still answer nack/silent to all 86 WHO 16
inputs (*OpenWebNet-HA#16*0*5## sound-who16-source.tsv line 16, *OpenWebNet-HA#16*101*5## line 28), unchanged from
53f9514.

Refs OpenWebNet-HA/OWNd#142.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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