Automated release from CI pipeline
Changes:
fix(mqtt): per-node HA devices use each node's own presence/motion (#872) (#918)
The MQTT bridge fanned out one Home-Assistant device per node (#898) but
applied the room-level aggregate classification to every node — so in a
multi-node setup a node in an empty corner inherited another node's
"present", and motion_level: "absent" was mis-mapped to full motion
(the aggregate match fell through Some(_) => 1.0).
Each node in the sensing broadcast's nodes array already carries its own
classification (motion_level/presence/confidence, see
PerNodeFeatureInfo) and RSSI. Now each per-node snapshot reads that node's
own classification, deferring to the room aggregate only for fields a node
omits. Vitals (breathing/heart rate) and person count stay room-level.
Extracted the JSON→VitalsSnapshot mapping into a pure, testable function
(vitals_snapshots_from_sensing_json) and added 4 unit tests covering
per-node divergence, partial-field fallback, the no-nodes aggregate path,
and the absent→zero-motion fix.
Supersedes #899, which targeted the right bug but read non-existent fields
(node["motion_level"] / node["status"] instead of the nested
node["classification"] + stale).
Verified: builds with --features mqtt; new tests pass; full crate unit
suite 432 + 114 passed, 0 failed.
Docker Image:
ghcr.io/ruvnet/RuView:b12662a54d64be1a22b67820412f63b713d73856