Repository navigation
fix(profiles): drop WHO 16 from the F461 and MyHomeServer1 profiles - #142
GreenGrassBlueOcean merged 3 commits into
Conversation
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
…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>
…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>
95dc8a5 to
c569145
Compare
…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>
GreenGrassBlueOcean
left a comment
There was a problem hiding this comment.
Firmware and trace evidence for removing WHO_SOUND (16) from F461Profile and MyHomeServer1Profile while keeping it on MH202Profile is solid: neither F461_020011 nor SMARTGW_028206 packages bt_difson or libcoso/libplug_multi_{stm,syn,tr}.so (whereas MH202_010024 ships libplug_multi_{stm,syn,tr}.so inside coso, explaining why MH202 relays F441M state frames in OpenWebNet-HA/MyHOME#669 despite NACKing commands in the oracle).
Beyond startup sweeps (which OpenWebNet-HA/MyHOME#794 already gated via sweep_omits), this fixes a real shared-bus delegation gap in MyHOME (custom_components/myhome/topology.py): gateway_supported_whos() had a manual whos -= {5, 16, 22} override for MyHomeServer1 but none for F461. Because F461 is Tier 1, on a shared F461 + MH202 (or F454) bus F461 wins Primary and previously kept 16 in pri_whos, preventing MH202 from taking WHO 16 (F441M matrix sound) delegation via sec_whos - pri_whos.
Two points before approving:
-
Do not overstate
MyHomeServer1WHO 22 plant behavior in_WITHOUT_WHO16/MyHomeServer1Profilecomments (OWNd/profiles.py):- Lines 189–190 and 632–633 state "Their sound system is WHO 22 (
sound-who22), sosupports_audiostaysTrueand WHO 22 stays listed" right next to citingMyHOME#459: "firmware discards 5, 16, 22"(andMyHOME'stopology.pyexplicitly strips22onMyHomeServer1). - Please keep the wording bounded to what is measured vs out of scope for this PR: in
own-firmware-oracle028206(sound-who22),bt_multitranslates WHO 22 commands onto the bus (ack/out), so this PR leaves WHO 22 untouched; whether liveMyHomeServer13.87.xroutes WHO 22 on production plants is separate from WHO 16 and shouldn't be stated as settled inMyHomeServer1Profile's docstring.
- Lines 189–190 and 632–633 state "Their sound system is WHO 22 (
-
Rebase onto
master(12fef0c8) & update PR notes:- Please rebase onto
12fef0c8(CHANGELOG.mdconflict). SinceOpenWebNet-HA/MyHOME#808is now merged onMyHOME,Golden corpus & smoke gates(verify_profiles_against_oracle) should turn green on rebase, leaving onlyMyHOME'shardware-compatibility.mddoc-sync check red by design until theOWNdpin bump. Worth updating the PR Summary / CI note accordingly (including the shared-busF461delegation impact, sinceMyHOME#794already covered the startup sweep).
- Please rebase onto
…acle measured (review follow-up) Review 5684987167 on OpenWebNet-HA#142: the comments next to the WHO 16 removal said the MyHomeServer1's sound system "is WHO 22" as if settled; only the emulated 028206 image's bt_multi translating WHO 22 onto the bus (sound-who22) is measured, live routing on production plants is not, and MyHOME's topology strips 22 on it. Comment and docstring now say so. No code change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Point 1 is in 6ab9deb + cb5e3ef: the Point 2: the description's Summary now carries the shared-bus delegation gap you described (F461 Primary keeping 16 in |
…acle measured (review follow-up) Review 5684987167 on OpenWebNet-HA#142: the comments next to the WHO 16 removal said the MyHomeServer1's sound system "is WHO 22" as if settled; only the emulated 028206 image's bt_multi translating WHO 22 onto the bus (sound-who22) is measured, live routing on production plants is not, and MyHOME's topology strips 22 on it. Comment and docstring now say so. No code change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
cb5e3ef to
2210296
Compare
|
Rebased onto master |
|
@GreenGrassBlueOcean the one red job here ( |
|
Correction to my previous comment: OpenWebNet-HA/MyHOME#830 is closed. MyHOME already anticipates this PR at the pin bump ( |
|
Why the The job installs this checkout in place of MyHOME's pinned MyHOME is built to handle exactly this at the pin bump: So the red is the designed signal of a pending pin-bump doc change in MyHOME, not a defect in this PR or in MyHOME; the other seven jobs are green. |
|
Thanks @gdluck — the
Could you rebase |
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>
…acle measured (review follow-up) Review 5684987167 on OpenWebNet-HA#142: the comments next to the WHO 16 removal said the MyHomeServer1's sound system "is WHO 22" as if settled; only the emulated 028206 image's bt_multi translating WHO 22 onto the bus (sound-who22) is measured, live routing on production plants is not, and MyHOME's topology strips 22 on it. Comment and docstring now say so. No code change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…docstring Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
@gdluck can you please rebase |
2210296 to
e00b725
Compare
|
Rebased onto master |
GreenGrassBlueOcean
left a comment
There was a problem hiding this comment.
Rebase onto master (f3efc1d) verified (2210296 → e00b725):
CHANGELOG.md: Clean 1-line conflict resolution under[Unreleased]/### Fixed, retaining the#138WHO 4 Dimension 14#-prefixed setpoint entry alongside theF461Profile/MyHomeServer1ProfileWHO 16 removal entry.- Code & tests (
OWNd/profiles.py,tests/test_profiles.py): Identical to2210296—_WITHOUT_WHO16 = (WHO_SOUND,)drops WHO 16 fromF461ProfileandMyHomeServer1Profilewhile keeping WHO 22 /supports_audiountouched (with WHO 22 docstrings/comments bounded to oraclebt_multimeasurements per review#5684987167), retains WHO 16 onMH202Profile(MyHOME#669F441M relay), and pins both sets intests/test_profiles.py. - CI: All 8/8 gates (Python 3.11–3.14 tests & coverage, static analysis, package build, golden corpus & smoke gates, and downstream
MyHOME test suite) are green one00b725.
Approving and merging now.
Requested by A
Summary
Beyond the startup sweep (already gated by MyHOME#794's
sweep_omits), this fixes a shared-bus delegation gap in MyHOME'stopology.py:gateway_supported_whos()strips{5, 16, 22}by hand for the MyHomeServer1 but had no override for the F461, so on a shared F461 + MH202 (or F454) bus the Tier 1 F461 won Primary and kept 16 in its WHOs, which stopped the MH202 from taking WHO 16 (F441M matrix sound) bysec_whos - pri_whos. With WHO 16 gone fromF461Profile, the delegation follows the profile.F461ProfileandMyHomeServer1Profilelist WHO 16 (Sound System) insupported_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#424describes 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 MyHomeServer1supported_whodrop it (next to the existingWHO_LOAD_CONTROLexclusion). WHO 22 stays listed andsupports_audiois unchanged, sofeatures_summaryand the README profile table do not change. No new flag:supported_whoalready carries the meaning, andsupports_who(16)is what MyHOME's sweep,sweep_busservice, standby ownership and topology delegation read.*#16*41*1*1##,*#16*41*1*6##;OpenWebNet-HA/MyHOME#669trace), andsupported_whoalso 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 missingbt_difsontranslator, the refused inputs and theOpenWebNet-HA/MyHOME#459statement. If the maintainers prefer to keep event ownership, a tri-state flag is the alternative.GenericGatewayProfile, whose default keeps WHO 16 for the F454 / MH200N class.python scripts/sync_documentation.py --updatereports 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.pyalready 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_whoand add a tri-statesupports_who16_status_request = Falseflag thatOpenWebNet-HA/MyHOME#794reads for the*#16*0*5##gate. That would keep this repository's CI green today, but it would leavesupported_whoadvertising a WHO that no capture or published source supports (the #100 rule:supported_wholists 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, nobt_difsonin 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 }Where are the traces
OpenWebNet-HA/MyHOME#799(open),f461_live_2026-10-23run 1 (run1_oracle_replay_readonly)*#16*0*5##NACK within 5 ms; all 18 WHO 16 requests of the run NACK in under 10 msOpenWebNet-HA/MyHOME#799(open),myhomeserver1_live_2026-10-24run 2 (run2_reads_thermo_sound_alarm_lights)*#16*0*5##and*#16*101*5##NACK in 3 ms (immediate refusal, no bus timeout)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))")*#16*0*5##tests/fixtures/traces/mh202_sound_intercom_ducking(OpenWebNet-HA/MyHOME#669)*#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/*.tsvandresults/MyHomeServer1/028206/oracle/full/*.tsv: 86 distinct WHO 16 inputs per gateway (77 of them insound-who16-source, the rest intrace-corpusand the other suites), allnack/silent, i.e. the translator never puts them on the bus. First rows ofsound-who16-source.tsvon both:020011028206*#16*0*5##nack/silentnack/silent*#16*100*5##nack/silentnack/silent*#16*101*#10*1##nack/silentnack/silent*#16*101*#6*0*107000##nack/silentnack/silentnack/silentnack/silentFirmware images (own-firmware-oracle
README.md, firmware table): F461020011shipsbt_luci,bt_device,bt_termo,bt_multi,bt_supervisione,coso(plusbt_daemon,openserver,scsserver); MyHomeServer1028206the same set; neither shipsbt_difson(the WHO 16 translator that F453, F453AV, F454, MH200 and MH200N do ship). The F461openserver[Stackopen]section inoracle/targets/F461/020011.yamlregistersbt_multifor 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 (44ack/out, 16nack/out; 1ack/silent, 2nack/silent; identical on F461 020011 and MyHomeServer1 028206), which is why WHO 22 andsupports_audiostay. On theOpenWebNet-HA/MyHOME#459quote: the maintainer wrote there that the MyHomeServer1 firmware "discards 5, 16, 22"; this PR uses it for 16 (and 5 is handled byOpenWebNet-HA/MyHOME#794/OpenWebNet-HA/MyHOME#803), while for 22 the publishedsound-who22rows 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.Revision 6ab9deb + cb5e3ef (review 5684987167). The
_WITHOUT_WHO16comment and the F461 / MyHomeServer1 profile docstrings no longer state the MyHomeServer1's WHO 22 plant behaviour as settled: what is measured is the emulated 028206 image'sbt_multitranslating WHO 22 onto the bus (sound-who22, ack/out), so WHO 22 is left untouched here; live routing on production plants is out of scope (MyHOME#459 reports it discarded, MyHOME's topology strips 22 on it). The clean rebase onto master (CHANGELOG.md) follows once the force push is authorised.Testing
tests/test_profiles.py: newtest_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) andtest_who16_stays_on_gateways_that_forward_it(F454,MH200N,MH200,H4684,F453,F453AV,H4890,MH202);test_profile_lookup_accepts_common_name_variantsupdated for the MyHomeServer1 alias.master5 of the module's 70 tests fail (the fournot supports_who(WHO_SOUND)cases and the alias test); on this branch all 70 pass.tests/test_firmware_oracle_conformance.py(26) still passes.1919 passed, 1 skipped(master:1907 passed, 1 skipped); 100 % statement coverage,mypyclean,ruffclean,scripts/sync_documentation.py --checkandscripts/verify_library_standards.pypass.profile.supports_who); the MyHOME test suite job keeps exactly one failure by design until the OWNd pin bump,tests/test_sync_documentation.py::test_check_all_documentation_real_tree("Gateway Discovery table out of sync in docs/getting-started/hardware-compatibility.md": the committed doc still showsWHO 1, 2, 4, 16, 18for the F461 and MyHomeServer1, regenerated at the pin bump). Verified locally on 2026-10-26: MyHOMEv2-phase1-architecturef4a5a907 against this head: 1 failed (that doc check), 4990 passed, 1 skipped.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 loggedSkipping 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), merged 2026-10-26):scripts/update_gateway_profiles.pyandtests/test_gateway_profiles.pyderive the F461 / MyHomeServer1 discovery rows fromprofile.supports_whoinstead of a static list, so it is green against the pinned OWNd 2.0.0b11 and against this branch;hardware-compatibility.mdregenerates toWHO 1, 2, 4, 18at the pin bump that includes this PR (sequencing: #808 → this PR → OWNd release → pin bump).OpenWebNet-HA/MyHOME#794gates the startup*#16*0*5##request onprofile.supports_who(16)with a MyHOME fallback table until this lands.🤖 Generated with Claude Code