Summary
Group is pull-only: group_all_on / group_any_on are computed on access from the member node registry, with no event-subscription plumbing. pyisy 3.x's Group.__init__ subscribed to every member's status_events and re-published its own status_events, so consumers got pushed updates. pyisyox dropped that and never replaced it.
Impact
The controller emits no wire event for a group address (groups have no wire status). Consumers that subscribe per-address for the group never get notified when a member changes, so a scene/group entity freezes at its load-time value. Found in a live isy994→udi_iox cutover: a [p] follower scene switch stayed on regardless of the real member state, so HA never re-read it (a curtain follower automation's stale-check could never pass on voice/dashboard changes).
Root cause
Regression from pyisy 3.x (pyisy/nodes/group.py subscribed to member status_events; pyisyox runtime/group.py is computed-on-access only, deliberately "no event-subscription plumbing"). The consumer can't reasonably own this — it doesn't know group membership at the event layer.
Fix
PR #172 — EventDispatcher takes the group registry, builds a member → groups reverse index, and re-emits a synthetic group-addressed ST event after each member property update. Notification only (not fed back through feed(), cannot recurse). Consumer-transparent.
Related
hacs-udi-iox#85 is a separate concern (event-only KPL buttons lose steady ST visibility); this issue is the actual cause of the frozen-scene-switch symptom.
Summary
Groupis pull-only:group_all_on/group_any_onare computed on access from the member node registry, with no event-subscription plumbing.pyisy3.x'sGroup.__init__subscribed to every member'sstatus_eventsand re-published its ownstatus_events, so consumers got pushed updates. pyisyox dropped that and never replaced it.Impact
The controller emits no wire event for a group address (groups have no wire status). Consumers that subscribe per-address for the group never get notified when a member changes, so a scene/group entity freezes at its load-time value. Found in a live isy994→udi_iox cutover: a
[p]follower scene switch stayedonregardless of the real member state, so HA never re-read it (a curtain follower automation's stale-check could never pass on voice/dashboard changes).Root cause
Regression from
pyisy3.x (pyisy/nodes/group.pysubscribed to memberstatus_events; pyisyoxruntime/group.pyis computed-on-access only, deliberately "no event-subscription plumbing"). The consumer can't reasonably own this — it doesn't know group membership at the event layer.Fix
PR #172 —
EventDispatchertakes the group registry, builds amember → groupsreverse index, and re-emits a synthetic group-addressedSTevent after each member property update. Notification only (not fed back throughfeed(), cannot recurse). Consumer-transparent.Related
hacs-udi-iox#85 is a separate concern (event-only KPL buttons lose steady ST visibility); this issue is the actual cause of the frozen-scene-switch symptom.