mirror of
https://github.com/ruvnet/RuView.git
synced 2026-10-21 22:22:33 -05:00
fix(toolkit): integrate capture and device corrections for 0.9.2
Integrate reviewed source PRs #2201-#2223, #2225-#2231, #2235-#2240, #2242 and #2243 (firmware README hunks remain in #2247). Regenerate one package manifest after integration, validate native Windows test execution, bound MTK listener startup, support official C6 release bundles, and retain stronger release metadata gates.
This commit is contained in:
1 parent
a71634ae8a
commit
3620abff12
109 files changed
+2784
-337
No files matched your search
@@ -65,6 +65,15 @@ def test_parse_discovery_topic_event() -> None:
|
||||
assert out == ("event", "aabbccddeeff", "fall")
|
||||
|
||||
|
||||
def test_parse_discovery_topic_accepts_default_server_node_id() -> None:
|
||||
"""The sensing-server's node id defaults to its MQTT client id,
|
||||
`wifi-densepose-<8 hex>`, with `-node<N>` appended per node."""
|
||||
out = parse_discovery_topic(
|
||||
"homeassistant/binary_sensor/wifi_densepose_wifi-densepose-1a2b3c4d-node1/presence/config"
|
||||
)
|
||||
assert out == ("binary_sensor", "wifi-densepose-1a2b3c4d-node1", "presence")
|
||||
|
||||
|
||||
def test_parse_discovery_topic_returns_none_for_non_discovery() -> None:
|
||||
assert parse_discovery_topic("homeassistant/binary_sensor/foo/state") is None
|
||||
assert parse_discovery_topic("ruview/aabbccddeeff/raw/edge_vitals") is None
|
||||
|
||||
@@ -21,7 +21,11 @@ from typing import Any
|
||||
|
||||
import pytest
|
||||
|
||||
from wifi_densepose.client import RuViewMqttClient
|
||||
from wifi_densepose.client import (
|
||||
RuViewMqttClient,
|
||||
SemanticPrimitive,
|
||||
SemanticPrimitiveListener,
|
||||
)
|
||||
from wifi_densepose.client.mqtt import _topic_matches
|
||||
|
||||
|
||||
@@ -185,6 +189,30 @@ def test_multiple_handlers_for_overlapping_patterns_all_fire() -> None:
|
||||
assert len(b_received) == 1
|
||||
|
||||
|
||||
def test_documented_ha_state_pattern_subscribes_and_reaches_listener() -> None:
|
||||
"""The subscription shown in python/README.md and the
|
||||
SemanticPrimitiveListener docstring. paho rejects mid-level `+`
|
||||
(e.g. `wifi_densepose_+`) with ValueError on subscribe."""
|
||||
listener = SemanticPrimitiveListener()
|
||||
received: list[Any] = []
|
||||
listener.on(SemanticPrimitive.SomeoneSleeping, received.append)
|
||||
|
||||
c = RuViewMqttClient()
|
||||
c.on_message("homeassistant/+/+/+/state", listener.handle_mqtt_message)
|
||||
|
||||
# The real paho client validates the filter before it checks for a
|
||||
# connection, so this exercises the same subscribe() the broker path runs.
|
||||
c._on_connect(c._client, None, None, 0)
|
||||
|
||||
c._on_message(None, None, _fake_message(
|
||||
"homeassistant/binary_sensor/wifi_densepose_aabb/someone_sleeping/state",
|
||||
{"state": "ON", "confidence": 0.9},
|
||||
))
|
||||
assert [(e.kind, e.node_id, e.state) for e in received] == [
|
||||
(SemanticPrimitive.SomeoneSleeping, "aabb", "ON"),
|
||||
]
|
||||
|
||||
|
||||
# ─── on_connect path ─────────────────────────────────────────────────
|
||||
|
||||
|
||||
|
||||
@@ -22,12 +22,12 @@ def test_enum_covers_all_10_v1_primitives() -> None:
|
||||
"someone_sleeping",
|
||||
"possible_distress",
|
||||
"room_active",
|
||||
"elderly_inactivity",
|
||||
"elderly_inactivity_anomaly",
|
||||
"meeting_in_progress",
|
||||
"bathroom_occupied",
|
||||
"fall_risk_elevated",
|
||||
"bed_exit",
|
||||
"no_movement_safety",
|
||||
"no_movement",
|
||||
"multi_room_transition",
|
||||
}
|
||||
actual = {p.value for p in SemanticPrimitive}
|
||||
@@ -121,6 +121,34 @@ def test_listener_decodes_numeric_sensor_state() -> None:
|
||||
assert evt.state == "73"
|
||||
|
||||
|
||||
def test_listener_decodes_server_score_payload() -> None:
|
||||
"""The sensing-server publishes fall_risk_elevated as a ScorePayload
|
||||
(`{"score": ..., "ts": ...}`, mqtt/state.rs) with no `state` key."""
|
||||
listener = SemanticPrimitiveListener()
|
||||
evt = listener.handle_mqtt_message(
|
||||
"homeassistant/sensor/wifi_densepose_aabb/fall_risk_elevated/state",
|
||||
json.dumps({"score": 73.0, "ts": "2026-10-11T12:00:00Z"}),
|
||||
)
|
||||
assert evt is not None
|
||||
assert evt.state == "73.0"
|
||||
|
||||
|
||||
def test_listener_routes_server_topic_slugs() -> None:
|
||||
"""Slugs must match EntityKind::topic_slug() in the sensing-server's
|
||||
mqtt/discovery.rs, or the server's state messages are dropped."""
|
||||
listener = SemanticPrimitiveListener()
|
||||
received: list[SemanticPrimitive] = []
|
||||
listener.on_any(lambda e: received.append(e.kind))
|
||||
for slug in ("elderly_inactivity_anomaly", "no_movement"):
|
||||
listener.handle_mqtt_message(
|
||||
f"homeassistant/binary_sensor/wifi_densepose_aabb/{slug}/state", "ON"
|
||||
)
|
||||
assert received == [
|
||||
SemanticPrimitive.ElderlyInactivityAnomaly,
|
||||
SemanticPrimitive.NoMovementSafety,
|
||||
]
|
||||
|
||||
|
||||
def test_listener_decodes_bytes_payload() -> None:
|
||||
listener = SemanticPrimitiveListener()
|
||||
evt = listener.handle_mqtt_message(
|
||||
|
||||
Reference in new issue
Block a user