diff --git a/indigo-matter.indigoPlugin/Contents/Info.plist b/indigo-matter.indigoPlugin/Contents/Info.plist index f21c051..4f41ec8 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.4.1 + 2026.4.2 ServerApiVersion 3.6 diff --git a/tests/test_device_zoo.py b/tests/test_device_zoo.py index 6ef000f..1dedceb 100644 --- a/tests/test_device_zoo.py +++ b/tests/test_device_zoo.py @@ -13,7 +13,10 @@ 3. every spec's device_type_id exists in Devices.xml; 4. every initial state is XML-declared or an Indigo built-in; 5. every sensor-type spec carries explicit SupportsOnState / - SupportsSensorValue with exactly one True (the issue #56 class). + SupportsSensorValue with exactly one True (the issue #56 class); + 6. no device type's block redeclares a state key that a True + Supports* prop already derives natively (the PR #73 class — Indigo + rejects plugin-declared state keys that duplicate a native one). """ from __future__ import annotations @@ -54,6 +57,15 @@ "matterThermostat", "matterWindowCovering", "matterLock", "matterValve", } +# Supports* creation prop → the native Indigo state key it derives (PR #73: +# Indigo rejects a plugin-declared that duplicates one of these). +NATIVE_STATE_KEY_BY_PROP = { + "SupportsSensorValue": "sensorValue", + "SupportsOnState": "onOffState", + "SupportsPowerMeter": "curEnergyLevel", + "SupportsEnergyMeter": "accumEnergyTotal", +} + def _raw(node_id, eps): @@ -275,6 +287,20 @@ def test_zoo_sensor_specs_carry_explicit_display_props(name): ) +@pytest.mark.parametrize("name", ZOO) +def test_zoo_native_props_not_redeclared_in_devices_xml(name): + raw, _ = ZOO[name] + for specs in _specs_by_endpoint(raw).values(): + for spec in specs: + declared = XML_STATES_BY_ID.get(spec.device_type_id, set()) + for prop, key in NATIVE_STATE_KEY_BY_PROP.items(): + if spec.props.get(prop) is True: + assert key not in declared, ( + f"{name}: {spec.device_type_id} declares native state " + f"'{key}' in Devices.xml even though {prop} is True" + ) + + def test_every_registered_handler_type_exists_in_devices_xml(): # Registry-wide, zoo-independent: a handler pointing at a typo'd or # removed Devices.xml id would create devices that Indigo rejects.