From 30173fa13be07a7a7bd6f9f6b0d1c512beabef43 Mon Sep 17 00:00:00 2001 From: Simon Clark Date: Sat, 13 Jun 2026 08:19:05 +0100 Subject: [PATCH] =?UTF-8?q?test(zoo):=20add=20IKEA=20ALPSTUGA=20=E2=80=94?= =?UTF-8?q?=20characterise=20the=20display-OnOff=20phantom=20relay=20(#64)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ALPSTUGA (real Matter-over-Thread air-quality sensor: AirQuality + CO2 + PM2.5 + temp + humidity) also exposes an OnOff cluster that toggles its front display, not power. Verified against the real registry: that OnOff becomes a generic matterRelay alongside the five sensors. The zoo entry pins current behaviour (matterRelay in expected types) so #64 is documented and any future change is deliberate; the at-most-one-actuator invariant still holds. No behaviour change — characterisation only. Refs #64 Co-Authored-By: Claude Fable 5 --- indigo-matter.indigoPlugin/Contents/Info.plist | 2 +- tests/test_device_zoo.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/indigo-matter.indigoPlugin/Contents/Info.plist b/indigo-matter.indigoPlugin/Contents/Info.plist index a1d2883..1f13eeb 100644 --- a/indigo-matter.indigoPlugin/Contents/Info.plist +++ b/indigo-matter.indigoPlugin/Contents/Info.plist @@ -20,7 +20,7 @@ IwsApiVersion 1.0.0 PluginVersion - 2026.2.24 + 2026.2.25 ServerApiVersion 3.6 diff --git a/tests/test_device_zoo.py b/tests/test_device_zoo.py index 5f9f471..505a6c7 100644 --- a/tests/test_device_zoo.py +++ b/tests/test_device_zoo.py @@ -146,6 +146,22 @@ def _raw(node_id, eps): _raw(18, {1: {"29/0": [{"0": 773}], "1027/0": 1013, "1028/0": 25}}), {1: ["matterFlowSensor", "matterPressureSensor"]}, ), + # IKEA ALPSTUGA (real Matter-over-Thread air-quality sensor): AirQuality + + # CO2 + PM2.5 + temperature + humidity, plus an OnOff cluster that toggles + # the front DISPLAY (a "dead front" control), not power. CHARACTERISES the + # issue #64 wrinkle: the display OnOff produces a generic matterRelay + # alongside the five sensors. Kept in `expected` deliberately — when #64 is + # fixed (OnOff with the DeadFront feature should not become a relay) the + # matterRelay entry is removed here in the same change. The at-most-one- + # actuator invariant still holds (one relay), so this stays a phantom-device + # note, not a duplicate-actuator failure. + "ikea_alpstuga": ( + _raw(0x99, {1: {"29/0": [{"0": 44}], "91/0": 1, "1037/0": 600.0, + "1066/0": 8.0, "1026/0": 2150, "1029/0": 4800, + "6/0": False}}), + {1: ["matterAirQualitySensor", "matterCO2Sensor", "matterHumiditySensor", + "matterPM25Sensor", "matterRelay", "matterTemperatureSensor"]}, + ), # An endpoint made only of clusters we don't handle (RVC RunMode 0x0054): # the registry yields nothing — device_sync's matterUnknown fallback takes # over (covered in test_device_sync.py).