Repository navigation
Closed
Labels
enhancementNew feature or requestNew feature or request
Description
Problem
On SCS-only gateways whose firmware drops the general thermoregulation sweep *#4*0## (F450, F454, F459, H4684, MH200, MH201, MH202), #794 polls each zone's ambient temperature at startup via *#4*<WHERE>*0##.
Keeping *#4*<WHERE>*0## as the baseline startup poll is fast (~120 ms / 1 SCS telegram per zone), light on single-worker gateways (MH200, MH201) and F422 buffers, and sufficient on warm restarts where RestoreEntity restores target_temperature / local_offset and *#4*#0## refreshes global seasonal mode.
However, two gaps remain on plants coordinated by a 99-zone central unit (WHERE = #0, e.g. BTicino 3550 / MyHOME_Screen):
- Day-0 blank-start discovery (empty entity registry, no
myhome.yaml): when subordinate zones (1..99) are discovered from bus frames (*#4*Z*0*TTTT##or*#4*Z#N*20*S##),*#4*Z*0##hydrates onlycurrent_temperature(dim 0), and*#4*#0##returns only global plant mode (*4*202*#0##) + operational flags (21,22,24,210) — leavingtarget_temperature(dim 12/dim 14) asNoneuntil a manual setpoint change occurs. - Out-of-band offline drift: setpoint or room-knob (
dim 13) adjustments made on the3550or room probe while Home Assistant was offline are not observed by*#4*Z*0##.
Evidence (Firmware Oracle + Physical Traces)
- QEMU Firmware Oracle (
trace-corpus.tsvfor*#4*1##):F450,F453,F453AV,F454,F459,H4684,MH200,MH200N, andMH202do not drop*#4*Z##or hang the TCP socket for 10 s. All 9 expand*#4*1##onto the SCS bus into the 4 dimension queries ($0499013000temp,$0499013012effective setpoint + mode,$049901300Enominal setpoint,$049901300Dlocal offset) and close the command session cleanly (ACKonMH202;~1.5-2.0 sNACKif unanswered on the other 8). OnlyF455(F455 multiple timeouts #674, not in the oracle) hung the TCP socket for 10 s on actuator-only channels (*#4*Z*19*0*0##). - Physical F454 + 3550 Central Unit Trace (
tests/fixtures/traces/issue_629/home-assistant_myhome_2026-10-05T11-16-10.935Z.cleaned.log, lines 489-700): all 12 subordinate zones (*#4*1##..*#4*15##) completed in~1.3 seach (Message *#4*Z## was successfully sent), returning all 5 frames (*#4*Z*0*...##,*#4*Z*12*...##,*4*202*Z##,*#4*Z*14*...##,*#4*Z*13*...##).
Proposed Design & Guardrails
- Require live
#0confirmation on the event session (never#0#1):MyHOMEClimate.__init__currently setsgateway.has_central_unit = Truefor both#0(99-zone3550) and#0#1(4-zone4695), and sets it from restored registry entries before the bus has spoken.- Track live confirmation (
gateway.central_unit_0_confirmed = True) only when an inbound frame fromWHERE == "#0"arrives onevt(e.g.#0's~0.17 sreply to*#4*#0##or its first broadcast).
- Handle Day-0 discovery ordering (
zonesdiscovered before#0):- Because
*#4*0##is omitted on these gateways andMyHOMEEntity._attr_should_poll = False, room probes discovered before#0broadcasts have already consumed their single_poll_on_addcycle while#0was still unknown. - When
central_unit_0_confirmedtransitions toTrueon a non-F455gateway, dispatch a one-shot informational*#4*Z##for registered subordinate zones (not zone._central,not zone._standalone) whosetarget_temperatureis stillNone(and use*#4*Z##for cold subordinate zones discovered thereafter).
- Because
- Keep the poll informational & interface-safe:
- Do not attach
ZonePollHealth(_poll_answered) so mixed plants with actuator-only channels (*#4*Z*19*0*0##) or un-enrolled zones do not raise falseunresponsive_zonerepairs onNACK. - Strictly honor
interface_zone_request_refusedonZ#4#IIaddresses (notablyMH202, whereown-firmware-oracle#60shows*#4*2#4#01##crashesbt_termo).
- Do not attach
- Evaluate targeted zone refresh in
myhome.sweep_bus:- When
myhome.sweep_bus(force=False) skips*#4*0##, consider refreshing known climate zones using the gateway's active per-zone poll strategy sosweep_busstill refreshes WHO 4 state.
- When
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request
Activity
docs(climate): correct the *michnovka#4*Z## and *michnovka#4*Z*0## ex…
docs(climate): correct the *michnovka#4*Z## and *michnovka#4*Z*0## ex…
docs(climate): correct the *michnovka#4*Z## and *michnovka#4*Z*0## ex…