From d7ee7a3b1757360d51b267268a2e1c0dce1ad939 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 12:20:04 -0400 Subject: [PATCH 01/13] Import device diagnostics with a firmware version filename suffix --- tools/import_diagnostics.py | 57 +++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/tools/import_diagnostics.py b/tools/import_diagnostics.py index f701602aa..39e5fc1d5 100644 --- a/tools/import_diagnostics.py +++ b/tools/import_diagnostics.py @@ -340,31 +340,30 @@ async def main(paths: list[str]): _LOGGER.debug("Skipping, not valid JSON") continue - if "home_assistant" not in data: - _LOGGER.debug("Skipping, missing 'home_assistant' key") - continue - - zigpy_device = zigpy_device_from_diagnostics( - zha_gateway.application_controller, data - ) + try: + zigpy_device = zigpy_device_from_device_data( + app=zha_gateway.application_controller, + device_data=data, + ) + except ValueError: + if "home_assistant" not in data: + _LOGGER.debug("Skipping, missing 'home_assistant' key") + continue - if zigpy_device is None: - _LOGGER.debug("Skipping, diagnostics are not valid") - continue + ha_data = data["home_assistant"].get("data", {}) + if ( + ha_data.get("last_seen") == "2026-03-04T18:21:39.038488+00:00" + ) and (ha_data.get("model") == "J1 (5502)"): + _LOGGER.debug("Skipping known-bad DIY device") + continue - output_path = ( - REPO_ROOT - / "tests" - / "data" - / "devices" - / ( - slugify(f"{zigpy_device.manufacturer}-{zigpy_device.model}") - + ".json" + zigpy_device = zigpy_device_from_diagnostics( + zha_gateway.application_controller, data ) - ) - if output_path.is_file(): - continue + if zigpy_device is None: + _LOGGER.debug("Skipping, diagnostics are not valid") + continue with patch("zigpy.zcl.Cluster._update_attribute"): zha_device = await join_zigpy_device(zha_gateway, zigpy_device) @@ -397,6 +396,22 @@ async def main(paths: list[str]): ) continue + fw_version = rejoined_zha_device.firmware_version + suffix = f"-{fw_version}" if fw_version is not None else "" + output_path = ( + REPO_ROOT + / "tests" + / "data" + / "devices" + / ( + slugify(f"{zigpy_device.manufacturer}-{zigpy_device.model}{suffix}") + + ".json" + ) + ) + + if output_path.is_file(): + continue + _LOGGER.info("Importing %s as %s", path, output_path.name) new_json = json.dumps(initial_json, indent=2, cls=ZhaJsonEncoder) output_path.write_text(new_json) From c9c2c73d4cfb9d866e2c5c0dcfdfb0b8b6263e32 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 12:35:35 -0400 Subject: [PATCH 02/13] Make import script more robust Make importer more robust --- tests/common.py | 25 +++++++++++++++----- tools/import_diagnostics.py | 46 ++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/tests/common.py b/tests/common.py index 3f45f52cd..b22112c69 100644 --- a/tests/common.py +++ b/tests/common.py @@ -358,7 +358,7 @@ async def group_entity_availability_test( assert entity.state["available"] is True -def zigpy_device_from_device_data( +def zigpy_device_from_device_data( # noqa: C901 app: ControllerApplication, device_data: dict, patch_cluster: bool = True, @@ -463,11 +463,24 @@ def zigpy_device_from_device_data( attr_name = attr.get("name") # Look up by name to avoid ambiguity with manufacturer-specific attrs - if attr_name is not None: - attr_def = real_cluster.find_attribute(attr_name) - assert attr_def.id == attrid - else: - attr_def = real_cluster.find_attribute(attrid) + try: + if attr_name is not None: + attr_def = real_cluster.find_attribute(attr_name) + else: + attr_def = real_cluster.find_attribute(attrid) + except KeyError: + attr_def = None + + # The attribute may not be defined on the cluster, or a quirk may + # have moved its name to a different id. Cache it as a legacy value + # so the device still loads. + if attr_def is None or attr_def.id != attrid: + if attr.get("value", None) is not None: + real_cluster._attr_cache.set_legacy_value( + attrid, attr["value"] + ) + real_cluster.PLUGGED_ATTR_READS[attrid] = attr["value"] + continue # Quirks can mark attributes as unsupported during cluster init so # the attribute both has a cached value and is unsupported. We need diff --git a/tools/import_diagnostics.py b/tools/import_diagnostics.py index 39e5fc1d5..9bb314ef0 100644 --- a/tools/import_diagnostics.py +++ b/tools/import_diagnostics.py @@ -219,23 +219,21 @@ def zigpy_device_from_legacy_diagnostics( # noqa: C901 or attr_id in cluster["unsupported_attributes"] ): continue - real_cluster._attr_cache[int(attr_id, 16)] = parse_legacy_value( - attr["value"] - ) - real_cluster.PLUGGED_ATTR_READS[int(attr_id, 16)] = parse_legacy_value( - attr["value"] - ) + attr_id_int = int(attr_id, 16) + parsed = parse_legacy_value(attr["value"]) + if attr_id_int in real_cluster.attributes: + real_cluster._attr_cache[attr_id_int] = parsed + else: + real_cluster._attr_cache.set_legacy_value(attr_id_int, parsed) + real_cluster.PLUGGED_ATTR_READS[attr_id_int] = parsed for unsupported_attr in cluster["unsupported_attributes"]: if isinstance(unsupported_attr, str) and unsupported_attr.startswith( "0x" ): attrid = int(unsupported_attr, 16) - real_cluster.add_unsupported_attribute(attrid) if attrid in real_cluster.attributes: - real_cluster.add_unsupported_attribute( - real_cluster.attributes[attrid].name - ) - else: + real_cluster.add_unsupported_attribute(attrid) + elif unsupported_attr in real_cluster.attributes_by_name: real_cluster.add_unsupported_attribute(unsupported_attr) for cluster_id, cluster in ep["out_clusters"].items(): @@ -260,23 +258,21 @@ def zigpy_device_from_legacy_diagnostics( # noqa: C901 or attr_id in cluster["unsupported_attributes"] ): continue - real_cluster._attr_cache[int(attr_id, 16)] = parse_legacy_value( - attr["value"] - ) - real_cluster.PLUGGED_ATTR_READS[int(attr_id, 16)] = parse_legacy_value( - attr["value"] - ) + attr_id_int = int(attr_id, 16) + parsed = parse_legacy_value(attr["value"]) + if attr_id_int in real_cluster.attributes: + real_cluster._attr_cache[attr_id_int] = parsed + else: + real_cluster._attr_cache.set_legacy_value(attr_id_int, parsed) + real_cluster.PLUGGED_ATTR_READS[attr_id_int] = parsed for unsupported_attr in cluster["unsupported_attributes"]: if isinstance(unsupported_attr, str) and unsupported_attr.startswith( "0x" ): attrid = int(unsupported_attr, 16) - real_cluster.add_unsupported_attribute(attrid) if attrid in real_cluster.attributes: - real_cluster.add_unsupported_attribute( - real_cluster.attributes[attrid].name - ) - else: + real_cluster.add_unsupported_attribute(attrid) + elif unsupported_attr in real_cluster.attributes_by_name: real_cluster.add_unsupported_attribute(unsupported_attr) if device.model is None and device.manufacturer is None: @@ -299,6 +295,10 @@ def zigpy_device_from_diagnostics( if "version" not in zha_data: return zigpy_device_from_legacy_diagnostics(app, data, patch_cluster) + # Some diagnostics are hand-redacted (e.g. nwk "0xREDACTED"), fake a NWK instead + if "REDACTED" in zha_data["nwk"]: + zha_data["nwk"] = "0x1234" + # Home Assistant diagnostics contain redacted IEEE info, fake an IEEE instead if "REDACTED" in zha_data["ieee"]: zha_data["ieee"] = str( @@ -345,7 +345,7 @@ async def main(paths: list[str]): app=zha_gateway.application_controller, device_data=data, ) - except ValueError: + except Exception: if "home_assistant" not in data: _LOGGER.debug("Skipping, missing 'home_assistant' key") continue From 6b0785d70fc4d0d0eec002d6e456f2fe8c531e6a Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:15:04 -0400 Subject: [PATCH 03/13] Fix stale device state when two diagnostics files have the same EUI64 --- tools/import_diagnostics.py | 8 +++++--- tools/regenerate_diagnostics.py | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/import_diagnostics.py b/tools/import_diagnostics.py index 9bb314ef0..4f3a0a9d1 100644 --- a/tools/import_diagnostics.py +++ b/tools/import_diagnostics.py @@ -372,7 +372,6 @@ async def main(paths: list[str]): # First, try to join the device initial_json = zha_device.get_diagnostics_json() - await zha_gateway.async_remove_device(zha_device) await zha_device.on_remove() del zha_gateway.devices[zha_device.ieee] @@ -389,14 +388,17 @@ async def main(paths: list[str]): await zha_gateway.async_block_till_done(wait_background_tasks=True) rejoined_json = rejoined_zha_device.get_diagnostics_json() + fw_version = rejoined_zha_device.firmware_version + + await rejoined_zha_device.on_remove() + del zha_gateway.devices[rejoined_zha_device.ieee] + if initial_json != rejoined_json: _LOGGER.warning( "Rejoined device %s does not match original diagnostics JSON, quirk has modified the device signature", path, ) continue - - fw_version = rejoined_zha_device.firmware_version suffix = f"-{fw_version}" if fw_version is not None else "" output_path = ( REPO_ROOT diff --git a/tools/regenerate_diagnostics.py b/tools/regenerate_diagnostics.py index 6aa07b7ce..86857926b 100644 --- a/tools/regenerate_diagnostics.py +++ b/tools/regenerate_diagnostics.py @@ -63,6 +63,7 @@ async def main(files: list[str] | None = None) -> None: device_json.write_text(new_json) await zha_device.on_remove() + del zha_gateway.devices[zha_device.ieee] if __name__ == "__main__": From ff619561c63685c1941d013b1300772936409e61 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:17:57 -0400 Subject: [PATCH 04/13] Re-import current diagnostics --- ...ensor-d0001.json => adeo-zb-watersensor-d0001-0x21120002.json} | 0 ...-rgbw3001.json => adurosmart-eria-ad-rgbw3001-0x00000001.json} | 0 ...irrtc-aeu001.json => aqara-lumi-airrtc-aeu001-0x00000a1a.json} | 0 ...irrtc-aeu005.json => aqara-lumi-airrtc-aeu005-0x00001227.json} | 0 ...-light-acn132.json => aqara-lumi-light-acn132-0x00001a1a.json} | 0 ...-light-agl003.json => aqara-lumi-light-agl003-0x0000001b.json} | 0 ...-light-agl005.json => aqara-lumi-light-agl005-0x0000001b.json} | 0 ...mi-motion-ac01.json => aqara-lumi-motion-ac01-0x00000035.json} | 0 ...py-agl1.json => aqara-lumi-sensor-occupy-agl1-0x0000001a.json} | 0 ...py-agl8.json => aqara-lumi-sensor-occupy-agl8-0x00003422.json} | 0 ...witch-acn047.json => aqara-lumi-switch-acn047-0x0000001c.json} | 0 ...witch-aeu003.json => aqara-lumi-switch-aeu003-0x00000e14.json} | 0 ...witch-agl007.json => aqara-lumi-switch-agl007-0x00001116.json} | 0 ...witch-agl010.json => aqara-lumi-switch-agl010-0x00001315.json} | 0 ...-v-zb.json => aug-winkhaus-gmbh-co-kg-fm-v-zb-0x00000011.json} | 0 ...-gantenbrink-leuchten-kg-smart-dimmable-light-0x00990be9.json} | 0 ...h-rbsh-mms-zb-eu.json => bosch-rbsh-mms-zb-eu-0x11136760.json} | 0 ...0-bat-zb-eu.json => bosch-rbsh-rth0-bat-zb-eu-0x02086a30.json} | 0 ...rbsh-rth0-zb-eu.json => bosch-rbsh-rth0-zb-eu-0x03036a30.json} | 0 ...rbsh-trv0-zb-eu.json => bosch-rbsh-trv0-zb-eu-0x32051514.json} | 0 ...-us4btn-zb-eu.json => bosch-rbsh-us4btn-zb-eu-0x100d6a30.json} | 0 ...eo-c-zb-lc20-dim.json => candeo-c-zb-lc20-dim-0x29013001.json} | 0 ...eo-c-zb-lc20-rgb.json => candeo-c-zb-lc20-rgb-0x31013001.json} | 0 .../{centralite-3300.json => centralite-3300-0x1f075310.json} | 0 .../{centralite-3310-g.json => centralite-3310-g-0x11015310.json} | 0 ...ntralite-3315-seu.json => centralite-3315-seu-0x1f085310.json} | 0 .../{centralite-3405-l.json => centralite-3405-l-0x10025310.json} | 0 ...ms-3156105.json => centralite-systems-3156105-0x1418468c.json} | 0 .../{danfoss-etrv0103.json => danfoss-etrv0103-0x00000014.json} | 0 ...05-zigbee.json => ecodim-bv-eco-dim-05-zigbee-0x00000001.json} | 0 .../{ecolink-4655bc0-r.json => ecolink-4655bc0-r-0x20160921.json} | 0 ...ericsity-gl-c-008p.json => ericsity-gl-c-008p-0x25013001.json} | 0 ...ericsity-gl-c-009p.json => ericsity-gl-c-009p-0x25013001.json} | 0 ...youtputdevice.json => espressif-zigbeebinaryanalogdevice.json} | 0 ...rotronic-spzb0001.json => eurotronic-spzb0001-0x4501001f.json} | 0 ...son => ewelink-ck-bl702-al-01-7009-z102lg03-1-0x00001200.json} | 0 ...-7000.json => ewelink-ck-tlsr8656-ss5-01-7000-0x00001102.json} | 0 .../{ewelink-snzb-01p.json => ewelink-snzb-01p-0x00002000.json} | 0 .../{ewelink-snzb-02p.json => ewelink-snzb-02p-0x00002100.json} | 0 .../{ewelink-snzb-03p.json => ewelink-snzb-03p-0x00002201.json} | 0 .../{ewelink-snzb-04p.json => ewelink-snzb-04p-0x00002200.json} | 0 ...viz-cs-t55-r100-g.json => ezviz-cs-t55-r100-g-0x00000002.json} | 0 ...nt-a-s-aqszb-110.json => frient-a-s-aqszb-110-0x00040001.json} | 0 ...nt-a-s-emizb-141.json => frient-a-s-emizb-141-0x00030102.json} | 0 ...nt-a-s-emizb-151.json => frient-a-s-emizb-151-0x00030107.json} | 0 ...nt-a-s-flszb-110.json => frient-a-s-flszb-110-0x00040001.json} | 0 ...nt-a-s-hmszb-120.json => frient-a-s-hmszb-120-0x00040001.json} | 0 ...nt-a-s-iomzb-110.json => frient-a-s-iomzb-110-0x00020001.json} | 0 ...nt-a-s-kepzb-110.json => frient-a-s-kepzb-110-0x00020005.json} | 0 ...nt-a-s-moszb-140.json => frient-a-s-moszb-140-0x00040006.json} | 0 ...nt-a-s-moszb-153.json => frient-a-s-moszb-153-0x00020006.json} | 0 ...nt-a-s-sbtzb-110.json => frient-a-s-sbtzb-110-0x00020002.json} | 0 ...nt-a-s-scazb-141.json => frient-a-s-scazb-141-0x00010803.json} | 0 ...nt-a-s-sirzb-111.json => frient-a-s-sirzb-111-0x00020004.json} | 0 ...nt-a-s-smszb-120.json => frient-a-s-smszb-120-0x00040008.json} | 0 ...nt-a-s-splzb-141.json => frient-a-s-splzb-141-0x00020009.json} | 0 ...nt-a-s-wiszb-131.json => frient-a-s-wiszb-131-0x00020006.json} | 0 ...gledopto-gl-b-008p.json => gledopto-gl-b-008p-0x00000006.json} | 0 ...gledopto-gl-c-009p.json => gledopto-gl-c-009p-0x29013001.json} | 0 ...edopto-gl-sd-301p.json => gledopto-gl-sd-301p-0x26013001.json} | 0 ...shake-finland-agge-zigbee-smart-rotary-dimmer-0x00000002.json} | 0 tests/data/devices/{hive-mbr1.json => hive-mbr1-0x01047320.json} | 0 ...> ikea-of-sweden-badring-water-leakage-sensor-0x01000007.json} | 0 ... ikea-of-sweden-fyrtur-block-out-roller-blind-0x23088631.json} | 0 ....json => ikea-of-sweden-inspelning-smart-plug-0x02040045.json} | 0 ...trip.json => ikea-of-sweden-ormanas-led-strip-0x01010010.json} | 0 ...=> ikea-of-sweden-parasoll-door-window-sensor-0x01000019.json} | 0 ... => ikea-of-sweden-praktlysing-cellular-blind-0x23088631.json} | 0 ...t-dimmer.json => ikea-of-sweden-rodret-dimmer-0x01000047.json} | 0 ...json => ikea-of-sweden-rodret-wireless-dimmer-0x01000057.json} | 0 ...json => ikea-of-sweden-somrig-shortcut-button-0x01000021.json} | 0 ...json => ikea-of-sweden-starkvind-air-purifier-0x00011001.json} | 0 ...> ikea-of-sweden-starkvind-air-purifier-table-0x00011001.json} | 0 ...=> ikea-of-sweden-symfonisk-sound-remote-gen2-0x00010012.json} | 0 ...ikea-of-sweden-tradfri-bulb-e12-w-op-ch-400lm-0x23094631.json} | 0 ...ikea-of-sweden-tradfri-bulb-e12-ws-opal-400lm-0x23087631.json} | 0 ...kea-of-sweden-tradfri-bulb-e14-ws-globe-470lm-0x01010020.json} | 0 ...> ikea-of-sweden-tradfri-bulb-e26-opal-1000lm-0x23094631.json} | 0 ...ikea-of-sweden-tradfri-bulb-e26-w-opal-1000lm-0x23094631.json} | 0 ...ikea-of-sweden-tradfri-bulb-e26-ws-opal-980lm-0x23095631.json} | 0 ...ea-of-sweden-tradfri-bulb-e27-ws-globe-1055lm-0x02040005.json} | 0 ...ea-of-sweden-tradfri-bulb-e27-ww-g95-cl-470lm-0x00011006.json} | 0 ... => ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json} | 0 ... => ikea-of-sweden-tradfri-bulb-gu10-ww-400lm-0x23093631.json} | 0 ...json => ikea-of-sweden-tradfri-control-outlet-0x23089631.json} | 0 ...n => ikea-of-sweden-tradfri-open-close-remote-0x23079631.json} | 0 ...kea-of-sweden-vallhorn-wireless-motion-sensor-0x01000064.json} | 0 .../devices/{innr-ae-280-c.json => innr-ae-280-c-0x20026a30.json} | 0 .../devices/{innr-rb-285-c.json => innr-rb-285-c-0x10051567.json} | 0 .../devices/{innr-rc-250.json => innr-rc-250-0x21086500.json} | 0 .../devices/{innr-rs-232-c.json => innr-rs-232-c-0x22151511.json} | 0 .../devices/{innr-sp-120.json => innr-sp-120-0x11040002.json} | 0 .../devices/{innr-sp-234.json => innr-sp-234-0x31016610.json} | 0 .../devices/{innr-sp-240.json => innr-sp-240-0x191e3685.json} | 0 .../devices/{innr-sp-242.json => innr-sp-242-0x17173685.json} | 0 .../{inovelli-vzm30-sn.json => inovelli-vzm30-sn-0x01100100.json} | 0 .../{inovelli-vzm31-sn.json => inovelli-vzm31-sn-0x01020212.json} | 0 .../{inovelli-vzm35-sn.json => inovelli-vzm35-sn-0x02020107.json} | 0 ...o-products-45856.json => jasco-products-45856-0x00000006.json} | 0 ...o-products-45857.json => jasco-products-45857-0x00000006.json} | 0 ...e-remote.json => ke-tradfri-open-close-remote-0x22010631.json} | 0 ...-mp-1-1.json => keen-home-inc-sv01-410-mp-1-1-0x10235121.json} | 0 ....json => king-of-fans-inc-hbuniversalcfremote-0x0000000f.json} | 0 ...fan.json => king-of-fans-inc-hdc52eastwindfan-0x0000000f.json} | 0 tests/data/devices/konke-3afe28010402000d.json | 0 ...t-gen1.json => kwikset-smartcode-convert-gen1-0x30a07a06.json} | 0 ...noffplug-d0005.json => lds-zb-onoffplug-d0005-0x21186230.json} | 0 ...tswitch-d0001.json => lds-zbt-cctswitch-d0001-0x21000006.json} | 0 ...ledvance-a60s-rgbw.json => ledvance-a60s-rgbw-0x02146550.json} | 0 ...ledvance-flex-rgbw.json => ledvance-flex-rgbw-0x00102428.json} | 0 ...rgb.json => ledvance-outdoor-accent-light-rgb-0x00102428.json} | 0 .../devices/{ledvance-plug.json => ledvance-plug-0x00102101.json} | 0 ...ral.json => legrand-dimmer-switch-w-o-neutral-0x004d45ff.json} | 0 ...ral.json => legrand-light-switch-with-neutral-0x001c4203.json} | 0 ...d-mobile-outlet.json => legrand-mobile-outlet-0x006545ff.json} | 0 .../devices/{level-home-b2.json => level-home-b2-0x0300001a.json} | 0 .../{level-home-bolt.json => level-home-bolt-0x03020006.json} | 0 .../{lixee-zlinky-tic.json => lixee-zlinky-tic-0x00000011.json} | 0 tests/data/devices/lk-zb-doorsensor-d0003.json | 0 ...imswitch-d0001.json => lk-zbt-dimswitch-d0001-0x22166500.json} | 0 ...noffplug-d0001.json => lk-zbt-onoffplug-d0001-0x22036610.json} | 0 ...airrtc-agl001.json => lumi-lumi-airrtc-agl001-0x0000001e.json} | 0 ...rtain-acn002.json => lumi-lumi-curtain-acn002-0x00000e1f.json} | 0 ...rtain-agl001.json => lumi-lumi-curtain-agl001-0x00000018.json} | 0 ...i-flood-acn001.json => lumi-lumi-flood-acn001-0x00000004.json} | 0 ...umi-flood-agl02.json => lumi-lumi-flood-agl02-0x00000020.json} | 0 ...i-light-aqcn02.json => lumi-lumi-light-aqcn02-0x00000017.json} | 0 ...magnet-acn001.json => lumi-lumi-magnet-acn001-0x00000004.json} | 0 ...i-magnet-agl02.json => lumi-lumi-magnet-agl02-0x0000001e.json} | 0 tests/data/devices/lumi-lumi-motion-ac02.json | 0 ...i-motion-agl04.json => lumi-lumi-motion-agl04-0x00000019.json} | 0 ...umi-plug-maus01.json => lumi-lumi-plug-maus01-0x0000000b.json} | 0 ...relay-c2acn01.json => lumi-lumi-relay-c2acn01-0x00000024.json} | 0 tests/data/devices/lumi-lumi-remote-b486opcn01.json | 0 ...ke-acn03.json => lumi-lumi-sensor-smoke-acn03-0x00000011.json} | 0 ...ch-b1laus01.json => lumi-lumi-switch-b1laus01-0x00000020.json} | 0 ...ch-b1naus01.json => lumi-lumi-switch-b1naus01-0x0000001f.json} | 0 ...switch-l1aeu1.json => lumi-lumi-switch-l1aeu1-0x00000e0b.json} | 0 ...switch-l2aeu1.json => lumi-lumi-switch-l2aeu1-0x00000e0b.json} | 0 ...switch-n0agl1.json => lumi-lumi-switch-n0agl1-0x0000001e.json} | 0 ...ation-agl01.json => lumi-lumi-vibration-agl01-0x0000001c.json} | 0 tests/data/devices/lumi-lumi-weather.json | 0 .../{lutron-z3-1brl.json => lutron-z3-1brl-0x00000c08.json} | 0 ...-extendedcolor.json => mli-tint-extendedcolor-0x10012001.json} | 0 ...mote-all-rgbw.json => mli-zbt-remote-all-rgbw-0x11010022.json} | 0 .../{namron-as-4512785.json => namron-as-4512785-0x0000000e.json} | 0 ...utton.json => niko-nv-battery-switch-4-button-0x21046760.json} | 0 ....json => niko-nv-connectable-motor-control-3a-0x21160006.json} | 0 .../{nodon-sin-4-rs-20.json => nodon-sin-4-rs-20-0x00010300.json} | 0 ...-4x-lightify.json => osram-switch-4x-lightify-0x01000000.json} | 0 .../{philips-7602031u7.json => philips-7602031u7-0x01001d00.json} | 0 ...ips-915005988601.json => philips-915005988601-0x01002000.json} | 0 .../{philips-lct014.json => philips-lct014-0x01001a02.json} | 0 .../{philips-llc020.json => philips-llc020-0x42006734.json} | 0 .../{philips-lst002.json => philips-lst002-0x01001700.json} | 0 .../{philips-rom001.json => philips-rom001-0x02002f08.json} | 0 .../{philips-rwl021.json => philips-rwl021-0x43007305.json} | 0 .../{philips-sml001.json => philips-sml001-0x42006bb7.json} | 0 ...zms-slp3.json => plaid-systems-ps-sprzms-slp3-0x00000001.json} | 0 .../devices/{samjin-button.json => samjin-button-0x00000011.json} | 0 .../devices/{samjin-multi.json => samjin-multi-0x0000000b.json} | 0 ...-eko07259.json => schneider-electric-eko07259-0x01001d00.json} | 0 ...-1.json => schneider-electric-evsckt-outlet-1-0x020a00ff.json} | 0 ....json => schneider-electric-nhmotion-unidim-1-0x020b0fff.json} | 0 ...r-1.json => schneider-electric-puck-shutter-1-0x020c02ff.json} | 0 ...ic-s520619.json => schneider-electric-s520619-0x01003500.json} | 0 ...-1.json => schneider-electric-socket-outlet-1-0x020612ff.json} | 0 ...-2.json => schneider-electric-socket-outlet-2-0x020612ff.json} | 0 .../{sengled-e11-g13.json => sengled-e11-g13-0x00000009.json} | 0 .../{sengled-e12-n14.json => sengled-e12-n14-0x00000004.json} | 0 .../{sengled-e12-n1e.json => sengled-e12-n1e-0x0000001e.json} | 0 .../{sengled-e1c-nb7.json => sengled-e1c-nb7-0x0000001a.json} | 0 .../{sengled-e1f-n9g.json => sengled-e1f-n9g-0x00000020.json} | 0 .../{sengled-e1g-g8e.json => sengled-e1g-g8e-0x0000000e.json} | 0 .../{sengled-e21-n1ea.json => sengled-e21-n1ea-0x00000026.json} | 0 ...led-z01-a19nae26.json => sengled-z01-a19nae26-0x00000020.json} | 0 ...lca001.json => signify-netherlands-b-v-lca001-0x01002802.json} | 0 ...lca005.json => signify-netherlands-b-v-lca005-0x01002402.json} | 0 ...lca007.json => signify-netherlands-b-v-lca007-0x01001f0a.json} | 0 ...lcb001.json => signify-netherlands-b-v-lcb001-0x01002800.json} | 0 ...lcb002.json => signify-netherlands-b-v-lcb002-0x01001f0a.json} | 0 ...lce001.json => signify-netherlands-b-v-lce001-0x01002404.json} | 0 ...lcg006.json => signify-netherlands-b-v-lcg006-0x01002502.json} | 0 ...lcx004.json => signify-netherlands-b-v-lcx004-0x01001802.json} | 0 ...lta010.json => signify-netherlands-b-v-lta010-0x01002402.json} | 0 ...ltb003.json => signify-netherlands-b-v-ltb003-0x01001f0a.json} | 0 ...lwa003.json => signify-netherlands-b-v-lwa003-0x01001f0a.json} | 0 ...rdm001.json => signify-netherlands-b-v-rdm001-0x0000041a.json} | 0 ...rdm002.json => signify-netherlands-b-v-rdm002-0x02003b19.json} | 0 ...rdm005.json => signify-netherlands-b-v-rdm005-0x02005301.json} | 0 ...rwl022.json => signify-netherlands-b-v-rwl022-0x02002d02.json} | 0 ...sml003.json => signify-netherlands-b-v-sml003-0x02003506.json} | 0 ...sml004.json => signify-netherlands-b-v-sml004-0x02003506.json} | 0 ...artthings-multiv4.json => smartthings-multiv4-0x0000001b.json} | 0 .../{smartthings-tagv4.json => smartthings-tagv4-0x00000019.json} | 0 ...artwings-wm25-l-z.json => smartwings-wm25-l-z-0x00000002.json} | 0 ...y-situo-4-zigbee.json => somfy-situo-4-zigbee-0x00011a00.json} | 0 ...ler.json => somfy-sonesse-28-wf-li-ion-roller-0x4100e158.json} | 0 ...ia-5-hp-zigbee.json => somfy-ysia-5-hp-zigbee-0x00e00041.json} | 0 .../{sonoff-mini-zbdim.json => sonoff-mini-zbdim-0x00001005.json} | 0 .../{sonoff-mini-zbrbs.json => sonoff-mini-zbrbs-0x00001005.json} | 0 .../{sonoff-s26r2zb.json => sonoff-s26r2zb-0x00002000.json} | 0 .../{sonoff-s60zbtpg.json => sonoff-s60zbtpg-0x00001002.json} | 0 .../{sonoff-snzb-01m.json => sonoff-snzb-01m-0x00001005.json} | 0 .../{sonoff-snzb-02d.json => sonoff-snzb-02d-0x00002300.json} | 0 .../{sonoff-snzb-04pr2.json => sonoff-snzb-04pr2-0x00001001.json} | 0 .../{sonoff-snzb-05p.json => sonoff-snzb-05p-0x00001002.json} | 0 .../{sonoff-snzb-06p.json => sonoff-snzb-06p-0x00001006.json} | 0 .../data/devices/{sonoff-swv.json => sonoff-swv-0x00001002.json} | 0 .../devices/{sonoff-trvzb.json => sonoff-trvzb-0x00001201.json} | 0 .../{sonoff-zbmicro.json => sonoff-zbmicro-0x00001005.json} | 0 .../{sonoff-zbminil2.json => sonoff-zbminil2-0x0000100e.json} | 0 .../{sonoff-zbminir2.json => sonoff-zbminir2-0x00001004.json} | 0 .../{sunricher-hk-dim.json => sunricher-hk-dim-0x00000036.json} | 0 ...her-hk-ln-dim-a.json => sunricher-hk-ln-dim-a-0x00000039.json} | 0 ...icher-on-off-2ch.json => sunricher-on-off-2ch-0x00000004.json} | 0 ...n => the-home-depot-ecosmart-zbt-a19-cct-bulb-0x21036500.json} | 0 ...ap0149bz.json => third-reality-inc-3rap0149bz-0x0000000e.json} | 0 ...c-3rms16bz.json => third-reality-inc-3rms16bz-0x0000004f.json} | 0 ...3rsb015bz.json => third-reality-inc-3rsb015bz-0x00000048.json} | 0 ...3rsm0147z.json => third-reality-inc-3rsm0147z-0x0000001f.json} | 0 ...l02043z.json => third-reality-inc-3rsnl02043z-0x0000003c.json} | 0 ...3rsp019bz.json => third-reality-inc-3rsp019bz-0x1001301e.json} | 0 ...02028bz.json => third-reality-inc-3rsp02028bz-0x10013058.json} | 0 ...sp02064z.json => third-reality-inc-3rsp02064z-0x0000002f.json} | 0 ...c-3rss009z.json => third-reality-inc-3rss009z-0x0000001d.json} | 0 ...3rths24bz.json => third-reality-inc-3rths24bz-0x00000015.json} | 0 ...vs01031z.json => third-reality-inc-3rvs01031z-0x00000028.json} | 0 ...c-3rws18bz.json => third-reality-inc-3rws18bz-0x00000038.json} | 0 ...6ifxj-5j6ifxj.json => tyst11-i5j6ifxj-5j6ifxj-0x00000049.json} | 0 ...63ssaah-ts0207.json => tyzb01-o63ssaah-ts0207-0x00000043.json} | 0 ...m6djpta-ts0215.json => tyzb01-qm6djpta-ts0215-0x00000046.json} | 0 ...ifa0wlb-ts0011.json => tyzb01-rifa0wlb-ts0011-0x00000041.json} | 0 ...dd0d5yi-ts130f.json => tz3000-1dd0d5yi-ts130f-0x00000047.json} | 0 ...o6x1bl0-ts0201.json => tz3000-1o6x1bl0-ts0201-0x00000041.json} | 0 ...ias4w4o-ts011f.json => tz3000-3ias4w4o-ts011f-0x0000004e.json} | 0 ...nkb7mof-ts0121.json => tz3000-8nkb7mof-ts0121-0x00000042.json} | 0 ...gsigers-ts0201.json => tz3000-bgsigers-ts0201-0x00000040.json} | 0 ...guser20-ts0201.json => tz3000-bguser20-ts0201-0x00000045.json} | 0 ...ehuw1lw-ts011f.json => tz3000-cehuw1lw-ts011f-0x0000004d.json} | 0 ...icwjqth-ts011f.json => tz3000-cicwjqth-ts011f-0x74013001.json} | 0 ...rc9tuqb-ts0001.json => tz3000-drc9tuqb-ts0001-0x00000047.json} | 0 ...amtuojw-ts0201.json => tz3000-eamtuojw-ts0201-0x00000041.json} | 0 ...2bw0b6k-ts0201.json => tz3000-f2bw0b6k-ts0201-0x00000046.json} | 0 ...amkxci2-ts0043.json => tz3000-famkxci2-ts0043-0x00000044.json} | 0 ...bm10jnj-ts0043.json => tz3000-gbm10jnj-ts0043-0x00000042.json} | 0 ...jpgagal-ts0049.json => tz3000-gjpgagal-ts0049-0x00000049.json} | 0 ...afsqare-ts0011.json => tz3000-hafsqare-ts0011-0x00000050.json} | 0 ...dhkkbqj-ts0012.json => tz3000-idhkkbqj-ts0012-0x00000041.json} | 0 ...sw9u95y-ts0201.json => tz3000-isw9u95y-ts0201-0x00000040.json} | 0 ...tnrsufe-ts0201.json => tz3000-itnrsufe-ts0201-0x00000042.json} | 0 ...1xl73iw-ts130f.json => tz3000-j1xl73iw-ts130f-0x00000046.json} | 0 ...a5osu5g-ts004f.json => tz3000-ja5osu5g-ts004f-0x00000041.json} | 0 ...qvb5akv-ts0001.json => tz3000-kqvb5akv-ts0001-0x0000004a.json} | 0 ...gusv51k-ts0052.json => tz3000-mgusv51k-ts0052-0x00000044.json} | 0 ...khkxx1p-ts0001.json => tz3000-mkhkxx1p-ts0001-0x00000048.json} | 0 ...ugyhz0q-ts0207.json => tz3000-mugyhz0q-ts0207-0x00000041.json} | 0 ...w1pqqqt-ts0003.json => tz3000-mw1pqqqt-ts0003-0x0000004a.json} | 0 ...1jzcxou-ts011f.json => tz3000-o1jzcxou-ts011f-0x00000043.json} | 0 ...4mkahkc-ts0202.json => tz3000-o4mkahkc-ts0202-0x00000046.json} | 0 ...26flek3-ts0001.json => tz3000-p26flek3-ts0001-0x00000053.json} | 0 ...l5v1yyy-ts011f.json => tz3000-pl5v1yyy-ts011f-0x00000050.json} | 0 ...dnrzbd3-ts0202.json => tz3000-qdnrzbd3-ts0202-0x00000046.json} | 0 ...gb0xhwn-ts011f.json => tz3000-sgb0xhwn-ts011f-0x00000050.json} | 0 ...qlv4ug4-ts0001.json => tz3000-tqlv4ug4-ts0001-0x00000048.json} | 0 ...ypdpbpg-ts011f.json => tz3000-typdpbpg-ts011f-0x10013607.json} | 0 ...3oupgdy-ts0004.json => tz3000-u3oupgdy-ts0004-0x00000050.json} | 0 ...4kojtqz-ts0002.json => tz3000-u4kojtqz-ts0002-0x10013607.json} | 0 ...wkja6z1-ts011f.json => tz3000-uwkja6z1-ts011f-0x00000045.json} | 0 ...w8pawxa-ts130f.json => tz3000-vw8pawxa-ts130f-0x00000048.json} | 0 ...cgyhnp3-ts0222.json => tz3000-wcgyhnp3-ts0222-0x00000045.json} | 0 ...n65ixz9-ts0001.json => tz3000-wn65ixz9-ts0001-0x00000051.json} | 0 ...j6k7vfo-ts0041.json => tz3000-yj6k7vfo-ts0041-0x00000044.json} | 0 .../{tz3000-zl1kmjqx.json => tz3000-zl1kmjqx-0x10013001.json} | 0 ...w7yf6yk-ts0001.json => tz3000-zw7yf6yk-ts0001-0x00000048.json} | 0 ...aq2bfcu-ts0726.json => tz3002-vaq2bfcu-ts0726-0x00000051.json} | 0 ...juvw9zf-ts0726.json => tz3002-zjuvw9zf-ts0726-0x00000055.json} | 0 ...b6xaihh-ts0202.json => tz3040-bb6xaihh-ts0202-0x00000048.json} | 0 ...zmirw-ts0502b.json => tz3210-09hzmirw-ts0502b-0x0000005b.json} | 0 ...mpwqzuu-ts110e.json => tz3210-3mpwqzuu-ts110e-0x00000040.json} | 0 ...vgttna6-ts0001.json => tz3210-7vgttna6-ts0001-0x00000073.json} | 0 ...04acm9s-ts0001.json => tz3210-a04acm9s-ts0001-0x00000077.json} | 0 ...kuwws-ts0502b.json => tz3210-comkuwws-ts0502b-0x00000065.json} | 0 ...wytrmda-ts130f.json => tz3210-dwytrmda-ts130f-0x00000042.json} | 0 ...anwyc-ts0502b.json => tz3210-ehcanwyc-ts0502b-0x00000065.json} | 0 ...4pdtz9v-ts0001.json => tz3210-j4pdtz9v-ts0001-0x00000062.json} | 0 ...p6jeb-ts0505b.json => tz3210-jaap6jeb-ts0505b-0x00000065.json} | 0 ...fm80b-ts0502b.json => tz3210-jtifm80b-ts0502b-0x00000065.json} | 0 ...1msuvg6-ts110e.json => tz3210-k1msuvg6-ts110e-0x00000040.json} | 0 ...jafhwd2-ts0210.json => tz3210-kjafhwd2-ts0210-0x00000044.json} | 0 ...2wul0-ts0505b.json => tz3210-klv2wul0-ts0505b-0x00000065.json} | 0 ...cw88jfq-ts0201.json => tz3210-ncw88jfq-ts0201-0x00000083.json} | 0 ...kj7rujp-ts0201.json => tz3210-qkj7rujp-ts0201-0x00000043.json} | 0 ...fgmkl-ts0505b.json => tz3210-r5afgmkl-ts0505b-0x10013607.json} | 0 ...u41azca-ts0049.json => tz3210-ru41azca-ts0049-0x00000040.json} | 0 ...b8x2xci-ts0001.json => tz3210-sb8x2xci-ts0001-0x00000047.json} | 0 ...gvtvdoc-ts0207.json => tz3210-tgvtvdoc-ts0207-0x00000043.json} | 0 ...reag7-ts0502b.json => tz3210-u1dreag7-ts0502b-0x00000065.json} | 0 ...kyjnj-ts0502b.json => tz3210-ue9kyjnj-ts0502b-0x00000059.json} | 0 ...uhzzfqg-ts0202.json => tz3210-wuhzzfqg-ts0202-0x000000a1.json} | 0 ...hqmo0-ts0502b.json => tz3210-zdrhqmo0-ts0502b-0x00000064.json} | 0 ...fiyo3kv-ts000f.json => tz3218-7fiyo3kv-ts000f-0x00000051.json} | 0 ...9ynfz4x-ts0225.json => tz3218-t9ynfz4x-ts0225-0x00000045.json} | 0 ...a5d6wth-ts000f.json => tz3218-ya5d6wth-ts000f-0x00000064.json} | 0 ...ts1201.json => tz3290-ot6ewjvmejq5ekhl-ts1201-0x00000043.json} | 0 ...uv6fhwt-ts0601.json => tz6210-duv6fhwt-ts0601-0x00000042.json} | 0 ...ikxay-ts0505b.json => tzb210-417ikxay-ts0505b-0x00000040.json} | 0 ...quxus-ts0502b.json => tzb210-lmqquxus-ts0502b-0x00000040.json} | 0 ...kvnnm-ts0502b.json => tzb210-rawkvnnm-ts0502b-0x00000040.json} | 0 ...se8efxh-ts0601.json => tze200-2se8efxh-ts0601-0x00000048.json} | 0 ...t91nb6k-ts0601.json => tze200-3t91nb6k-ts0601-0x00000046.json} | 0 ...towulqd-ts0601.json => tze200-3towulqd-ts0601-0x00000046.json} | 0 ...utwozi2-ts0601.json => tze200-4utwozi2-ts0601-0x00000043.json} | 0 ...79lguh2-ts0601.json => tze200-579lguh2-ts0601-0x00000044.json} | 0 ...bztmfm1-ts0601.json => tze200-7bztmfm1-ts0601-0x00000046.json} | 0 ...iqgciln-ts0601.json => tze200-7iqgciln-ts0601-0x00000041.json} | 0 ...ytb3h8u-ts0601.json => tze200-7ytb3h8u-ts0601-0x00000048.json} | 0 ...1isopgh-ts0601.json => tze200-81isopgh-ts0601-0x00000048.json} | 0 ...whfphjv-ts0601.json => tze200-8whfphjv-ts0601-0x00000048.json} | 0 ...caxna4s-ts0301.json => tze200-9caxna4s-ts0301-0x00000049.json} | 0 ...xfjixap-ts0601.json => tze200-9xfjixap-ts0601-0x00000043.json} | 0 ...7sghmms-ts0601.json => tze200-a7sghmms-ts0601-0x00000048.json} | 0 ...batw3kj-ts0601.json => tze200-abatw3kj-ts0601-0x00000046.json} | 0 ...6wax7g0-ts0601.json => tze200-b6wax7g0-ts0601-0x00000043.json} | 0 ...kkmqmyo-ts0601.json => tze200-bkkmqmyo-ts0601-0x00000041.json} | 0 ...88teujp-ts0601.json => tze200-c88teujp-ts0601-0x00000055.json} | 0 ...irvgep4-ts0601.json => tze200-cirvgep4-ts0601-0x00000048.json} | 0 ...9a3awaj-ts0601.json => tze200-g9a3awaj-ts0601-0x00000048.json} | 0 ...jldowol-ts0601.json => tze200-gjldowol-ts0601-0x00000050.json} | 0 ...uvc7pdy-ts0601.json => tze200-guvc7pdy-ts0601-0x00000046.json} | 0 ...hrtiq0x-ts0601.json => tze200-hhrtiq0x-ts0601-0x00000055.json} | 0 ...r0tdd47-ts0601.json => tze200-hr0tdd47-ts0601-0x00000048.json} | 0 ...s3mgbjb-ts0601.json => tze200-js3mgbjb-ts0601-0x00000044.json} | 0 ...wsjbxjs-ts0601.json => tze200-jwsjbxjs-ts0601-0x00000046.json} | 0 ...ocansqn-ts0601.json => tze200-locansqn-ts0601-0x00000048.json} | 0 ...gxy2d9f-ts0601.json => tze200-mgxy2d9f-ts0601-0x00000043.json} | 0 ...oycceze-ts0601.json => tze200-moycceze-ts0601-0x00000043.json} | 0 ...udxchsu-ts0601.json => tze200-mudxchsu-ts0601-0x00000045.json} | 0 ...yd45weu-ts0601.json => tze200-myd45weu-ts0601-0x00000048.json} | 0 ...qaqq4cf-ts0601.json => tze200-nqaqq4cf-ts0601-0x00000044.json} | 0 ...l31aqf5-ts0601.json => tze200-pl31aqf5-ts0601-0x00000046.json} | 0 ...yflbnbj-ts0601.json => tze200-qyflbnbj-ts0601-0x00000046.json} | 0 ...32ctezx-ts0601.json => tze200-r32ctezx-ts0601-0x00000046.json} | 0 ...5ksy7qo-ts0601.json => tze200-r5ksy7qo-ts0601-0x00000043.json} | 0 ...mymn92d-ts0601.json => tze200-rmymn92d-ts0601-0x00000046.json} | 0 ...ur6q7ko-ts0601.json => tze200-sur6q7ko-ts0601-0x00000045.json} | 0 ...f1qujxj-ts0601.json => tze200-uf1qujxj-ts0601-0x00000048.json} | 0 ...vmbj46n-ts0601.json => tze200-vvmbj46n-ts0601-0x00000048.json} | 0 ...dfurkoa-ts0601.json => tze200-wdfurkoa-ts0601-0x00000041.json} | 0 ...fxuhoea-ts0601.json => tze200-wfxuhoea-ts0601-0x00000046.json} | 0 ...ia0p3tr-ts0601.json => tze200-yia0p3tr-ts0601-0x00000046.json} | 0 ...w7cahqs-ts0601.json => tze200-yw7cahqs-ts0601-0x00000055.json} | 0 ...v1dxkck-ts0601.json => tze204-1v1dxkck-ts0601-0x0000004a.json} | 0 ...youk3hj-ts0601.json => tze204-1youk3hj-ts0601-0x0000004a.json} | 0 ...fblxpma-ts0601.json => tze204-4fblxpma-ts0601-0x00000049.json} | 0 ...8of2pfn-ts0601.json => tze204-58of2pfn-ts0601-0x0000004a.json} | 0 ...slehgeo-ts0601.json => tze204-5slehgeo-ts0601-0x0000004a.json} | 0 ...1yrt3lo-ts0601.json => tze204-81yrt3lo-ts0601-0x0000004a.json} | 0 ...2jcoyuk-ts0601.json => tze204-a2jcoyuk-ts0601-0x0000004a.json} | 0 ...i4rqhky-ts0601.json => tze204-ai4rqhky-ts0601-0x00000049.json} | 0 ...oclfnxz-ts0601.json => tze204-aoclfnxz-ts0601-0x0000004a.json} | 0 ...2fmom5z-ts0601.json => tze204-c2fmom5z-ts0601-0x0000004a.json} | 0 ...irvgep4-ts0601.json => tze204-cirvgep4-ts0601-0x00000049.json} | 0 ...6i25bwg-ts0601.json => tze204-d6i25bwg-ts0601-0x0000004a.json} | 0 ...wcarsat-ts0601.json => tze204-dwcarsat-ts0601-0x0000004a.json} | 0 ...ekpf0ft-ts0601.json => tze204-eekpf0ft-ts0601-0x0000004a.json} | 0 ...x3rcdha-ts0601.json => tze204-ex3rcdha-ts0601-0x0000004a.json} | 0 ...hvdgeuh-ts0601.json => tze204-fhvdgeuh-ts0601-0x0000004a.json} | 0 ...oecjd1t-ts0601.json => tze204-goecjd1t-ts0601-0x0000004a.json} | 0 ...ops3slb-ts0601.json => tze204-gops3slb-ts0601-0x0000004a.json} | 0 ...uvc7pdy-ts0601.json => tze204-guvc7pdy-ts0601-0x0000004a.json} | 0 ...aeejhvf-ts0601.json => tze204-iaeejhvf-ts0601-0x0000004a.json} | 0 ...rcfsaa3-ts0601.json => tze204-jrcfsaa3-ts0601-0x0000004a.json} | 0 ...b0fsvba-ts0601.json => tze204-lb0fsvba-ts0601-0x0000004a.json} | 0 ...bbg34rj-ts0601.json => tze204-lbbg34rj-ts0601-0x0000004a.json} | 0 ...pedvtvr-ts0601.json => tze204-lpedvtvr-ts0601-0x0000004a.json} | 0 ...sanae15-ts0601.json => tze204-lsanae15-ts0601-0x0000004a.json} | 0 ...twbm23f-ts0601.json => tze204-ltwbm23f-ts0601-0x0000004a.json} | 0 ...64smti7-ts0601.json => tze204-m64smti7-ts0601-0x0000004a.json} | 0 ...9dzckna-ts0601.json => tze204-m9dzckna-ts0601-0x0000004a.json} | 0 ...toaryre-ts0601.json => tze204-mtoaryre-ts0601-0x0000004a.json} | 0 ...womyz5n-ts0601.json => tze204-mwomyz5n-ts0601-0x0000004a.json} | 0 ...bkshs6k-ts0601.json => tze204-nbkshs6k-ts0601-0x0000004a.json} | 0 ...klqjk62-ts0601.json => tze204-nklqjk62-ts0601-0x0000004a.json} | 0 ...lrfgpny-ts0601.json => tze204-nlrfgpny-ts0601-0x00000049.json} | 0 ...qqylykc-ts0601.json => tze204-nqqylykc-ts0601-0x0000004a.json} | 0 ...vxorhcj-ts0601.json => tze204-nvxorhcj-ts0601-0x0000004a.json} | 0 ...gx8u5z6-ts0601.json => tze204-ogx8u5z6-ts0601-0x0000004a.json} | 0 ...cdmj88b-ts0601.json => tze204-pcdmj88b-ts0601-0x00000049.json} | 0 ...xbjch8m-ts0601.json => tze204-pxbjch8m-ts0601-0x0000004a.json} | 0 ...asjif9e-ts0601.json => tze204-qasjif9e-ts0601-0x0000004a.json} | 0 ...tnjuoae-ts0601.json => tze204-qtnjuoae-ts0601-0x00000049.json} | 0 ...vxrkeif-ts0601.json => tze204-qvxrkeif-ts0601-0x0000004a.json} | 0 ...yr2m29i-ts0601.json => tze204-qyr2m29i-ts0601-0x0000004a.json} | 0 ...32ctezx-ts0601.json => tze204-r32ctezx-ts0601-0x0000004a.json} | 0 ...trmfadk-ts0601.json => tze204-rtrmfadk-ts0601-0x00000049.json} | 0 ...agezcph-ts0601.json => tze204-tagezcph-ts0601-0x0000004a.json} | 0 ...dhnhhiy-ts0601.json => tze204-tdhnhhiy-ts0601-0x0000004a.json} | 0 ...xllnywp-ts0601.json => tze204-uxllnywp-ts0601-0x0000004a.json} | 0 ...jpaih9f-ts0601.json => tze204-vjpaih9f-ts0601-0x0000004a.json} | 0 ...1wwxoja-ts0601.json => tze204-w1wwxoja-ts0601-0x0000004a.json} | 0 ...bhaespm-ts0601.json => tze204-wbhaespm-ts0601-0x0000004a.json} | 0 ...8fp01wi-ts0601.json => tze204-x8fp01wi-ts0601-0x0000004a.json} | 0 ...9usygq1-ts0601.json => tze204-x9usygq1-ts0601-0x0000004a.json} | 0 ...alsoe3m-ts0601.json => tze204-xalsoe3m-ts0601-0x0000004a.json} | 0 ...lppj4f5-ts0601.json => tze204-xlppj4f5-ts0601-0x0000004a.json} | 0 ...nbkhhdr-ts0601.json => tze204-xnbkhhdr-ts0601-0x0000004a.json} | 0 ...u4a5rhj-ts0601.json => tze204-xu4a5rhj-ts0601-0x0000004a.json} | 0 ...a4ft0w4-ts0601.json => tze204-ya4ft0w4-ts0601-0x0000004a.json} | 0 ...vx5lh6k-ts0601.json => tze204-yvx5lh6k-ts0601-0x0000004a.json} | 0 ...tqnh5cg-ts0601.json => tze204-ztqnh5cg-ts0601-0x0000004a.json} | 0 ...bexmf8h-ts130f.json => tze20c-xbexmf8h-ts130f-0x00000040.json} | 0 ...ka46xbw-ts0601.json => tze20c-zka46xbw-ts0601-0x00000051.json} | 0 ...gi1hy8s-ts0601.json => tze284-2gi1hy8s-ts0601-0x00000050.json} | 0 ...mzb0sdz-ts0601.json => tze284-3mzb0sdz-ts0601-0x00000050.json} | 0 ...hrnp30w-ts0601.json => tze284-6hrnp30w-ts0601-0x00000050.json} | 0 ...ycgarab-ts0601.json => tze284-6ycgarab-ts0601-0x00000050.json} | 0 ...8ioiaml-ts0601.json => tze284-78ioiaml-ts0601-0x0000004a.json} | 0 ...gy9mqca-ts0601.json => tze284-7gy9mqca-ts0601-0x0000004e.json} | 0 ...zazvlyn-ts0601.json => tze284-7zazvlyn-ts0601-0x00000045.json} | 0 ...1yrt3lo-ts0601.json => tze284-81yrt3lo-ts0601-0x0000004e.json} | 0 ...b9zpaav-ts0601.json => tze284-8b9zpaav-ts0601-0x0000004e.json} | 0 ...se38w3c-ts0601.json => tze284-8se38w3c-ts0601-0x0000004d.json} | 0 ...2xewxoo-ts0601.json => tze284-a2xewxoo-ts0601-0x0000004e.json} | 0 ...6wv4xyo-ts0601.json => tze284-c6wv4xyo-ts0601-0x0000004d.json} | 0 ...mckrsxg-ts0601.json => tze284-dmckrsxg-ts0601-0x0000004e.json} | 0 ...5efvtbv-ts0601.json => tze284-f5efvtbv-ts0601-0x0000004e.json} | 0 ...2e6cpnw-ts0601.json => tze284-g2e6cpnw-ts0601-0x0000004d.json} | 0 ...odyryli-ts0601.json => tze284-hodyryli-ts0601-0x00000050.json} | 0 ...adro9bf-ts0601.json => tze284-iadro9bf-ts0601-0x0000004e.json} | 0 ...dvyees9-ts0601.json => tze284-idvyees9-ts0601-0x0000004e.json} | 0 ...yyu8rbj-ts0601.json => tze284-kyyu8rbj-ts0601-0x0000004d.json} | 0 ...8xiyymq-ts0601.json => tze284-l8xiyymq-ts0601-0x0000004a.json} | 0 ...q0ffndf-ts0601.json => tze284-lq0ffndf-ts0601-0x00000046.json} | 0 ...twbm23f-ts0601.json => tze284-ltwbm23f-ts0601-0x0000004d.json} | 0 ...yd45weu-ts0601.json => tze284-myd45weu-ts0601-0x0000004d.json} | 0 ...klqjk62-ts0601.json => tze284-nklqjk62-ts0601-0x0000004e.json} | 0 ...nhwcvbk-ts0601.json => tze284-nnhwcvbk-ts0601-0x0000004d.json} | 0 ...3x45p96-ts0601.json => tze284-o3x45p96-ts0601-0x0000004d.json} | 0 ...9ofysmo-ts0601.json => tze284-o9ofysmo-ts0601-0x00000050.json} | 0 ...gx8u5z6-ts0601.json => tze284-ogx8u5z6-ts0601-0x0000004d.json} | 0 ...itavov2-ts0601.json => tze284-oitavov2-ts0601-0x00000050.json} | 0 ...cdmj88b-ts0601.json => tze284-pcdmj88b-ts0601-0x0000004d.json} | 0 ...yflbnbj-ts0601.json => tze284-qyflbnbj-ts0601-0x0000004d.json} | 0 ...jxqso4a-ts0601.json => tze284-rjxqso4a-ts0601-0x0000004d.json} | 0 ...lytpmij-ts0601.json => tze284-rlytpmij-ts0601-0x00000051.json} | 0 ...vnbnvw8-ts0601.json => tze284-rvnbnvw8-ts0601-0x0000004e.json} | 0 ...gabhwa6-ts0601.json => tze284-sgabhwa6-ts0601-0x0000004d.json} | 0 ...pagmta9-ts0601.json => tze284-upagmta9-ts0601-0x0000004d.json} | 0 ...awy74yh-ts0601.json => tze284-vawy74yh-ts0601-0x0000004d.json} | 0 ...uwtqx0t-ts0601.json => tze284-vuwtqx0t-ts0601-0x00000050.json} | 0 ...tikaxzs-ts0601.json => tze284-wtikaxzs-ts0601-0x0000004d.json} | 0 ...nbkhhdr-ts0601.json => tze284-xnbkhhdr-ts0601-0x0000004d.json} | 0 ...jhoqbrd-ts0601.json => tze284-zjhoqbrd-ts0601-0x0000004d.json} | 0 ...m8zpwas-ts0601.json => tze284-zm8zpwas-ts0601-0x00000050.json} | 0 ...nvwzxkq-ts0601.json => tze284-znvwzxkq-ts0601-0x0000004a.json} | 0 ...p8xakad-ts0601.json => tze284-zp8xakad-ts0601-0x0000004d.json} | 0 ...-ts0601.json => tze28c1000000-alh14edn-ts0601-0x00000048.json} | 0 ...75zqghm-ts0603.json => tze608-c75zqghm-ts0603-0x00000040.json} | 0 .../{ubisys-s1-5501.json => ubisys-s1-5501-0x02600460.json} | 0 ...n => universal-electronics-inc-urc4460bc0-x-r-0x20160921.json} | 0 ...aoyan-terncy-sd01.json => xiaoyan-terncy-sd01-0x0000001a.json} | 0 .../{yale-yrd256-tsdb.json => yale-yrd256-tsdb-0x0105002b.json} | 0 .../{yooksmart-d10110.json => yooksmart-d10110-0x12046780.json} | 0 ...mismart-spm02-3z3.json => zemismart-spm02-3z3-0x0000000e.json} | 0 .../{zen-within-zen-01.json => zen-within-zen-01-0x0000021f.json} | 0 466 files changed, 0 insertions(+), 0 deletions(-) rename tests/data/devices/{adeo-zb-watersensor-d0001.json => adeo-zb-watersensor-d0001-0x21120002.json} (100%) rename tests/data/devices/{adurosmart-eria-ad-rgbw3001.json => adurosmart-eria-ad-rgbw3001-0x00000001.json} (100%) rename tests/data/devices/{aqara-lumi-airrtc-aeu001.json => aqara-lumi-airrtc-aeu001-0x00000a1a.json} (100%) rename tests/data/devices/{aqara-lumi-airrtc-aeu005.json => aqara-lumi-airrtc-aeu005-0x00001227.json} (100%) rename tests/data/devices/{aqara-lumi-light-acn132.json => aqara-lumi-light-acn132-0x00001a1a.json} (100%) rename tests/data/devices/{aqara-lumi-light-agl003.json => aqara-lumi-light-agl003-0x0000001b.json} (100%) rename tests/data/devices/{aqara-lumi-light-agl005.json => aqara-lumi-light-agl005-0x0000001b.json} (100%) rename tests/data/devices/{aqara-lumi-motion-ac01.json => aqara-lumi-motion-ac01-0x00000035.json} (100%) rename tests/data/devices/{aqara-lumi-sensor-occupy-agl1.json => aqara-lumi-sensor-occupy-agl1-0x0000001a.json} (100%) rename tests/data/devices/{aqara-lumi-sensor-occupy-agl8.json => aqara-lumi-sensor-occupy-agl8-0x00003422.json} (100%) rename tests/data/devices/{aqara-lumi-switch-acn047.json => aqara-lumi-switch-acn047-0x0000001c.json} (100%) rename tests/data/devices/{aqara-lumi-switch-aeu003.json => aqara-lumi-switch-aeu003-0x00000e14.json} (100%) rename tests/data/devices/{aqara-lumi-switch-agl007.json => aqara-lumi-switch-agl007-0x00001116.json} (100%) rename tests/data/devices/{aqara-lumi-switch-agl010.json => aqara-lumi-switch-agl010-0x00001315.json} (100%) rename tests/data/devices/{aug-winkhaus-gmbh-co-kg-fm-v-zb.json => aug-winkhaus-gmbh-co-kg-fm-v-zb-0x00000011.json} (100%) rename tests/data/devices/{bega-gantenbrink-leuchten-kg-smart-dimmable-light.json => bega-gantenbrink-leuchten-kg-smart-dimmable-light-0x00990be9.json} (100%) rename tests/data/devices/{bosch-rbsh-mms-zb-eu.json => bosch-rbsh-mms-zb-eu-0x11136760.json} (100%) rename tests/data/devices/{bosch-rbsh-rth0-bat-zb-eu.json => bosch-rbsh-rth0-bat-zb-eu-0x02086a30.json} (100%) rename tests/data/devices/{bosch-rbsh-rth0-zb-eu.json => bosch-rbsh-rth0-zb-eu-0x03036a30.json} (100%) rename tests/data/devices/{bosch-rbsh-trv0-zb-eu.json => bosch-rbsh-trv0-zb-eu-0x32051514.json} (100%) rename tests/data/devices/{bosch-rbsh-us4btn-zb-eu.json => bosch-rbsh-us4btn-zb-eu-0x100d6a30.json} (100%) rename tests/data/devices/{candeo-c-zb-lc20-dim.json => candeo-c-zb-lc20-dim-0x29013001.json} (100%) rename tests/data/devices/{candeo-c-zb-lc20-rgb.json => candeo-c-zb-lc20-rgb-0x31013001.json} (100%) rename tests/data/devices/{centralite-3300.json => centralite-3300-0x1f075310.json} (100%) rename tests/data/devices/{centralite-3310-g.json => centralite-3310-g-0x11015310.json} (100%) rename tests/data/devices/{centralite-3315-seu.json => centralite-3315-seu-0x1f085310.json} (100%) rename tests/data/devices/{centralite-3405-l.json => centralite-3405-l-0x10025310.json} (100%) rename tests/data/devices/{centralite-systems-3156105.json => centralite-systems-3156105-0x1418468c.json} (100%) rename tests/data/devices/{danfoss-etrv0103.json => danfoss-etrv0103-0x00000014.json} (100%) rename tests/data/devices/{ecodim-bv-eco-dim-05-zigbee.json => ecodim-bv-eco-dim-05-zigbee-0x00000001.json} (100%) rename tests/data/devices/{ecolink-4655bc0-r.json => ecolink-4655bc0-r-0x20160921.json} (100%) rename tests/data/devices/{ericsity-gl-c-008p.json => ericsity-gl-c-008p-0x25013001.json} (100%) mode change 100755 => 100644 rename tests/data/devices/{ericsity-gl-c-009p.json => ericsity-gl-c-009p-0x25013001.json} (100%) rename tests/data/devices/{espressif-zigbeebinaryoutputdevice.json => espressif-zigbeebinaryanalogdevice.json} (100%) rename tests/data/devices/{eurotronic-spzb0001.json => eurotronic-spzb0001-0x4501001f.json} (100%) rename tests/data/devices/{ewelink-ck-bl702-al-01-7009-z102lg03-1.json => ewelink-ck-bl702-al-01-7009-z102lg03-1-0x00001200.json} (100%) rename tests/data/devices/{ewelink-ck-tlsr8656-ss5-01-7000.json => ewelink-ck-tlsr8656-ss5-01-7000-0x00001102.json} (100%) rename tests/data/devices/{ewelink-snzb-01p.json => ewelink-snzb-01p-0x00002000.json} (100%) rename tests/data/devices/{ewelink-snzb-02p.json => ewelink-snzb-02p-0x00002100.json} (100%) rename tests/data/devices/{ewelink-snzb-03p.json => ewelink-snzb-03p-0x00002201.json} (100%) rename tests/data/devices/{ewelink-snzb-04p.json => ewelink-snzb-04p-0x00002200.json} (100%) rename tests/data/devices/{ezviz-cs-t55-r100-g.json => ezviz-cs-t55-r100-g-0x00000002.json} (100%) rename tests/data/devices/{frient-a-s-aqszb-110.json => frient-a-s-aqszb-110-0x00040001.json} (100%) rename tests/data/devices/{frient-a-s-emizb-141.json => frient-a-s-emizb-141-0x00030102.json} (100%) rename tests/data/devices/{frient-a-s-emizb-151.json => frient-a-s-emizb-151-0x00030107.json} (100%) rename tests/data/devices/{frient-a-s-flszb-110.json => frient-a-s-flszb-110-0x00040001.json} (100%) rename tests/data/devices/{frient-a-s-hmszb-120.json => frient-a-s-hmszb-120-0x00040001.json} (100%) rename tests/data/devices/{frient-a-s-iomzb-110.json => frient-a-s-iomzb-110-0x00020001.json} (100%) rename tests/data/devices/{frient-a-s-kepzb-110.json => frient-a-s-kepzb-110-0x00020005.json} (100%) rename tests/data/devices/{frient-a-s-moszb-140.json => frient-a-s-moszb-140-0x00040006.json} (100%) rename tests/data/devices/{frient-a-s-moszb-153.json => frient-a-s-moszb-153-0x00020006.json} (100%) rename tests/data/devices/{frient-a-s-sbtzb-110.json => frient-a-s-sbtzb-110-0x00020002.json} (100%) rename tests/data/devices/{frient-a-s-scazb-141.json => frient-a-s-scazb-141-0x00010803.json} (100%) rename tests/data/devices/{frient-a-s-sirzb-111.json => frient-a-s-sirzb-111-0x00020004.json} (100%) rename tests/data/devices/{frient-a-s-smszb-120.json => frient-a-s-smszb-120-0x00040008.json} (100%) rename tests/data/devices/{frient-a-s-splzb-141.json => frient-a-s-splzb-141-0x00020009.json} (100%) rename tests/data/devices/{frient-a-s-wiszb-131.json => frient-a-s-wiszb-131-0x00020006.json} (100%) rename tests/data/devices/{gledopto-gl-b-008p.json => gledopto-gl-b-008p-0x00000006.json} (100%) rename tests/data/devices/{gledopto-gl-c-009p.json => gledopto-gl-c-009p-0x29013001.json} (100%) rename tests/data/devices/{gledopto-gl-sd-301p.json => gledopto-gl-sd-301p-0x26013001.json} (100%) rename tests/data/devices/{handshake-finland-agge-zigbee-smart-rotary-dimmer.json => handshake-finland-agge-zigbee-smart-rotary-dimmer-0x00000002.json} (100%) rename tests/data/devices/{hive-mbr1.json => hive-mbr1-0x01047320.json} (100%) rename tests/data/devices/{ikea-of-sweden-badring-water-leakage-sensor.json => ikea-of-sweden-badring-water-leakage-sensor-0x01000007.json} (100%) rename tests/data/devices/{ikea-of-sweden-fyrtur-block-out-roller-blind.json => ikea-of-sweden-fyrtur-block-out-roller-blind-0x23088631.json} (100%) rename tests/data/devices/{ikea-of-sweden-inspelning-smart-plug.json => ikea-of-sweden-inspelning-smart-plug-0x02040045.json} (100%) rename tests/data/devices/{ikea-of-sweden-ormanas-led-strip.json => ikea-of-sweden-ormanas-led-strip-0x01010010.json} (100%) rename tests/data/devices/{ikea-of-sweden-parasoll-door-window-sensor.json => ikea-of-sweden-parasoll-door-window-sensor-0x01000019.json} (100%) rename tests/data/devices/{ikea-of-sweden-praktlysing-cellular-blind.json => ikea-of-sweden-praktlysing-cellular-blind-0x23088631.json} (100%) rename tests/data/devices/{ikea-of-sweden-rodret-dimmer.json => ikea-of-sweden-rodret-dimmer-0x01000047.json} (100%) rename tests/data/devices/{ikea-of-sweden-rodret-wireless-dimmer.json => ikea-of-sweden-rodret-wireless-dimmer-0x01000057.json} (100%) rename tests/data/devices/{ikea-of-sweden-somrig-shortcut-button.json => ikea-of-sweden-somrig-shortcut-button-0x01000021.json} (100%) rename tests/data/devices/{ikea-of-sweden-starkvind-air-purifier.json => ikea-of-sweden-starkvind-air-purifier-0x00011001.json} (100%) rename tests/data/devices/{ikea-of-sweden-starkvind-air-purifier-table.json => ikea-of-sweden-starkvind-air-purifier-table-0x00011001.json} (100%) rename tests/data/devices/{ikea-of-sweden-symfonisk-sound-remote-gen2.json => ikea-of-sweden-symfonisk-sound-remote-gen2-0x00010012.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-bulb-e12-w-op-ch-400lm.json => ikea-of-sweden-tradfri-bulb-e12-w-op-ch-400lm-0x23094631.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-bulb-e12-ws-opal-400lm.json => ikea-of-sweden-tradfri-bulb-e12-ws-opal-400lm-0x23087631.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-bulb-e14-ws-globe-470lm.json => ikea-of-sweden-tradfri-bulb-e14-ws-globe-470lm-0x01010020.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-bulb-e26-opal-1000lm.json => ikea-of-sweden-tradfri-bulb-e26-opal-1000lm-0x23094631.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-bulb-e26-w-opal-1000lm.json => ikea-of-sweden-tradfri-bulb-e26-w-opal-1000lm-0x23094631.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-bulb-e26-ws-opal-980lm.json => ikea-of-sweden-tradfri-bulb-e26-ws-opal-980lm-0x23095631.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-bulb-e27-ws-globe-1055lm.json => ikea-of-sweden-tradfri-bulb-e27-ws-globe-1055lm-0x02040005.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-bulb-e27-ww-g95-cl-470lm.json => ikea-of-sweden-tradfri-bulb-e27-ww-g95-cl-470lm-0x00011006.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json => ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-bulb-gu10-ww-400lm.json => ikea-of-sweden-tradfri-bulb-gu10-ww-400lm-0x23093631.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-control-outlet.json => ikea-of-sweden-tradfri-control-outlet-0x23089631.json} (100%) rename tests/data/devices/{ikea-of-sweden-tradfri-open-close-remote.json => ikea-of-sweden-tradfri-open-close-remote-0x23079631.json} (100%) rename tests/data/devices/{ikea-of-sweden-vallhorn-wireless-motion-sensor.json => ikea-of-sweden-vallhorn-wireless-motion-sensor-0x01000064.json} (100%) rename tests/data/devices/{innr-ae-280-c.json => innr-ae-280-c-0x20026a30.json} (100%) rename tests/data/devices/{innr-rb-285-c.json => innr-rb-285-c-0x10051567.json} (100%) rename tests/data/devices/{innr-rc-250.json => innr-rc-250-0x21086500.json} (100%) rename tests/data/devices/{innr-rs-232-c.json => innr-rs-232-c-0x22151511.json} (100%) rename tests/data/devices/{innr-sp-120.json => innr-sp-120-0x11040002.json} (100%) rename tests/data/devices/{innr-sp-234.json => innr-sp-234-0x31016610.json} (100%) mode change 100755 => 100644 rename tests/data/devices/{innr-sp-240.json => innr-sp-240-0x191e3685.json} (100%) rename tests/data/devices/{innr-sp-242.json => innr-sp-242-0x17173685.json} (100%) rename tests/data/devices/{inovelli-vzm30-sn.json => inovelli-vzm30-sn-0x01100100.json} (100%) rename tests/data/devices/{inovelli-vzm31-sn.json => inovelli-vzm31-sn-0x01020212.json} (100%) rename tests/data/devices/{inovelli-vzm35-sn.json => inovelli-vzm35-sn-0x02020107.json} (100%) rename tests/data/devices/{jasco-products-45856.json => jasco-products-45856-0x00000006.json} (100%) rename tests/data/devices/{jasco-products-45857.json => jasco-products-45857-0x00000006.json} (100%) rename tests/data/devices/{ke-tradfri-open-close-remote.json => ke-tradfri-open-close-remote-0x22010631.json} (100%) rename tests/data/devices/{keen-home-inc-sv01-410-mp-1-1.json => keen-home-inc-sv01-410-mp-1-1-0x10235121.json} (100%) rename tests/data/devices/{king-of-fans-inc-hbuniversalcfremote.json => king-of-fans-inc-hbuniversalcfremote-0x0000000f.json} (100%) rename tests/data/devices/{king-of-fans-inc-hdc52eastwindfan.json => king-of-fans-inc-hdc52eastwindfan-0x0000000f.json} (100%) mode change 100755 => 100644 tests/data/devices/konke-3afe28010402000d.json rename tests/data/devices/{kwikset-smartcode-convert-gen1.json => kwikset-smartcode-convert-gen1-0x30a07a06.json} (100%) rename tests/data/devices/{lds-zb-onoffplug-d0005.json => lds-zb-onoffplug-d0005-0x21186230.json} (100%) rename tests/data/devices/{lds-zbt-cctswitch-d0001.json => lds-zbt-cctswitch-d0001-0x21000006.json} (100%) rename tests/data/devices/{ledvance-a60s-rgbw.json => ledvance-a60s-rgbw-0x02146550.json} (100%) rename tests/data/devices/{ledvance-flex-rgbw.json => ledvance-flex-rgbw-0x00102428.json} (100%) mode change 100755 => 100644 rename tests/data/devices/{ledvance-outdoor-accent-light-rgb.json => ledvance-outdoor-accent-light-rgb-0x00102428.json} (100%) rename tests/data/devices/{ledvance-plug.json => ledvance-plug-0x00102101.json} (100%) rename tests/data/devices/{legrand-dimmer-switch-w-o-neutral.json => legrand-dimmer-switch-w-o-neutral-0x004d45ff.json} (100%) rename tests/data/devices/{legrand-light-switch-with-neutral.json => legrand-light-switch-with-neutral-0x001c4203.json} (100%) rename tests/data/devices/{legrand-mobile-outlet.json => legrand-mobile-outlet-0x006545ff.json} (100%) rename tests/data/devices/{level-home-b2.json => level-home-b2-0x0300001a.json} (100%) rename tests/data/devices/{level-home-bolt.json => level-home-bolt-0x03020006.json} (100%) rename tests/data/devices/{lixee-zlinky-tic.json => lixee-zlinky-tic-0x00000011.json} (100%) mode change 100755 => 100644 tests/data/devices/lk-zb-doorsensor-d0003.json rename tests/data/devices/{lk-zbt-dimswitch-d0001.json => lk-zbt-dimswitch-d0001-0x22166500.json} (100%) rename tests/data/devices/{lk-zbt-onoffplug-d0001.json => lk-zbt-onoffplug-d0001-0x22036610.json} (100%) rename tests/data/devices/{lumi-lumi-airrtc-agl001.json => lumi-lumi-airrtc-agl001-0x0000001e.json} (100%) rename tests/data/devices/{lumi-lumi-curtain-acn002.json => lumi-lumi-curtain-acn002-0x00000e1f.json} (100%) rename tests/data/devices/{lumi-lumi-curtain-agl001.json => lumi-lumi-curtain-agl001-0x00000018.json} (100%) rename tests/data/devices/{lumi-lumi-flood-acn001.json => lumi-lumi-flood-acn001-0x00000004.json} (100%) rename tests/data/devices/{lumi-lumi-flood-agl02.json => lumi-lumi-flood-agl02-0x00000020.json} (100%) rename tests/data/devices/{lumi-lumi-light-aqcn02.json => lumi-lumi-light-aqcn02-0x00000017.json} (100%) rename tests/data/devices/{lumi-lumi-magnet-acn001.json => lumi-lumi-magnet-acn001-0x00000004.json} (100%) rename tests/data/devices/{lumi-lumi-magnet-agl02.json => lumi-lumi-magnet-agl02-0x0000001e.json} (100%) mode change 100755 => 100644 tests/data/devices/lumi-lumi-motion-ac02.json rename tests/data/devices/{lumi-lumi-motion-agl04.json => lumi-lumi-motion-agl04-0x00000019.json} (100%) rename tests/data/devices/{lumi-lumi-plug-maus01.json => lumi-lumi-plug-maus01-0x0000000b.json} (100%) rename tests/data/devices/{lumi-lumi-relay-c2acn01.json => lumi-lumi-relay-c2acn01-0x00000024.json} (100%) mode change 100755 => 100644 tests/data/devices/lumi-lumi-remote-b486opcn01.json rename tests/data/devices/{lumi-lumi-sensor-smoke-acn03.json => lumi-lumi-sensor-smoke-acn03-0x00000011.json} (100%) rename tests/data/devices/{lumi-lumi-switch-b1laus01.json => lumi-lumi-switch-b1laus01-0x00000020.json} (100%) mode change 100755 => 100644 rename tests/data/devices/{lumi-lumi-switch-b1naus01.json => lumi-lumi-switch-b1naus01-0x0000001f.json} (100%) mode change 100755 => 100644 rename tests/data/devices/{lumi-lumi-switch-l1aeu1.json => lumi-lumi-switch-l1aeu1-0x00000e0b.json} (100%) rename tests/data/devices/{lumi-lumi-switch-l2aeu1.json => lumi-lumi-switch-l2aeu1-0x00000e0b.json} (100%) rename tests/data/devices/{lumi-lumi-switch-n0agl1.json => lumi-lumi-switch-n0agl1-0x0000001e.json} (100%) rename tests/data/devices/{lumi-lumi-vibration-agl01.json => lumi-lumi-vibration-agl01-0x0000001c.json} (100%) mode change 100755 => 100644 tests/data/devices/lumi-lumi-weather.json rename tests/data/devices/{lutron-z3-1brl.json => lutron-z3-1brl-0x00000c08.json} (100%) rename tests/data/devices/{mli-tint-extendedcolor.json => mli-tint-extendedcolor-0x10012001.json} (100%) rename tests/data/devices/{mli-zbt-remote-all-rgbw.json => mli-zbt-remote-all-rgbw-0x11010022.json} (100%) rename tests/data/devices/{namron-as-4512785.json => namron-as-4512785-0x0000000e.json} (100%) rename tests/data/devices/{niko-nv-battery-switch-4-button.json => niko-nv-battery-switch-4-button-0x21046760.json} (100%) rename tests/data/devices/{niko-nv-connectable-motor-control-3a.json => niko-nv-connectable-motor-control-3a-0x21160006.json} (100%) rename tests/data/devices/{nodon-sin-4-rs-20.json => nodon-sin-4-rs-20-0x00010300.json} (100%) rename tests/data/devices/{osram-switch-4x-lightify.json => osram-switch-4x-lightify-0x01000000.json} (100%) rename tests/data/devices/{philips-7602031u7.json => philips-7602031u7-0x01001d00.json} (100%) rename tests/data/devices/{philips-915005988601.json => philips-915005988601-0x01002000.json} (100%) rename tests/data/devices/{philips-lct014.json => philips-lct014-0x01001a02.json} (100%) rename tests/data/devices/{philips-llc020.json => philips-llc020-0x42006734.json} (100%) rename tests/data/devices/{philips-lst002.json => philips-lst002-0x01001700.json} (100%) rename tests/data/devices/{philips-rom001.json => philips-rom001-0x02002f08.json} (100%) rename tests/data/devices/{philips-rwl021.json => philips-rwl021-0x43007305.json} (100%) rename tests/data/devices/{philips-sml001.json => philips-sml001-0x42006bb7.json} (100%) rename tests/data/devices/{plaid-systems-ps-sprzms-slp3.json => plaid-systems-ps-sprzms-slp3-0x00000001.json} (100%) rename tests/data/devices/{samjin-button.json => samjin-button-0x00000011.json} (100%) rename tests/data/devices/{samjin-multi.json => samjin-multi-0x0000000b.json} (100%) rename tests/data/devices/{schneider-electric-eko07259.json => schneider-electric-eko07259-0x01001d00.json} (100%) rename tests/data/devices/{schneider-electric-evsckt-outlet-1.json => schneider-electric-evsckt-outlet-1-0x020a00ff.json} (100%) rename tests/data/devices/{schneider-electric-nhmotion-unidim-1.json => schneider-electric-nhmotion-unidim-1-0x020b0fff.json} (100%) rename tests/data/devices/{schneider-electric-puck-shutter-1.json => schneider-electric-puck-shutter-1-0x020c02ff.json} (100%) rename tests/data/devices/{schneider-electric-s520619.json => schneider-electric-s520619-0x01003500.json} (100%) rename tests/data/devices/{schneider-electric-socket-outlet-1.json => schneider-electric-socket-outlet-1-0x020612ff.json} (100%) rename tests/data/devices/{schneider-electric-socket-outlet-2.json => schneider-electric-socket-outlet-2-0x020612ff.json} (100%) rename tests/data/devices/{sengled-e11-g13.json => sengled-e11-g13-0x00000009.json} (100%) rename tests/data/devices/{sengled-e12-n14.json => sengled-e12-n14-0x00000004.json} (100%) rename tests/data/devices/{sengled-e12-n1e.json => sengled-e12-n1e-0x0000001e.json} (100%) rename tests/data/devices/{sengled-e1c-nb7.json => sengled-e1c-nb7-0x0000001a.json} (100%) rename tests/data/devices/{sengled-e1f-n9g.json => sengled-e1f-n9g-0x00000020.json} (100%) rename tests/data/devices/{sengled-e1g-g8e.json => sengled-e1g-g8e-0x0000000e.json} (100%) mode change 100755 => 100644 rename tests/data/devices/{sengled-e21-n1ea.json => sengled-e21-n1ea-0x00000026.json} (100%) rename tests/data/devices/{sengled-z01-a19nae26.json => sengled-z01-a19nae26-0x00000020.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-lca001.json => signify-netherlands-b-v-lca001-0x01002802.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-lca005.json => signify-netherlands-b-v-lca005-0x01002402.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-lca007.json => signify-netherlands-b-v-lca007-0x01001f0a.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-lcb001.json => signify-netherlands-b-v-lcb001-0x01002800.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-lcb002.json => signify-netherlands-b-v-lcb002-0x01001f0a.json} (100%) mode change 100755 => 100644 rename tests/data/devices/{signify-netherlands-b-v-lce001.json => signify-netherlands-b-v-lce001-0x01002404.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-lcg006.json => signify-netherlands-b-v-lcg006-0x01002502.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-lcx004.json => signify-netherlands-b-v-lcx004-0x01001802.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-lta010.json => signify-netherlands-b-v-lta010-0x01002402.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-ltb003.json => signify-netherlands-b-v-ltb003-0x01001f0a.json} (100%) mode change 100755 => 100644 rename tests/data/devices/{signify-netherlands-b-v-lwa003.json => signify-netherlands-b-v-lwa003-0x01001f0a.json} (100%) mode change 100755 => 100644 rename tests/data/devices/{signify-netherlands-b-v-rdm001.json => signify-netherlands-b-v-rdm001-0x0000041a.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-rdm002.json => signify-netherlands-b-v-rdm002-0x02003b19.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-rdm005.json => signify-netherlands-b-v-rdm005-0x02005301.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-rwl022.json => signify-netherlands-b-v-rwl022-0x02002d02.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-sml003.json => signify-netherlands-b-v-sml003-0x02003506.json} (100%) rename tests/data/devices/{signify-netherlands-b-v-sml004.json => signify-netherlands-b-v-sml004-0x02003506.json} (100%) rename tests/data/devices/{smartthings-multiv4.json => smartthings-multiv4-0x0000001b.json} (100%) rename tests/data/devices/{smartthings-tagv4.json => smartthings-tagv4-0x00000019.json} (100%) rename tests/data/devices/{smartwings-wm25-l-z.json => smartwings-wm25-l-z-0x00000002.json} (100%) rename tests/data/devices/{somfy-situo-4-zigbee.json => somfy-situo-4-zigbee-0x00011a00.json} (100%) rename tests/data/devices/{somfy-sonesse-28-wf-li-ion-roller.json => somfy-sonesse-28-wf-li-ion-roller-0x4100e158.json} (100%) rename tests/data/devices/{somfy-ysia-5-hp-zigbee.json => somfy-ysia-5-hp-zigbee-0x00e00041.json} (100%) rename tests/data/devices/{sonoff-mini-zbdim.json => sonoff-mini-zbdim-0x00001005.json} (100%) rename tests/data/devices/{sonoff-mini-zbrbs.json => sonoff-mini-zbrbs-0x00001005.json} (100%) rename tests/data/devices/{sonoff-s26r2zb.json => sonoff-s26r2zb-0x00002000.json} (100%) rename tests/data/devices/{sonoff-s60zbtpg.json => sonoff-s60zbtpg-0x00001002.json} (100%) rename tests/data/devices/{sonoff-snzb-01m.json => sonoff-snzb-01m-0x00001005.json} (100%) rename tests/data/devices/{sonoff-snzb-02d.json => sonoff-snzb-02d-0x00002300.json} (100%) rename tests/data/devices/{sonoff-snzb-04pr2.json => sonoff-snzb-04pr2-0x00001001.json} (100%) rename tests/data/devices/{sonoff-snzb-05p.json => sonoff-snzb-05p-0x00001002.json} (100%) rename tests/data/devices/{sonoff-snzb-06p.json => sonoff-snzb-06p-0x00001006.json} (100%) rename tests/data/devices/{sonoff-swv.json => sonoff-swv-0x00001002.json} (100%) rename tests/data/devices/{sonoff-trvzb.json => sonoff-trvzb-0x00001201.json} (100%) rename tests/data/devices/{sonoff-zbmicro.json => sonoff-zbmicro-0x00001005.json} (100%) rename tests/data/devices/{sonoff-zbminil2.json => sonoff-zbminil2-0x0000100e.json} (100%) rename tests/data/devices/{sonoff-zbminir2.json => sonoff-zbminir2-0x00001004.json} (100%) rename tests/data/devices/{sunricher-hk-dim.json => sunricher-hk-dim-0x00000036.json} (100%) rename tests/data/devices/{sunricher-hk-ln-dim-a.json => sunricher-hk-ln-dim-a-0x00000039.json} (100%) rename tests/data/devices/{sunricher-on-off-2ch.json => sunricher-on-off-2ch-0x00000004.json} (100%) rename tests/data/devices/{the-home-depot-ecosmart-zbt-a19-cct-bulb.json => the-home-depot-ecosmart-zbt-a19-cct-bulb-0x21036500.json} (100%) rename tests/data/devices/{third-reality-inc-3rap0149bz.json => third-reality-inc-3rap0149bz-0x0000000e.json} (100%) rename tests/data/devices/{third-reality-inc-3rms16bz.json => third-reality-inc-3rms16bz-0x0000004f.json} (100%) rename tests/data/devices/{third-reality-inc-3rsb015bz.json => third-reality-inc-3rsb015bz-0x00000048.json} (100%) rename tests/data/devices/{third-reality-inc-3rsm0147z.json => third-reality-inc-3rsm0147z-0x0000001f.json} (100%) rename tests/data/devices/{third-reality-inc-3rsnl02043z.json => third-reality-inc-3rsnl02043z-0x0000003c.json} (100%) rename tests/data/devices/{third-reality-inc-3rsp019bz.json => third-reality-inc-3rsp019bz-0x1001301e.json} (100%) rename tests/data/devices/{third-reality-inc-3rsp02028bz.json => third-reality-inc-3rsp02028bz-0x10013058.json} (100%) rename tests/data/devices/{third-reality-inc-3rsp02064z.json => third-reality-inc-3rsp02064z-0x0000002f.json} (100%) rename tests/data/devices/{third-reality-inc-3rss009z.json => third-reality-inc-3rss009z-0x0000001d.json} (100%) rename tests/data/devices/{third-reality-inc-3rths24bz.json => third-reality-inc-3rths24bz-0x00000015.json} (100%) rename tests/data/devices/{third-reality-inc-3rvs01031z.json => third-reality-inc-3rvs01031z-0x00000028.json} (100%) rename tests/data/devices/{third-reality-inc-3rws18bz.json => third-reality-inc-3rws18bz-0x00000038.json} (100%) rename tests/data/devices/{tyst11-i5j6ifxj-5j6ifxj.json => tyst11-i5j6ifxj-5j6ifxj-0x00000049.json} (100%) rename tests/data/devices/{tyzb01-o63ssaah-ts0207.json => tyzb01-o63ssaah-ts0207-0x00000043.json} (100%) rename tests/data/devices/{tyzb01-qm6djpta-ts0215.json => tyzb01-qm6djpta-ts0215-0x00000046.json} (100%) rename tests/data/devices/{tyzb01-rifa0wlb-ts0011.json => tyzb01-rifa0wlb-ts0011-0x00000041.json} (100%) mode change 100755 => 100644 rename tests/data/devices/{tz3000-1dd0d5yi-ts130f.json => tz3000-1dd0d5yi-ts130f-0x00000047.json} (100%) rename tests/data/devices/{tz3000-1o6x1bl0-ts0201.json => tz3000-1o6x1bl0-ts0201-0x00000041.json} (100%) rename tests/data/devices/{tz3000-3ias4w4o-ts011f.json => tz3000-3ias4w4o-ts011f-0x0000004e.json} (100%) rename tests/data/devices/{tz3000-8nkb7mof-ts0121.json => tz3000-8nkb7mof-ts0121-0x00000042.json} (100%) rename tests/data/devices/{tz3000-bgsigers-ts0201.json => tz3000-bgsigers-ts0201-0x00000040.json} (100%) rename tests/data/devices/{tz3000-bguser20-ts0201.json => tz3000-bguser20-ts0201-0x00000045.json} (100%) rename tests/data/devices/{tz3000-cehuw1lw-ts011f.json => tz3000-cehuw1lw-ts011f-0x0000004d.json} (100%) rename tests/data/devices/{tz3000-cicwjqth-ts011f.json => tz3000-cicwjqth-ts011f-0x74013001.json} (100%) rename tests/data/devices/{tz3000-drc9tuqb-ts0001.json => tz3000-drc9tuqb-ts0001-0x00000047.json} (100%) rename tests/data/devices/{tz3000-eamtuojw-ts0201.json => tz3000-eamtuojw-ts0201-0x00000041.json} (100%) rename tests/data/devices/{tz3000-f2bw0b6k-ts0201.json => tz3000-f2bw0b6k-ts0201-0x00000046.json} (100%) rename tests/data/devices/{tz3000-famkxci2-ts0043.json => tz3000-famkxci2-ts0043-0x00000044.json} (100%) rename tests/data/devices/{tz3000-gbm10jnj-ts0043.json => tz3000-gbm10jnj-ts0043-0x00000042.json} (100%) rename tests/data/devices/{tz3000-gjpgagal-ts0049.json => tz3000-gjpgagal-ts0049-0x00000049.json} (100%) rename tests/data/devices/{tz3000-hafsqare-ts0011.json => tz3000-hafsqare-ts0011-0x00000050.json} (100%) rename tests/data/devices/{tz3000-idhkkbqj-ts0012.json => tz3000-idhkkbqj-ts0012-0x00000041.json} (100%) rename tests/data/devices/{tz3000-isw9u95y-ts0201.json => tz3000-isw9u95y-ts0201-0x00000040.json} (100%) rename tests/data/devices/{tz3000-itnrsufe-ts0201.json => tz3000-itnrsufe-ts0201-0x00000042.json} (100%) rename tests/data/devices/{tz3000-j1xl73iw-ts130f.json => tz3000-j1xl73iw-ts130f-0x00000046.json} (100%) rename tests/data/devices/{tz3000-ja5osu5g-ts004f.json => tz3000-ja5osu5g-ts004f-0x00000041.json} (100%) rename tests/data/devices/{tz3000-kqvb5akv-ts0001.json => tz3000-kqvb5akv-ts0001-0x0000004a.json} (100%) rename tests/data/devices/{tz3000-mgusv51k-ts0052.json => tz3000-mgusv51k-ts0052-0x00000044.json} (100%) rename tests/data/devices/{tz3000-mkhkxx1p-ts0001.json => tz3000-mkhkxx1p-ts0001-0x00000048.json} (100%) rename tests/data/devices/{tz3000-mugyhz0q-ts0207.json => tz3000-mugyhz0q-ts0207-0x00000041.json} (100%) rename tests/data/devices/{tz3000-mw1pqqqt-ts0003.json => tz3000-mw1pqqqt-ts0003-0x0000004a.json} (100%) rename tests/data/devices/{tz3000-o1jzcxou-ts011f.json => tz3000-o1jzcxou-ts011f-0x00000043.json} (100%) rename tests/data/devices/{tz3000-o4mkahkc-ts0202.json => tz3000-o4mkahkc-ts0202-0x00000046.json} (100%) rename tests/data/devices/{tz3000-p26flek3-ts0001.json => tz3000-p26flek3-ts0001-0x00000053.json} (100%) rename tests/data/devices/{tz3000-pl5v1yyy-ts011f.json => tz3000-pl5v1yyy-ts011f-0x00000050.json} (100%) rename tests/data/devices/{tz3000-qdnrzbd3-ts0202.json => tz3000-qdnrzbd3-ts0202-0x00000046.json} (100%) rename tests/data/devices/{tz3000-sgb0xhwn-ts011f.json => tz3000-sgb0xhwn-ts011f-0x00000050.json} (100%) rename tests/data/devices/{tz3000-tqlv4ug4-ts0001.json => tz3000-tqlv4ug4-ts0001-0x00000048.json} (100%) rename tests/data/devices/{tz3000-typdpbpg-ts011f.json => tz3000-typdpbpg-ts011f-0x10013607.json} (100%) rename tests/data/devices/{tz3000-u3oupgdy-ts0004.json => tz3000-u3oupgdy-ts0004-0x00000050.json} (100%) rename tests/data/devices/{tz3000-u4kojtqz-ts0002.json => tz3000-u4kojtqz-ts0002-0x10013607.json} (100%) rename tests/data/devices/{tz3000-uwkja6z1-ts011f.json => tz3000-uwkja6z1-ts011f-0x00000045.json} (100%) rename tests/data/devices/{tz3000-vw8pawxa-ts130f.json => tz3000-vw8pawxa-ts130f-0x00000048.json} (100%) rename tests/data/devices/{tz3000-wcgyhnp3-ts0222.json => tz3000-wcgyhnp3-ts0222-0x00000045.json} (100%) rename tests/data/devices/{tz3000-wn65ixz9-ts0001.json => tz3000-wn65ixz9-ts0001-0x00000051.json} (100%) rename tests/data/devices/{tz3000-yj6k7vfo-ts0041.json => tz3000-yj6k7vfo-ts0041-0x00000044.json} (100%) rename tests/data/devices/{tz3000-zl1kmjqx.json => tz3000-zl1kmjqx-0x10013001.json} (100%) rename tests/data/devices/{tz3000-zw7yf6yk-ts0001.json => tz3000-zw7yf6yk-ts0001-0x00000048.json} (100%) rename tests/data/devices/{tz3002-vaq2bfcu-ts0726.json => tz3002-vaq2bfcu-ts0726-0x00000051.json} (100%) rename tests/data/devices/{tz3002-zjuvw9zf-ts0726.json => tz3002-zjuvw9zf-ts0726-0x00000055.json} (100%) rename tests/data/devices/{tz3040-bb6xaihh-ts0202.json => tz3040-bb6xaihh-ts0202-0x00000048.json} (100%) rename tests/data/devices/{tz3210-09hzmirw-ts0502b.json => tz3210-09hzmirw-ts0502b-0x0000005b.json} (100%) rename tests/data/devices/{tz3210-3mpwqzuu-ts110e.json => tz3210-3mpwqzuu-ts110e-0x00000040.json} (100%) rename tests/data/devices/{tz3210-7vgttna6-ts0001.json => tz3210-7vgttna6-ts0001-0x00000073.json} (100%) rename tests/data/devices/{tz3210-a04acm9s-ts0001.json => tz3210-a04acm9s-ts0001-0x00000077.json} (100%) rename tests/data/devices/{tz3210-comkuwws-ts0502b.json => tz3210-comkuwws-ts0502b-0x00000065.json} (100%) rename tests/data/devices/{tz3210-dwytrmda-ts130f.json => tz3210-dwytrmda-ts130f-0x00000042.json} (100%) rename tests/data/devices/{tz3210-ehcanwyc-ts0502b.json => tz3210-ehcanwyc-ts0502b-0x00000065.json} (100%) rename tests/data/devices/{tz3210-j4pdtz9v-ts0001.json => tz3210-j4pdtz9v-ts0001-0x00000062.json} (100%) rename tests/data/devices/{tz3210-jaap6jeb-ts0505b.json => tz3210-jaap6jeb-ts0505b-0x00000065.json} (100%) rename tests/data/devices/{tz3210-jtifm80b-ts0502b.json => tz3210-jtifm80b-ts0502b-0x00000065.json} (100%) rename tests/data/devices/{tz3210-k1msuvg6-ts110e.json => tz3210-k1msuvg6-ts110e-0x00000040.json} (100%) rename tests/data/devices/{tz3210-kjafhwd2-ts0210.json => tz3210-kjafhwd2-ts0210-0x00000044.json} (100%) rename tests/data/devices/{tz3210-klv2wul0-ts0505b.json => tz3210-klv2wul0-ts0505b-0x00000065.json} (100%) rename tests/data/devices/{tz3210-ncw88jfq-ts0201.json => tz3210-ncw88jfq-ts0201-0x00000083.json} (100%) rename tests/data/devices/{tz3210-qkj7rujp-ts0201.json => tz3210-qkj7rujp-ts0201-0x00000043.json} (100%) rename tests/data/devices/{tz3210-r5afgmkl-ts0505b.json => tz3210-r5afgmkl-ts0505b-0x10013607.json} (100%) rename tests/data/devices/{tz3210-ru41azca-ts0049.json => tz3210-ru41azca-ts0049-0x00000040.json} (100%) rename tests/data/devices/{tz3210-sb8x2xci-ts0001.json => tz3210-sb8x2xci-ts0001-0x00000047.json} (100%) rename tests/data/devices/{tz3210-tgvtvdoc-ts0207.json => tz3210-tgvtvdoc-ts0207-0x00000043.json} (100%) rename tests/data/devices/{tz3210-u1dreag7-ts0502b.json => tz3210-u1dreag7-ts0502b-0x00000065.json} (100%) rename tests/data/devices/{tz3210-ue9kyjnj-ts0502b.json => tz3210-ue9kyjnj-ts0502b-0x00000059.json} (100%) rename tests/data/devices/{tz3210-wuhzzfqg-ts0202.json => tz3210-wuhzzfqg-ts0202-0x000000a1.json} (100%) rename tests/data/devices/{tz3210-zdrhqmo0-ts0502b.json => tz3210-zdrhqmo0-ts0502b-0x00000064.json} (100%) rename tests/data/devices/{tz3218-7fiyo3kv-ts000f.json => tz3218-7fiyo3kv-ts000f-0x00000051.json} (100%) rename tests/data/devices/{tz3218-t9ynfz4x-ts0225.json => tz3218-t9ynfz4x-ts0225-0x00000045.json} (100%) rename tests/data/devices/{tz3218-ya5d6wth-ts000f.json => tz3218-ya5d6wth-ts000f-0x00000064.json} (100%) rename tests/data/devices/{tz3290-ot6ewjvmejq5ekhl-ts1201.json => tz3290-ot6ewjvmejq5ekhl-ts1201-0x00000043.json} (100%) rename tests/data/devices/{tz6210-duv6fhwt-ts0601.json => tz6210-duv6fhwt-ts0601-0x00000042.json} (100%) rename tests/data/devices/{tzb210-417ikxay-ts0505b.json => tzb210-417ikxay-ts0505b-0x00000040.json} (100%) rename tests/data/devices/{tzb210-lmqquxus-ts0502b.json => tzb210-lmqquxus-ts0502b-0x00000040.json} (100%) rename tests/data/devices/{tzb210-rawkvnnm-ts0502b.json => tzb210-rawkvnnm-ts0502b-0x00000040.json} (100%) rename tests/data/devices/{tze200-2se8efxh-ts0601.json => tze200-2se8efxh-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-3t91nb6k-ts0601.json => tze200-3t91nb6k-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-3towulqd-ts0601.json => tze200-3towulqd-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-4utwozi2-ts0601.json => tze200-4utwozi2-ts0601-0x00000043.json} (100%) rename tests/data/devices/{tze200-579lguh2-ts0601.json => tze200-579lguh2-ts0601-0x00000044.json} (100%) rename tests/data/devices/{tze200-7bztmfm1-ts0601.json => tze200-7bztmfm1-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-7iqgciln-ts0601.json => tze200-7iqgciln-ts0601-0x00000041.json} (100%) rename tests/data/devices/{tze200-7ytb3h8u-ts0601.json => tze200-7ytb3h8u-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-81isopgh-ts0601.json => tze200-81isopgh-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-8whfphjv-ts0601.json => tze200-8whfphjv-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-9caxna4s-ts0301.json => tze200-9caxna4s-ts0301-0x00000049.json} (100%) rename tests/data/devices/{tze200-9xfjixap-ts0601.json => tze200-9xfjixap-ts0601-0x00000043.json} (100%) rename tests/data/devices/{tze200-a7sghmms-ts0601.json => tze200-a7sghmms-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-abatw3kj-ts0601.json => tze200-abatw3kj-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-b6wax7g0-ts0601.json => tze200-b6wax7g0-ts0601-0x00000043.json} (100%) rename tests/data/devices/{tze200-bkkmqmyo-ts0601.json => tze200-bkkmqmyo-ts0601-0x00000041.json} (100%) rename tests/data/devices/{tze200-c88teujp-ts0601.json => tze200-c88teujp-ts0601-0x00000055.json} (100%) rename tests/data/devices/{tze200-cirvgep4-ts0601.json => tze200-cirvgep4-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-g9a3awaj-ts0601.json => tze200-g9a3awaj-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-gjldowol-ts0601.json => tze200-gjldowol-ts0601-0x00000050.json} (100%) rename tests/data/devices/{tze200-guvc7pdy-ts0601.json => tze200-guvc7pdy-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-hhrtiq0x-ts0601.json => tze200-hhrtiq0x-ts0601-0x00000055.json} (100%) rename tests/data/devices/{tze200-hr0tdd47-ts0601.json => tze200-hr0tdd47-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-js3mgbjb-ts0601.json => tze200-js3mgbjb-ts0601-0x00000044.json} (100%) rename tests/data/devices/{tze200-jwsjbxjs-ts0601.json => tze200-jwsjbxjs-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-locansqn-ts0601.json => tze200-locansqn-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-mgxy2d9f-ts0601.json => tze200-mgxy2d9f-ts0601-0x00000043.json} (100%) rename tests/data/devices/{tze200-moycceze-ts0601.json => tze200-moycceze-ts0601-0x00000043.json} (100%) rename tests/data/devices/{tze200-mudxchsu-ts0601.json => tze200-mudxchsu-ts0601-0x00000045.json} (100%) rename tests/data/devices/{tze200-myd45weu-ts0601.json => tze200-myd45weu-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-nqaqq4cf-ts0601.json => tze200-nqaqq4cf-ts0601-0x00000044.json} (100%) rename tests/data/devices/{tze200-pl31aqf5-ts0601.json => tze200-pl31aqf5-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-qyflbnbj-ts0601.json => tze200-qyflbnbj-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-r32ctezx-ts0601.json => tze200-r32ctezx-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-r5ksy7qo-ts0601.json => tze200-r5ksy7qo-ts0601-0x00000043.json} (100%) rename tests/data/devices/{tze200-rmymn92d-ts0601.json => tze200-rmymn92d-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-sur6q7ko-ts0601.json => tze200-sur6q7ko-ts0601-0x00000045.json} (100%) rename tests/data/devices/{tze200-uf1qujxj-ts0601.json => tze200-uf1qujxj-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-vvmbj46n-ts0601.json => tze200-vvmbj46n-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze200-wdfurkoa-ts0601.json => tze200-wdfurkoa-ts0601-0x00000041.json} (100%) rename tests/data/devices/{tze200-wfxuhoea-ts0601.json => tze200-wfxuhoea-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-yia0p3tr-ts0601.json => tze200-yia0p3tr-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze200-yw7cahqs-ts0601.json => tze200-yw7cahqs-ts0601-0x00000055.json} (100%) rename tests/data/devices/{tze204-1v1dxkck-ts0601.json => tze204-1v1dxkck-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-1youk3hj-ts0601.json => tze204-1youk3hj-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-4fblxpma-ts0601.json => tze204-4fblxpma-ts0601-0x00000049.json} (100%) rename tests/data/devices/{tze204-58of2pfn-ts0601.json => tze204-58of2pfn-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-5slehgeo-ts0601.json => tze204-5slehgeo-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-81yrt3lo-ts0601.json => tze204-81yrt3lo-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-a2jcoyuk-ts0601.json => tze204-a2jcoyuk-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-ai4rqhky-ts0601.json => tze204-ai4rqhky-ts0601-0x00000049.json} (100%) rename tests/data/devices/{tze204-aoclfnxz-ts0601.json => tze204-aoclfnxz-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-c2fmom5z-ts0601.json => tze204-c2fmom5z-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-cirvgep4-ts0601.json => tze204-cirvgep4-ts0601-0x00000049.json} (100%) rename tests/data/devices/{tze204-d6i25bwg-ts0601.json => tze204-d6i25bwg-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-dwcarsat-ts0601.json => tze204-dwcarsat-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-eekpf0ft-ts0601.json => tze204-eekpf0ft-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-ex3rcdha-ts0601.json => tze204-ex3rcdha-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-fhvdgeuh-ts0601.json => tze204-fhvdgeuh-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-goecjd1t-ts0601.json => tze204-goecjd1t-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-gops3slb-ts0601.json => tze204-gops3slb-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-guvc7pdy-ts0601.json => tze204-guvc7pdy-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-iaeejhvf-ts0601.json => tze204-iaeejhvf-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-jrcfsaa3-ts0601.json => tze204-jrcfsaa3-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-lb0fsvba-ts0601.json => tze204-lb0fsvba-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-lbbg34rj-ts0601.json => tze204-lbbg34rj-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-lpedvtvr-ts0601.json => tze204-lpedvtvr-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-lsanae15-ts0601.json => tze204-lsanae15-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-ltwbm23f-ts0601.json => tze204-ltwbm23f-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-m64smti7-ts0601.json => tze204-m64smti7-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-m9dzckna-ts0601.json => tze204-m9dzckna-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-mtoaryre-ts0601.json => tze204-mtoaryre-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-mwomyz5n-ts0601.json => tze204-mwomyz5n-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-nbkshs6k-ts0601.json => tze204-nbkshs6k-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-nklqjk62-ts0601.json => tze204-nklqjk62-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-nlrfgpny-ts0601.json => tze204-nlrfgpny-ts0601-0x00000049.json} (100%) rename tests/data/devices/{tze204-nqqylykc-ts0601.json => tze204-nqqylykc-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-nvxorhcj-ts0601.json => tze204-nvxorhcj-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-ogx8u5z6-ts0601.json => tze204-ogx8u5z6-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-pcdmj88b-ts0601.json => tze204-pcdmj88b-ts0601-0x00000049.json} (100%) rename tests/data/devices/{tze204-pxbjch8m-ts0601.json => tze204-pxbjch8m-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-qasjif9e-ts0601.json => tze204-qasjif9e-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-qtnjuoae-ts0601.json => tze204-qtnjuoae-ts0601-0x00000049.json} (100%) rename tests/data/devices/{tze204-qvxrkeif-ts0601.json => tze204-qvxrkeif-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-qyr2m29i-ts0601.json => tze204-qyr2m29i-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-r32ctezx-ts0601.json => tze204-r32ctezx-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-rtrmfadk-ts0601.json => tze204-rtrmfadk-ts0601-0x00000049.json} (100%) rename tests/data/devices/{tze204-tagezcph-ts0601.json => tze204-tagezcph-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-tdhnhhiy-ts0601.json => tze204-tdhnhhiy-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-uxllnywp-ts0601.json => tze204-uxllnywp-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-vjpaih9f-ts0601.json => tze204-vjpaih9f-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-w1wwxoja-ts0601.json => tze204-w1wwxoja-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-wbhaespm-ts0601.json => tze204-wbhaespm-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-x8fp01wi-ts0601.json => tze204-x8fp01wi-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-x9usygq1-ts0601.json => tze204-x9usygq1-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-xalsoe3m-ts0601.json => tze204-xalsoe3m-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-xlppj4f5-ts0601.json => tze204-xlppj4f5-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-xnbkhhdr-ts0601.json => tze204-xnbkhhdr-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-xu4a5rhj-ts0601.json => tze204-xu4a5rhj-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-ya4ft0w4-ts0601.json => tze204-ya4ft0w4-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-yvx5lh6k-ts0601.json => tze204-yvx5lh6k-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze204-ztqnh5cg-ts0601.json => tze204-ztqnh5cg-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze20c-xbexmf8h-ts130f.json => tze20c-xbexmf8h-ts130f-0x00000040.json} (100%) rename tests/data/devices/{tze20c-zka46xbw-ts0601.json => tze20c-zka46xbw-ts0601-0x00000051.json} (100%) rename tests/data/devices/{tze284-2gi1hy8s-ts0601.json => tze284-2gi1hy8s-ts0601-0x00000050.json} (100%) rename tests/data/devices/{tze284-3mzb0sdz-ts0601.json => tze284-3mzb0sdz-ts0601-0x00000050.json} (100%) rename tests/data/devices/{tze284-6hrnp30w-ts0601.json => tze284-6hrnp30w-ts0601-0x00000050.json} (100%) rename tests/data/devices/{tze284-6ycgarab-ts0601.json => tze284-6ycgarab-ts0601-0x00000050.json} (100%) rename tests/data/devices/{tze284-78ioiaml-ts0601.json => tze284-78ioiaml-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze284-7gy9mqca-ts0601.json => tze284-7gy9mqca-ts0601-0x0000004e.json} (100%) rename tests/data/devices/{tze284-7zazvlyn-ts0601.json => tze284-7zazvlyn-ts0601-0x00000045.json} (100%) rename tests/data/devices/{tze284-81yrt3lo-ts0601.json => tze284-81yrt3lo-ts0601-0x0000004e.json} (100%) rename tests/data/devices/{tze284-8b9zpaav-ts0601.json => tze284-8b9zpaav-ts0601-0x0000004e.json} (100%) rename tests/data/devices/{tze284-8se38w3c-ts0601.json => tze284-8se38w3c-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-a2xewxoo-ts0601.json => tze284-a2xewxoo-ts0601-0x0000004e.json} (100%) rename tests/data/devices/{tze284-c6wv4xyo-ts0601.json => tze284-c6wv4xyo-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-dmckrsxg-ts0601.json => tze284-dmckrsxg-ts0601-0x0000004e.json} (100%) rename tests/data/devices/{tze284-f5efvtbv-ts0601.json => tze284-f5efvtbv-ts0601-0x0000004e.json} (100%) rename tests/data/devices/{tze284-g2e6cpnw-ts0601.json => tze284-g2e6cpnw-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-hodyryli-ts0601.json => tze284-hodyryli-ts0601-0x00000050.json} (100%) rename tests/data/devices/{tze284-iadro9bf-ts0601.json => tze284-iadro9bf-ts0601-0x0000004e.json} (100%) rename tests/data/devices/{tze284-idvyees9-ts0601.json => tze284-idvyees9-ts0601-0x0000004e.json} (100%) rename tests/data/devices/{tze284-kyyu8rbj-ts0601.json => tze284-kyyu8rbj-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-l8xiyymq-ts0601.json => tze284-l8xiyymq-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze284-lq0ffndf-ts0601.json => tze284-lq0ffndf-ts0601-0x00000046.json} (100%) rename tests/data/devices/{tze284-ltwbm23f-ts0601.json => tze284-ltwbm23f-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-myd45weu-ts0601.json => tze284-myd45weu-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-nklqjk62-ts0601.json => tze284-nklqjk62-ts0601-0x0000004e.json} (100%) rename tests/data/devices/{tze284-nnhwcvbk-ts0601.json => tze284-nnhwcvbk-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-o3x45p96-ts0601.json => tze284-o3x45p96-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-o9ofysmo-ts0601.json => tze284-o9ofysmo-ts0601-0x00000050.json} (100%) rename tests/data/devices/{tze284-ogx8u5z6-ts0601.json => tze284-ogx8u5z6-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-oitavov2-ts0601.json => tze284-oitavov2-ts0601-0x00000050.json} (100%) rename tests/data/devices/{tze284-pcdmj88b-ts0601.json => tze284-pcdmj88b-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-qyflbnbj-ts0601.json => tze284-qyflbnbj-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-rjxqso4a-ts0601.json => tze284-rjxqso4a-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-rlytpmij-ts0601.json => tze284-rlytpmij-ts0601-0x00000051.json} (100%) rename tests/data/devices/{tze284-rvnbnvw8-ts0601.json => tze284-rvnbnvw8-ts0601-0x0000004e.json} (100%) rename tests/data/devices/{tze284-sgabhwa6-ts0601.json => tze284-sgabhwa6-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-upagmta9-ts0601.json => tze284-upagmta9-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-vawy74yh-ts0601.json => tze284-vawy74yh-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-vuwtqx0t-ts0601.json => tze284-vuwtqx0t-ts0601-0x00000050.json} (100%) rename tests/data/devices/{tze284-wtikaxzs-ts0601.json => tze284-wtikaxzs-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-xnbkhhdr-ts0601.json => tze284-xnbkhhdr-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-zjhoqbrd-ts0601.json => tze284-zjhoqbrd-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze284-zm8zpwas-ts0601.json => tze284-zm8zpwas-ts0601-0x00000050.json} (100%) rename tests/data/devices/{tze284-znvwzxkq-ts0601.json => tze284-znvwzxkq-ts0601-0x0000004a.json} (100%) rename tests/data/devices/{tze284-zp8xakad-ts0601.json => tze284-zp8xakad-ts0601-0x0000004d.json} (100%) rename tests/data/devices/{tze28c1000000-alh14edn-ts0601.json => tze28c1000000-alh14edn-ts0601-0x00000048.json} (100%) rename tests/data/devices/{tze608-c75zqghm-ts0603.json => tze608-c75zqghm-ts0603-0x00000040.json} (100%) rename tests/data/devices/{ubisys-s1-5501.json => ubisys-s1-5501-0x02600460.json} (100%) rename tests/data/devices/{universal-electronics-inc-urc4460bc0-x-r.json => universal-electronics-inc-urc4460bc0-x-r-0x20160921.json} (100%) rename tests/data/devices/{xiaoyan-terncy-sd01.json => xiaoyan-terncy-sd01-0x0000001a.json} (100%) rename tests/data/devices/{yale-yrd256-tsdb.json => yale-yrd256-tsdb-0x0105002b.json} (100%) rename tests/data/devices/{yooksmart-d10110.json => yooksmart-d10110-0x12046780.json} (100%) rename tests/data/devices/{zemismart-spm02-3z3.json => zemismart-spm02-3z3-0x0000000e.json} (100%) rename tests/data/devices/{zen-within-zen-01.json => zen-within-zen-01-0x0000021f.json} (100%) diff --git a/tests/data/devices/adeo-zb-watersensor-d0001.json b/tests/data/devices/adeo-zb-watersensor-d0001-0x21120002.json similarity index 100% rename from tests/data/devices/adeo-zb-watersensor-d0001.json rename to tests/data/devices/adeo-zb-watersensor-d0001-0x21120002.json diff --git a/tests/data/devices/adurosmart-eria-ad-rgbw3001.json b/tests/data/devices/adurosmart-eria-ad-rgbw3001-0x00000001.json similarity index 100% rename from tests/data/devices/adurosmart-eria-ad-rgbw3001.json rename to tests/data/devices/adurosmart-eria-ad-rgbw3001-0x00000001.json diff --git a/tests/data/devices/aqara-lumi-airrtc-aeu001.json b/tests/data/devices/aqara-lumi-airrtc-aeu001-0x00000a1a.json similarity index 100% rename from tests/data/devices/aqara-lumi-airrtc-aeu001.json rename to tests/data/devices/aqara-lumi-airrtc-aeu001-0x00000a1a.json diff --git a/tests/data/devices/aqara-lumi-airrtc-aeu005.json b/tests/data/devices/aqara-lumi-airrtc-aeu005-0x00001227.json similarity index 100% rename from tests/data/devices/aqara-lumi-airrtc-aeu005.json rename to tests/data/devices/aqara-lumi-airrtc-aeu005-0x00001227.json diff --git a/tests/data/devices/aqara-lumi-light-acn132.json b/tests/data/devices/aqara-lumi-light-acn132-0x00001a1a.json similarity index 100% rename from tests/data/devices/aqara-lumi-light-acn132.json rename to tests/data/devices/aqara-lumi-light-acn132-0x00001a1a.json diff --git a/tests/data/devices/aqara-lumi-light-agl003.json b/tests/data/devices/aqara-lumi-light-agl003-0x0000001b.json similarity index 100% rename from tests/data/devices/aqara-lumi-light-agl003.json rename to tests/data/devices/aqara-lumi-light-agl003-0x0000001b.json diff --git a/tests/data/devices/aqara-lumi-light-agl005.json b/tests/data/devices/aqara-lumi-light-agl005-0x0000001b.json similarity index 100% rename from tests/data/devices/aqara-lumi-light-agl005.json rename to tests/data/devices/aqara-lumi-light-agl005-0x0000001b.json diff --git a/tests/data/devices/aqara-lumi-motion-ac01.json b/tests/data/devices/aqara-lumi-motion-ac01-0x00000035.json similarity index 100% rename from tests/data/devices/aqara-lumi-motion-ac01.json rename to tests/data/devices/aqara-lumi-motion-ac01-0x00000035.json diff --git a/tests/data/devices/aqara-lumi-sensor-occupy-agl1.json b/tests/data/devices/aqara-lumi-sensor-occupy-agl1-0x0000001a.json similarity index 100% rename from tests/data/devices/aqara-lumi-sensor-occupy-agl1.json rename to tests/data/devices/aqara-lumi-sensor-occupy-agl1-0x0000001a.json diff --git a/tests/data/devices/aqara-lumi-sensor-occupy-agl8.json b/tests/data/devices/aqara-lumi-sensor-occupy-agl8-0x00003422.json similarity index 100% rename from tests/data/devices/aqara-lumi-sensor-occupy-agl8.json rename to tests/data/devices/aqara-lumi-sensor-occupy-agl8-0x00003422.json diff --git a/tests/data/devices/aqara-lumi-switch-acn047.json b/tests/data/devices/aqara-lumi-switch-acn047-0x0000001c.json similarity index 100% rename from tests/data/devices/aqara-lumi-switch-acn047.json rename to tests/data/devices/aqara-lumi-switch-acn047-0x0000001c.json diff --git a/tests/data/devices/aqara-lumi-switch-aeu003.json b/tests/data/devices/aqara-lumi-switch-aeu003-0x00000e14.json similarity index 100% rename from tests/data/devices/aqara-lumi-switch-aeu003.json rename to tests/data/devices/aqara-lumi-switch-aeu003-0x00000e14.json diff --git a/tests/data/devices/aqara-lumi-switch-agl007.json b/tests/data/devices/aqara-lumi-switch-agl007-0x00001116.json similarity index 100% rename from tests/data/devices/aqara-lumi-switch-agl007.json rename to tests/data/devices/aqara-lumi-switch-agl007-0x00001116.json diff --git a/tests/data/devices/aqara-lumi-switch-agl010.json b/tests/data/devices/aqara-lumi-switch-agl010-0x00001315.json similarity index 100% rename from tests/data/devices/aqara-lumi-switch-agl010.json rename to tests/data/devices/aqara-lumi-switch-agl010-0x00001315.json diff --git a/tests/data/devices/aug-winkhaus-gmbh-co-kg-fm-v-zb.json b/tests/data/devices/aug-winkhaus-gmbh-co-kg-fm-v-zb-0x00000011.json similarity index 100% rename from tests/data/devices/aug-winkhaus-gmbh-co-kg-fm-v-zb.json rename to tests/data/devices/aug-winkhaus-gmbh-co-kg-fm-v-zb-0x00000011.json diff --git a/tests/data/devices/bega-gantenbrink-leuchten-kg-smart-dimmable-light.json b/tests/data/devices/bega-gantenbrink-leuchten-kg-smart-dimmable-light-0x00990be9.json similarity index 100% rename from tests/data/devices/bega-gantenbrink-leuchten-kg-smart-dimmable-light.json rename to tests/data/devices/bega-gantenbrink-leuchten-kg-smart-dimmable-light-0x00990be9.json diff --git a/tests/data/devices/bosch-rbsh-mms-zb-eu.json b/tests/data/devices/bosch-rbsh-mms-zb-eu-0x11136760.json similarity index 100% rename from tests/data/devices/bosch-rbsh-mms-zb-eu.json rename to tests/data/devices/bosch-rbsh-mms-zb-eu-0x11136760.json diff --git a/tests/data/devices/bosch-rbsh-rth0-bat-zb-eu.json b/tests/data/devices/bosch-rbsh-rth0-bat-zb-eu-0x02086a30.json similarity index 100% rename from tests/data/devices/bosch-rbsh-rth0-bat-zb-eu.json rename to tests/data/devices/bosch-rbsh-rth0-bat-zb-eu-0x02086a30.json diff --git a/tests/data/devices/bosch-rbsh-rth0-zb-eu.json b/tests/data/devices/bosch-rbsh-rth0-zb-eu-0x03036a30.json similarity index 100% rename from tests/data/devices/bosch-rbsh-rth0-zb-eu.json rename to tests/data/devices/bosch-rbsh-rth0-zb-eu-0x03036a30.json diff --git a/tests/data/devices/bosch-rbsh-trv0-zb-eu.json b/tests/data/devices/bosch-rbsh-trv0-zb-eu-0x32051514.json similarity index 100% rename from tests/data/devices/bosch-rbsh-trv0-zb-eu.json rename to tests/data/devices/bosch-rbsh-trv0-zb-eu-0x32051514.json diff --git a/tests/data/devices/bosch-rbsh-us4btn-zb-eu.json b/tests/data/devices/bosch-rbsh-us4btn-zb-eu-0x100d6a30.json similarity index 100% rename from tests/data/devices/bosch-rbsh-us4btn-zb-eu.json rename to tests/data/devices/bosch-rbsh-us4btn-zb-eu-0x100d6a30.json diff --git a/tests/data/devices/candeo-c-zb-lc20-dim.json b/tests/data/devices/candeo-c-zb-lc20-dim-0x29013001.json similarity index 100% rename from tests/data/devices/candeo-c-zb-lc20-dim.json rename to tests/data/devices/candeo-c-zb-lc20-dim-0x29013001.json diff --git a/tests/data/devices/candeo-c-zb-lc20-rgb.json b/tests/data/devices/candeo-c-zb-lc20-rgb-0x31013001.json similarity index 100% rename from tests/data/devices/candeo-c-zb-lc20-rgb.json rename to tests/data/devices/candeo-c-zb-lc20-rgb-0x31013001.json diff --git a/tests/data/devices/centralite-3300.json b/tests/data/devices/centralite-3300-0x1f075310.json similarity index 100% rename from tests/data/devices/centralite-3300.json rename to tests/data/devices/centralite-3300-0x1f075310.json diff --git a/tests/data/devices/centralite-3310-g.json b/tests/data/devices/centralite-3310-g-0x11015310.json similarity index 100% rename from tests/data/devices/centralite-3310-g.json rename to tests/data/devices/centralite-3310-g-0x11015310.json diff --git a/tests/data/devices/centralite-3315-seu.json b/tests/data/devices/centralite-3315-seu-0x1f085310.json similarity index 100% rename from tests/data/devices/centralite-3315-seu.json rename to tests/data/devices/centralite-3315-seu-0x1f085310.json diff --git a/tests/data/devices/centralite-3405-l.json b/tests/data/devices/centralite-3405-l-0x10025310.json similarity index 100% rename from tests/data/devices/centralite-3405-l.json rename to tests/data/devices/centralite-3405-l-0x10025310.json diff --git a/tests/data/devices/centralite-systems-3156105.json b/tests/data/devices/centralite-systems-3156105-0x1418468c.json similarity index 100% rename from tests/data/devices/centralite-systems-3156105.json rename to tests/data/devices/centralite-systems-3156105-0x1418468c.json diff --git a/tests/data/devices/danfoss-etrv0103.json b/tests/data/devices/danfoss-etrv0103-0x00000014.json similarity index 100% rename from tests/data/devices/danfoss-etrv0103.json rename to tests/data/devices/danfoss-etrv0103-0x00000014.json diff --git a/tests/data/devices/ecodim-bv-eco-dim-05-zigbee.json b/tests/data/devices/ecodim-bv-eco-dim-05-zigbee-0x00000001.json similarity index 100% rename from tests/data/devices/ecodim-bv-eco-dim-05-zigbee.json rename to tests/data/devices/ecodim-bv-eco-dim-05-zigbee-0x00000001.json diff --git a/tests/data/devices/ecolink-4655bc0-r.json b/tests/data/devices/ecolink-4655bc0-r-0x20160921.json similarity index 100% rename from tests/data/devices/ecolink-4655bc0-r.json rename to tests/data/devices/ecolink-4655bc0-r-0x20160921.json diff --git a/tests/data/devices/ericsity-gl-c-008p.json b/tests/data/devices/ericsity-gl-c-008p-0x25013001.json old mode 100755 new mode 100644 similarity index 100% rename from tests/data/devices/ericsity-gl-c-008p.json rename to tests/data/devices/ericsity-gl-c-008p-0x25013001.json diff --git a/tests/data/devices/ericsity-gl-c-009p.json b/tests/data/devices/ericsity-gl-c-009p-0x25013001.json similarity index 100% rename from tests/data/devices/ericsity-gl-c-009p.json rename to tests/data/devices/ericsity-gl-c-009p-0x25013001.json diff --git a/tests/data/devices/espressif-zigbeebinaryoutputdevice.json b/tests/data/devices/espressif-zigbeebinaryanalogdevice.json similarity index 100% rename from tests/data/devices/espressif-zigbeebinaryoutputdevice.json rename to tests/data/devices/espressif-zigbeebinaryanalogdevice.json diff --git a/tests/data/devices/eurotronic-spzb0001.json b/tests/data/devices/eurotronic-spzb0001-0x4501001f.json similarity index 100% rename from tests/data/devices/eurotronic-spzb0001.json rename to tests/data/devices/eurotronic-spzb0001-0x4501001f.json diff --git a/tests/data/devices/ewelink-ck-bl702-al-01-7009-z102lg03-1.json b/tests/data/devices/ewelink-ck-bl702-al-01-7009-z102lg03-1-0x00001200.json similarity index 100% rename from tests/data/devices/ewelink-ck-bl702-al-01-7009-z102lg03-1.json rename to tests/data/devices/ewelink-ck-bl702-al-01-7009-z102lg03-1-0x00001200.json diff --git a/tests/data/devices/ewelink-ck-tlsr8656-ss5-01-7000.json b/tests/data/devices/ewelink-ck-tlsr8656-ss5-01-7000-0x00001102.json similarity index 100% rename from tests/data/devices/ewelink-ck-tlsr8656-ss5-01-7000.json rename to tests/data/devices/ewelink-ck-tlsr8656-ss5-01-7000-0x00001102.json diff --git a/tests/data/devices/ewelink-snzb-01p.json b/tests/data/devices/ewelink-snzb-01p-0x00002000.json similarity index 100% rename from tests/data/devices/ewelink-snzb-01p.json rename to tests/data/devices/ewelink-snzb-01p-0x00002000.json diff --git a/tests/data/devices/ewelink-snzb-02p.json b/tests/data/devices/ewelink-snzb-02p-0x00002100.json similarity index 100% rename from tests/data/devices/ewelink-snzb-02p.json rename to tests/data/devices/ewelink-snzb-02p-0x00002100.json diff --git a/tests/data/devices/ewelink-snzb-03p.json b/tests/data/devices/ewelink-snzb-03p-0x00002201.json similarity index 100% rename from tests/data/devices/ewelink-snzb-03p.json rename to tests/data/devices/ewelink-snzb-03p-0x00002201.json diff --git a/tests/data/devices/ewelink-snzb-04p.json b/tests/data/devices/ewelink-snzb-04p-0x00002200.json similarity index 100% rename from tests/data/devices/ewelink-snzb-04p.json rename to tests/data/devices/ewelink-snzb-04p-0x00002200.json diff --git a/tests/data/devices/ezviz-cs-t55-r100-g.json b/tests/data/devices/ezviz-cs-t55-r100-g-0x00000002.json similarity index 100% rename from tests/data/devices/ezviz-cs-t55-r100-g.json rename to tests/data/devices/ezviz-cs-t55-r100-g-0x00000002.json diff --git a/tests/data/devices/frient-a-s-aqszb-110.json b/tests/data/devices/frient-a-s-aqszb-110-0x00040001.json similarity index 100% rename from tests/data/devices/frient-a-s-aqszb-110.json rename to tests/data/devices/frient-a-s-aqszb-110-0x00040001.json diff --git a/tests/data/devices/frient-a-s-emizb-141.json b/tests/data/devices/frient-a-s-emizb-141-0x00030102.json similarity index 100% rename from tests/data/devices/frient-a-s-emizb-141.json rename to tests/data/devices/frient-a-s-emizb-141-0x00030102.json diff --git a/tests/data/devices/frient-a-s-emizb-151.json b/tests/data/devices/frient-a-s-emizb-151-0x00030107.json similarity index 100% rename from tests/data/devices/frient-a-s-emizb-151.json rename to tests/data/devices/frient-a-s-emizb-151-0x00030107.json diff --git a/tests/data/devices/frient-a-s-flszb-110.json b/tests/data/devices/frient-a-s-flszb-110-0x00040001.json similarity index 100% rename from tests/data/devices/frient-a-s-flszb-110.json rename to tests/data/devices/frient-a-s-flszb-110-0x00040001.json diff --git a/tests/data/devices/frient-a-s-hmszb-120.json b/tests/data/devices/frient-a-s-hmszb-120-0x00040001.json similarity index 100% rename from tests/data/devices/frient-a-s-hmszb-120.json rename to tests/data/devices/frient-a-s-hmszb-120-0x00040001.json diff --git a/tests/data/devices/frient-a-s-iomzb-110.json b/tests/data/devices/frient-a-s-iomzb-110-0x00020001.json similarity index 100% rename from tests/data/devices/frient-a-s-iomzb-110.json rename to tests/data/devices/frient-a-s-iomzb-110-0x00020001.json diff --git a/tests/data/devices/frient-a-s-kepzb-110.json b/tests/data/devices/frient-a-s-kepzb-110-0x00020005.json similarity index 100% rename from tests/data/devices/frient-a-s-kepzb-110.json rename to tests/data/devices/frient-a-s-kepzb-110-0x00020005.json diff --git a/tests/data/devices/frient-a-s-moszb-140.json b/tests/data/devices/frient-a-s-moszb-140-0x00040006.json similarity index 100% rename from tests/data/devices/frient-a-s-moszb-140.json rename to tests/data/devices/frient-a-s-moszb-140-0x00040006.json diff --git a/tests/data/devices/frient-a-s-moszb-153.json b/tests/data/devices/frient-a-s-moszb-153-0x00020006.json similarity index 100% rename from tests/data/devices/frient-a-s-moszb-153.json rename to tests/data/devices/frient-a-s-moszb-153-0x00020006.json diff --git a/tests/data/devices/frient-a-s-sbtzb-110.json b/tests/data/devices/frient-a-s-sbtzb-110-0x00020002.json similarity index 100% rename from tests/data/devices/frient-a-s-sbtzb-110.json rename to tests/data/devices/frient-a-s-sbtzb-110-0x00020002.json diff --git a/tests/data/devices/frient-a-s-scazb-141.json b/tests/data/devices/frient-a-s-scazb-141-0x00010803.json similarity index 100% rename from tests/data/devices/frient-a-s-scazb-141.json rename to tests/data/devices/frient-a-s-scazb-141-0x00010803.json diff --git a/tests/data/devices/frient-a-s-sirzb-111.json b/tests/data/devices/frient-a-s-sirzb-111-0x00020004.json similarity index 100% rename from tests/data/devices/frient-a-s-sirzb-111.json rename to tests/data/devices/frient-a-s-sirzb-111-0x00020004.json diff --git a/tests/data/devices/frient-a-s-smszb-120.json b/tests/data/devices/frient-a-s-smszb-120-0x00040008.json similarity index 100% rename from tests/data/devices/frient-a-s-smszb-120.json rename to tests/data/devices/frient-a-s-smszb-120-0x00040008.json diff --git a/tests/data/devices/frient-a-s-splzb-141.json b/tests/data/devices/frient-a-s-splzb-141-0x00020009.json similarity index 100% rename from tests/data/devices/frient-a-s-splzb-141.json rename to tests/data/devices/frient-a-s-splzb-141-0x00020009.json diff --git a/tests/data/devices/frient-a-s-wiszb-131.json b/tests/data/devices/frient-a-s-wiszb-131-0x00020006.json similarity index 100% rename from tests/data/devices/frient-a-s-wiszb-131.json rename to tests/data/devices/frient-a-s-wiszb-131-0x00020006.json diff --git a/tests/data/devices/gledopto-gl-b-008p.json b/tests/data/devices/gledopto-gl-b-008p-0x00000006.json similarity index 100% rename from tests/data/devices/gledopto-gl-b-008p.json rename to tests/data/devices/gledopto-gl-b-008p-0x00000006.json diff --git a/tests/data/devices/gledopto-gl-c-009p.json b/tests/data/devices/gledopto-gl-c-009p-0x29013001.json similarity index 100% rename from tests/data/devices/gledopto-gl-c-009p.json rename to tests/data/devices/gledopto-gl-c-009p-0x29013001.json diff --git a/tests/data/devices/gledopto-gl-sd-301p.json b/tests/data/devices/gledopto-gl-sd-301p-0x26013001.json similarity index 100% rename from tests/data/devices/gledopto-gl-sd-301p.json rename to tests/data/devices/gledopto-gl-sd-301p-0x26013001.json diff --git a/tests/data/devices/handshake-finland-agge-zigbee-smart-rotary-dimmer.json b/tests/data/devices/handshake-finland-agge-zigbee-smart-rotary-dimmer-0x00000002.json similarity index 100% rename from tests/data/devices/handshake-finland-agge-zigbee-smart-rotary-dimmer.json rename to tests/data/devices/handshake-finland-agge-zigbee-smart-rotary-dimmer-0x00000002.json diff --git a/tests/data/devices/hive-mbr1.json b/tests/data/devices/hive-mbr1-0x01047320.json similarity index 100% rename from tests/data/devices/hive-mbr1.json rename to tests/data/devices/hive-mbr1-0x01047320.json diff --git a/tests/data/devices/ikea-of-sweden-badring-water-leakage-sensor.json b/tests/data/devices/ikea-of-sweden-badring-water-leakage-sensor-0x01000007.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-badring-water-leakage-sensor.json rename to tests/data/devices/ikea-of-sweden-badring-water-leakage-sensor-0x01000007.json diff --git a/tests/data/devices/ikea-of-sweden-fyrtur-block-out-roller-blind.json b/tests/data/devices/ikea-of-sweden-fyrtur-block-out-roller-blind-0x23088631.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-fyrtur-block-out-roller-blind.json rename to tests/data/devices/ikea-of-sweden-fyrtur-block-out-roller-blind-0x23088631.json diff --git a/tests/data/devices/ikea-of-sweden-inspelning-smart-plug.json b/tests/data/devices/ikea-of-sweden-inspelning-smart-plug-0x02040045.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-inspelning-smart-plug.json rename to tests/data/devices/ikea-of-sweden-inspelning-smart-plug-0x02040045.json diff --git a/tests/data/devices/ikea-of-sweden-ormanas-led-strip.json b/tests/data/devices/ikea-of-sweden-ormanas-led-strip-0x01010010.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-ormanas-led-strip.json rename to tests/data/devices/ikea-of-sweden-ormanas-led-strip-0x01010010.json diff --git a/tests/data/devices/ikea-of-sweden-parasoll-door-window-sensor.json b/tests/data/devices/ikea-of-sweden-parasoll-door-window-sensor-0x01000019.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-parasoll-door-window-sensor.json rename to tests/data/devices/ikea-of-sweden-parasoll-door-window-sensor-0x01000019.json diff --git a/tests/data/devices/ikea-of-sweden-praktlysing-cellular-blind.json b/tests/data/devices/ikea-of-sweden-praktlysing-cellular-blind-0x23088631.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-praktlysing-cellular-blind.json rename to tests/data/devices/ikea-of-sweden-praktlysing-cellular-blind-0x23088631.json diff --git a/tests/data/devices/ikea-of-sweden-rodret-dimmer.json b/tests/data/devices/ikea-of-sweden-rodret-dimmer-0x01000047.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-rodret-dimmer.json rename to tests/data/devices/ikea-of-sweden-rodret-dimmer-0x01000047.json diff --git a/tests/data/devices/ikea-of-sweden-rodret-wireless-dimmer.json b/tests/data/devices/ikea-of-sweden-rodret-wireless-dimmer-0x01000057.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-rodret-wireless-dimmer.json rename to tests/data/devices/ikea-of-sweden-rodret-wireless-dimmer-0x01000057.json diff --git a/tests/data/devices/ikea-of-sweden-somrig-shortcut-button.json b/tests/data/devices/ikea-of-sweden-somrig-shortcut-button-0x01000021.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-somrig-shortcut-button.json rename to tests/data/devices/ikea-of-sweden-somrig-shortcut-button-0x01000021.json diff --git a/tests/data/devices/ikea-of-sweden-starkvind-air-purifier.json b/tests/data/devices/ikea-of-sweden-starkvind-air-purifier-0x00011001.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-starkvind-air-purifier.json rename to tests/data/devices/ikea-of-sweden-starkvind-air-purifier-0x00011001.json diff --git a/tests/data/devices/ikea-of-sweden-starkvind-air-purifier-table.json b/tests/data/devices/ikea-of-sweden-starkvind-air-purifier-table-0x00011001.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-starkvind-air-purifier-table.json rename to tests/data/devices/ikea-of-sweden-starkvind-air-purifier-table-0x00011001.json diff --git a/tests/data/devices/ikea-of-sweden-symfonisk-sound-remote-gen2.json b/tests/data/devices/ikea-of-sweden-symfonisk-sound-remote-gen2-0x00010012.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-symfonisk-sound-remote-gen2.json rename to tests/data/devices/ikea-of-sweden-symfonisk-sound-remote-gen2-0x00010012.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-bulb-e12-w-op-ch-400lm.json b/tests/data/devices/ikea-of-sweden-tradfri-bulb-e12-w-op-ch-400lm-0x23094631.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-bulb-e12-w-op-ch-400lm.json rename to tests/data/devices/ikea-of-sweden-tradfri-bulb-e12-w-op-ch-400lm-0x23094631.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-bulb-e12-ws-opal-400lm.json b/tests/data/devices/ikea-of-sweden-tradfri-bulb-e12-ws-opal-400lm-0x23087631.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-bulb-e12-ws-opal-400lm.json rename to tests/data/devices/ikea-of-sweden-tradfri-bulb-e12-ws-opal-400lm-0x23087631.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-bulb-e14-ws-globe-470lm.json b/tests/data/devices/ikea-of-sweden-tradfri-bulb-e14-ws-globe-470lm-0x01010020.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-bulb-e14-ws-globe-470lm.json rename to tests/data/devices/ikea-of-sweden-tradfri-bulb-e14-ws-globe-470lm-0x01010020.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-opal-1000lm.json b/tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-opal-1000lm-0x23094631.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-opal-1000lm.json rename to tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-opal-1000lm-0x23094631.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-w-opal-1000lm.json b/tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-w-opal-1000lm-0x23094631.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-w-opal-1000lm.json rename to tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-w-opal-1000lm-0x23094631.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-ws-opal-980lm.json b/tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-ws-opal-980lm-0x23095631.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-ws-opal-980lm.json rename to tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-ws-opal-980lm-0x23095631.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-bulb-e27-ws-globe-1055lm.json b/tests/data/devices/ikea-of-sweden-tradfri-bulb-e27-ws-globe-1055lm-0x02040005.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-bulb-e27-ws-globe-1055lm.json rename to tests/data/devices/ikea-of-sweden-tradfri-bulb-e27-ws-globe-1055lm-0x02040005.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-bulb-e27-ww-g95-cl-470lm.json b/tests/data/devices/ikea-of-sweden-tradfri-bulb-e27-ww-g95-cl-470lm-0x00011006.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-bulb-e27-ww-g95-cl-470lm.json rename to tests/data/devices/ikea-of-sweden-tradfri-bulb-e27-ww-g95-cl-470lm-0x00011006.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json b/tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json rename to tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ww-400lm.json b/tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ww-400lm-0x23093631.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ww-400lm.json rename to tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ww-400lm-0x23093631.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-control-outlet.json b/tests/data/devices/ikea-of-sweden-tradfri-control-outlet-0x23089631.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-control-outlet.json rename to tests/data/devices/ikea-of-sweden-tradfri-control-outlet-0x23089631.json diff --git a/tests/data/devices/ikea-of-sweden-tradfri-open-close-remote.json b/tests/data/devices/ikea-of-sweden-tradfri-open-close-remote-0x23079631.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-tradfri-open-close-remote.json rename to tests/data/devices/ikea-of-sweden-tradfri-open-close-remote-0x23079631.json diff --git a/tests/data/devices/ikea-of-sweden-vallhorn-wireless-motion-sensor.json b/tests/data/devices/ikea-of-sweden-vallhorn-wireless-motion-sensor-0x01000064.json similarity index 100% rename from tests/data/devices/ikea-of-sweden-vallhorn-wireless-motion-sensor.json rename to tests/data/devices/ikea-of-sweden-vallhorn-wireless-motion-sensor-0x01000064.json diff --git a/tests/data/devices/innr-ae-280-c.json b/tests/data/devices/innr-ae-280-c-0x20026a30.json similarity index 100% rename from tests/data/devices/innr-ae-280-c.json rename to tests/data/devices/innr-ae-280-c-0x20026a30.json diff --git a/tests/data/devices/innr-rb-285-c.json b/tests/data/devices/innr-rb-285-c-0x10051567.json similarity index 100% rename from tests/data/devices/innr-rb-285-c.json rename to tests/data/devices/innr-rb-285-c-0x10051567.json diff --git a/tests/data/devices/innr-rc-250.json b/tests/data/devices/innr-rc-250-0x21086500.json similarity index 100% rename from tests/data/devices/innr-rc-250.json rename to tests/data/devices/innr-rc-250-0x21086500.json diff --git a/tests/data/devices/innr-rs-232-c.json b/tests/data/devices/innr-rs-232-c-0x22151511.json similarity index 100% rename from tests/data/devices/innr-rs-232-c.json rename to tests/data/devices/innr-rs-232-c-0x22151511.json diff --git a/tests/data/devices/innr-sp-120.json b/tests/data/devices/innr-sp-120-0x11040002.json similarity index 100% rename from tests/data/devices/innr-sp-120.json rename to tests/data/devices/innr-sp-120-0x11040002.json diff --git a/tests/data/devices/innr-sp-234.json b/tests/data/devices/innr-sp-234-0x31016610.json old mode 100755 new mode 100644 similarity index 100% rename from tests/data/devices/innr-sp-234.json rename to tests/data/devices/innr-sp-234-0x31016610.json diff --git a/tests/data/devices/innr-sp-240.json b/tests/data/devices/innr-sp-240-0x191e3685.json similarity index 100% rename from tests/data/devices/innr-sp-240.json rename to tests/data/devices/innr-sp-240-0x191e3685.json diff --git a/tests/data/devices/innr-sp-242.json b/tests/data/devices/innr-sp-242-0x17173685.json similarity index 100% rename from tests/data/devices/innr-sp-242.json rename to tests/data/devices/innr-sp-242-0x17173685.json diff --git a/tests/data/devices/inovelli-vzm30-sn.json b/tests/data/devices/inovelli-vzm30-sn-0x01100100.json similarity index 100% rename from tests/data/devices/inovelli-vzm30-sn.json rename to tests/data/devices/inovelli-vzm30-sn-0x01100100.json diff --git a/tests/data/devices/inovelli-vzm31-sn.json b/tests/data/devices/inovelli-vzm31-sn-0x01020212.json similarity index 100% rename from tests/data/devices/inovelli-vzm31-sn.json rename to tests/data/devices/inovelli-vzm31-sn-0x01020212.json diff --git a/tests/data/devices/inovelli-vzm35-sn.json b/tests/data/devices/inovelli-vzm35-sn-0x02020107.json similarity index 100% rename from tests/data/devices/inovelli-vzm35-sn.json rename to tests/data/devices/inovelli-vzm35-sn-0x02020107.json diff --git a/tests/data/devices/jasco-products-45856.json b/tests/data/devices/jasco-products-45856-0x00000006.json similarity index 100% rename from tests/data/devices/jasco-products-45856.json rename to tests/data/devices/jasco-products-45856-0x00000006.json diff --git a/tests/data/devices/jasco-products-45857.json b/tests/data/devices/jasco-products-45857-0x00000006.json similarity index 100% rename from tests/data/devices/jasco-products-45857.json rename to tests/data/devices/jasco-products-45857-0x00000006.json diff --git a/tests/data/devices/ke-tradfri-open-close-remote.json b/tests/data/devices/ke-tradfri-open-close-remote-0x22010631.json similarity index 100% rename from tests/data/devices/ke-tradfri-open-close-remote.json rename to tests/data/devices/ke-tradfri-open-close-remote-0x22010631.json diff --git a/tests/data/devices/keen-home-inc-sv01-410-mp-1-1.json b/tests/data/devices/keen-home-inc-sv01-410-mp-1-1-0x10235121.json similarity index 100% rename from tests/data/devices/keen-home-inc-sv01-410-mp-1-1.json rename to tests/data/devices/keen-home-inc-sv01-410-mp-1-1-0x10235121.json diff --git a/tests/data/devices/king-of-fans-inc-hbuniversalcfremote.json b/tests/data/devices/king-of-fans-inc-hbuniversalcfremote-0x0000000f.json similarity index 100% rename from tests/data/devices/king-of-fans-inc-hbuniversalcfremote.json rename to tests/data/devices/king-of-fans-inc-hbuniversalcfremote-0x0000000f.json diff --git a/tests/data/devices/king-of-fans-inc-hdc52eastwindfan.json b/tests/data/devices/king-of-fans-inc-hdc52eastwindfan-0x0000000f.json similarity index 100% rename from tests/data/devices/king-of-fans-inc-hdc52eastwindfan.json rename to tests/data/devices/king-of-fans-inc-hdc52eastwindfan-0x0000000f.json diff --git a/tests/data/devices/konke-3afe28010402000d.json b/tests/data/devices/konke-3afe28010402000d.json old mode 100755 new mode 100644 diff --git a/tests/data/devices/kwikset-smartcode-convert-gen1.json b/tests/data/devices/kwikset-smartcode-convert-gen1-0x30a07a06.json similarity index 100% rename from tests/data/devices/kwikset-smartcode-convert-gen1.json rename to tests/data/devices/kwikset-smartcode-convert-gen1-0x30a07a06.json diff --git a/tests/data/devices/lds-zb-onoffplug-d0005.json b/tests/data/devices/lds-zb-onoffplug-d0005-0x21186230.json similarity index 100% rename from tests/data/devices/lds-zb-onoffplug-d0005.json rename to tests/data/devices/lds-zb-onoffplug-d0005-0x21186230.json diff --git a/tests/data/devices/lds-zbt-cctswitch-d0001.json b/tests/data/devices/lds-zbt-cctswitch-d0001-0x21000006.json similarity index 100% rename from tests/data/devices/lds-zbt-cctswitch-d0001.json rename to tests/data/devices/lds-zbt-cctswitch-d0001-0x21000006.json diff --git a/tests/data/devices/ledvance-a60s-rgbw.json b/tests/data/devices/ledvance-a60s-rgbw-0x02146550.json similarity index 100% rename from tests/data/devices/ledvance-a60s-rgbw.json rename to tests/data/devices/ledvance-a60s-rgbw-0x02146550.json diff --git a/tests/data/devices/ledvance-flex-rgbw.json b/tests/data/devices/ledvance-flex-rgbw-0x00102428.json old mode 100755 new mode 100644 similarity index 100% rename from tests/data/devices/ledvance-flex-rgbw.json rename to tests/data/devices/ledvance-flex-rgbw-0x00102428.json diff --git a/tests/data/devices/ledvance-outdoor-accent-light-rgb.json b/tests/data/devices/ledvance-outdoor-accent-light-rgb-0x00102428.json similarity index 100% rename from tests/data/devices/ledvance-outdoor-accent-light-rgb.json rename to tests/data/devices/ledvance-outdoor-accent-light-rgb-0x00102428.json diff --git a/tests/data/devices/ledvance-plug.json b/tests/data/devices/ledvance-plug-0x00102101.json similarity index 100% rename from tests/data/devices/ledvance-plug.json rename to tests/data/devices/ledvance-plug-0x00102101.json diff --git a/tests/data/devices/legrand-dimmer-switch-w-o-neutral.json b/tests/data/devices/legrand-dimmer-switch-w-o-neutral-0x004d45ff.json similarity index 100% rename from tests/data/devices/legrand-dimmer-switch-w-o-neutral.json rename to tests/data/devices/legrand-dimmer-switch-w-o-neutral-0x004d45ff.json diff --git a/tests/data/devices/legrand-light-switch-with-neutral.json b/tests/data/devices/legrand-light-switch-with-neutral-0x001c4203.json similarity index 100% rename from tests/data/devices/legrand-light-switch-with-neutral.json rename to tests/data/devices/legrand-light-switch-with-neutral-0x001c4203.json diff --git a/tests/data/devices/legrand-mobile-outlet.json b/tests/data/devices/legrand-mobile-outlet-0x006545ff.json similarity index 100% rename from tests/data/devices/legrand-mobile-outlet.json rename to tests/data/devices/legrand-mobile-outlet-0x006545ff.json diff --git a/tests/data/devices/level-home-b2.json b/tests/data/devices/level-home-b2-0x0300001a.json similarity index 100% rename from tests/data/devices/level-home-b2.json rename to tests/data/devices/level-home-b2-0x0300001a.json diff --git a/tests/data/devices/level-home-bolt.json b/tests/data/devices/level-home-bolt-0x03020006.json similarity index 100% rename from tests/data/devices/level-home-bolt.json rename to tests/data/devices/level-home-bolt-0x03020006.json diff --git a/tests/data/devices/lixee-zlinky-tic.json b/tests/data/devices/lixee-zlinky-tic-0x00000011.json similarity index 100% rename from tests/data/devices/lixee-zlinky-tic.json rename to tests/data/devices/lixee-zlinky-tic-0x00000011.json diff --git a/tests/data/devices/lk-zb-doorsensor-d0003.json b/tests/data/devices/lk-zb-doorsensor-d0003.json old mode 100755 new mode 100644 diff --git a/tests/data/devices/lk-zbt-dimswitch-d0001.json b/tests/data/devices/lk-zbt-dimswitch-d0001-0x22166500.json similarity index 100% rename from tests/data/devices/lk-zbt-dimswitch-d0001.json rename to tests/data/devices/lk-zbt-dimswitch-d0001-0x22166500.json diff --git a/tests/data/devices/lk-zbt-onoffplug-d0001.json b/tests/data/devices/lk-zbt-onoffplug-d0001-0x22036610.json similarity index 100% rename from tests/data/devices/lk-zbt-onoffplug-d0001.json rename to tests/data/devices/lk-zbt-onoffplug-d0001-0x22036610.json diff --git a/tests/data/devices/lumi-lumi-airrtc-agl001.json b/tests/data/devices/lumi-lumi-airrtc-agl001-0x0000001e.json similarity index 100% rename from tests/data/devices/lumi-lumi-airrtc-agl001.json rename to tests/data/devices/lumi-lumi-airrtc-agl001-0x0000001e.json diff --git a/tests/data/devices/lumi-lumi-curtain-acn002.json b/tests/data/devices/lumi-lumi-curtain-acn002-0x00000e1f.json similarity index 100% rename from tests/data/devices/lumi-lumi-curtain-acn002.json rename to tests/data/devices/lumi-lumi-curtain-acn002-0x00000e1f.json diff --git a/tests/data/devices/lumi-lumi-curtain-agl001.json b/tests/data/devices/lumi-lumi-curtain-agl001-0x00000018.json similarity index 100% rename from tests/data/devices/lumi-lumi-curtain-agl001.json rename to tests/data/devices/lumi-lumi-curtain-agl001-0x00000018.json diff --git a/tests/data/devices/lumi-lumi-flood-acn001.json b/tests/data/devices/lumi-lumi-flood-acn001-0x00000004.json similarity index 100% rename from tests/data/devices/lumi-lumi-flood-acn001.json rename to tests/data/devices/lumi-lumi-flood-acn001-0x00000004.json diff --git a/tests/data/devices/lumi-lumi-flood-agl02.json b/tests/data/devices/lumi-lumi-flood-agl02-0x00000020.json similarity index 100% rename from tests/data/devices/lumi-lumi-flood-agl02.json rename to tests/data/devices/lumi-lumi-flood-agl02-0x00000020.json diff --git a/tests/data/devices/lumi-lumi-light-aqcn02.json b/tests/data/devices/lumi-lumi-light-aqcn02-0x00000017.json similarity index 100% rename from tests/data/devices/lumi-lumi-light-aqcn02.json rename to tests/data/devices/lumi-lumi-light-aqcn02-0x00000017.json diff --git a/tests/data/devices/lumi-lumi-magnet-acn001.json b/tests/data/devices/lumi-lumi-magnet-acn001-0x00000004.json similarity index 100% rename from tests/data/devices/lumi-lumi-magnet-acn001.json rename to tests/data/devices/lumi-lumi-magnet-acn001-0x00000004.json diff --git a/tests/data/devices/lumi-lumi-magnet-agl02.json b/tests/data/devices/lumi-lumi-magnet-agl02-0x0000001e.json similarity index 100% rename from tests/data/devices/lumi-lumi-magnet-agl02.json rename to tests/data/devices/lumi-lumi-magnet-agl02-0x0000001e.json diff --git a/tests/data/devices/lumi-lumi-motion-ac02.json b/tests/data/devices/lumi-lumi-motion-ac02.json old mode 100755 new mode 100644 diff --git a/tests/data/devices/lumi-lumi-motion-agl04.json b/tests/data/devices/lumi-lumi-motion-agl04-0x00000019.json similarity index 100% rename from tests/data/devices/lumi-lumi-motion-agl04.json rename to tests/data/devices/lumi-lumi-motion-agl04-0x00000019.json diff --git a/tests/data/devices/lumi-lumi-plug-maus01.json b/tests/data/devices/lumi-lumi-plug-maus01-0x0000000b.json similarity index 100% rename from tests/data/devices/lumi-lumi-plug-maus01.json rename to tests/data/devices/lumi-lumi-plug-maus01-0x0000000b.json diff --git a/tests/data/devices/lumi-lumi-relay-c2acn01.json b/tests/data/devices/lumi-lumi-relay-c2acn01-0x00000024.json similarity index 100% rename from tests/data/devices/lumi-lumi-relay-c2acn01.json rename to tests/data/devices/lumi-lumi-relay-c2acn01-0x00000024.json diff --git a/tests/data/devices/lumi-lumi-remote-b486opcn01.json b/tests/data/devices/lumi-lumi-remote-b486opcn01.json old mode 100755 new mode 100644 diff --git a/tests/data/devices/lumi-lumi-sensor-smoke-acn03.json b/tests/data/devices/lumi-lumi-sensor-smoke-acn03-0x00000011.json similarity index 100% rename from tests/data/devices/lumi-lumi-sensor-smoke-acn03.json rename to tests/data/devices/lumi-lumi-sensor-smoke-acn03-0x00000011.json diff --git a/tests/data/devices/lumi-lumi-switch-b1laus01.json b/tests/data/devices/lumi-lumi-switch-b1laus01-0x00000020.json old mode 100755 new mode 100644 similarity index 100% rename from tests/data/devices/lumi-lumi-switch-b1laus01.json rename to tests/data/devices/lumi-lumi-switch-b1laus01-0x00000020.json diff --git a/tests/data/devices/lumi-lumi-switch-b1naus01.json b/tests/data/devices/lumi-lumi-switch-b1naus01-0x0000001f.json old mode 100755 new mode 100644 similarity index 100% rename from tests/data/devices/lumi-lumi-switch-b1naus01.json rename to tests/data/devices/lumi-lumi-switch-b1naus01-0x0000001f.json diff --git a/tests/data/devices/lumi-lumi-switch-l1aeu1.json b/tests/data/devices/lumi-lumi-switch-l1aeu1-0x00000e0b.json similarity index 100% rename from tests/data/devices/lumi-lumi-switch-l1aeu1.json rename to tests/data/devices/lumi-lumi-switch-l1aeu1-0x00000e0b.json diff --git a/tests/data/devices/lumi-lumi-switch-l2aeu1.json b/tests/data/devices/lumi-lumi-switch-l2aeu1-0x00000e0b.json similarity index 100% rename from tests/data/devices/lumi-lumi-switch-l2aeu1.json rename to tests/data/devices/lumi-lumi-switch-l2aeu1-0x00000e0b.json diff --git a/tests/data/devices/lumi-lumi-switch-n0agl1.json b/tests/data/devices/lumi-lumi-switch-n0agl1-0x0000001e.json similarity index 100% rename from tests/data/devices/lumi-lumi-switch-n0agl1.json rename to tests/data/devices/lumi-lumi-switch-n0agl1-0x0000001e.json diff --git a/tests/data/devices/lumi-lumi-vibration-agl01.json b/tests/data/devices/lumi-lumi-vibration-agl01-0x0000001c.json similarity index 100% rename from tests/data/devices/lumi-lumi-vibration-agl01.json rename to tests/data/devices/lumi-lumi-vibration-agl01-0x0000001c.json diff --git a/tests/data/devices/lumi-lumi-weather.json b/tests/data/devices/lumi-lumi-weather.json old mode 100755 new mode 100644 diff --git a/tests/data/devices/lutron-z3-1brl.json b/tests/data/devices/lutron-z3-1brl-0x00000c08.json similarity index 100% rename from tests/data/devices/lutron-z3-1brl.json rename to tests/data/devices/lutron-z3-1brl-0x00000c08.json diff --git a/tests/data/devices/mli-tint-extendedcolor.json b/tests/data/devices/mli-tint-extendedcolor-0x10012001.json similarity index 100% rename from tests/data/devices/mli-tint-extendedcolor.json rename to tests/data/devices/mli-tint-extendedcolor-0x10012001.json diff --git a/tests/data/devices/mli-zbt-remote-all-rgbw.json b/tests/data/devices/mli-zbt-remote-all-rgbw-0x11010022.json similarity index 100% rename from tests/data/devices/mli-zbt-remote-all-rgbw.json rename to tests/data/devices/mli-zbt-remote-all-rgbw-0x11010022.json diff --git a/tests/data/devices/namron-as-4512785.json b/tests/data/devices/namron-as-4512785-0x0000000e.json similarity index 100% rename from tests/data/devices/namron-as-4512785.json rename to tests/data/devices/namron-as-4512785-0x0000000e.json diff --git a/tests/data/devices/niko-nv-battery-switch-4-button.json b/tests/data/devices/niko-nv-battery-switch-4-button-0x21046760.json similarity index 100% rename from tests/data/devices/niko-nv-battery-switch-4-button.json rename to tests/data/devices/niko-nv-battery-switch-4-button-0x21046760.json diff --git a/tests/data/devices/niko-nv-connectable-motor-control-3a.json b/tests/data/devices/niko-nv-connectable-motor-control-3a-0x21160006.json similarity index 100% rename from tests/data/devices/niko-nv-connectable-motor-control-3a.json rename to tests/data/devices/niko-nv-connectable-motor-control-3a-0x21160006.json diff --git a/tests/data/devices/nodon-sin-4-rs-20.json b/tests/data/devices/nodon-sin-4-rs-20-0x00010300.json similarity index 100% rename from tests/data/devices/nodon-sin-4-rs-20.json rename to tests/data/devices/nodon-sin-4-rs-20-0x00010300.json diff --git a/tests/data/devices/osram-switch-4x-lightify.json b/tests/data/devices/osram-switch-4x-lightify-0x01000000.json similarity index 100% rename from tests/data/devices/osram-switch-4x-lightify.json rename to tests/data/devices/osram-switch-4x-lightify-0x01000000.json diff --git a/tests/data/devices/philips-7602031u7.json b/tests/data/devices/philips-7602031u7-0x01001d00.json similarity index 100% rename from tests/data/devices/philips-7602031u7.json rename to tests/data/devices/philips-7602031u7-0x01001d00.json diff --git a/tests/data/devices/philips-915005988601.json b/tests/data/devices/philips-915005988601-0x01002000.json similarity index 100% rename from tests/data/devices/philips-915005988601.json rename to tests/data/devices/philips-915005988601-0x01002000.json diff --git a/tests/data/devices/philips-lct014.json b/tests/data/devices/philips-lct014-0x01001a02.json similarity index 100% rename from tests/data/devices/philips-lct014.json rename to tests/data/devices/philips-lct014-0x01001a02.json diff --git a/tests/data/devices/philips-llc020.json b/tests/data/devices/philips-llc020-0x42006734.json similarity index 100% rename from tests/data/devices/philips-llc020.json rename to tests/data/devices/philips-llc020-0x42006734.json diff --git a/tests/data/devices/philips-lst002.json b/tests/data/devices/philips-lst002-0x01001700.json similarity index 100% rename from tests/data/devices/philips-lst002.json rename to tests/data/devices/philips-lst002-0x01001700.json diff --git a/tests/data/devices/philips-rom001.json b/tests/data/devices/philips-rom001-0x02002f08.json similarity index 100% rename from tests/data/devices/philips-rom001.json rename to tests/data/devices/philips-rom001-0x02002f08.json diff --git a/tests/data/devices/philips-rwl021.json b/tests/data/devices/philips-rwl021-0x43007305.json similarity index 100% rename from tests/data/devices/philips-rwl021.json rename to tests/data/devices/philips-rwl021-0x43007305.json diff --git a/tests/data/devices/philips-sml001.json b/tests/data/devices/philips-sml001-0x42006bb7.json similarity index 100% rename from tests/data/devices/philips-sml001.json rename to tests/data/devices/philips-sml001-0x42006bb7.json diff --git a/tests/data/devices/plaid-systems-ps-sprzms-slp3.json b/tests/data/devices/plaid-systems-ps-sprzms-slp3-0x00000001.json similarity index 100% rename from tests/data/devices/plaid-systems-ps-sprzms-slp3.json rename to tests/data/devices/plaid-systems-ps-sprzms-slp3-0x00000001.json diff --git a/tests/data/devices/samjin-button.json b/tests/data/devices/samjin-button-0x00000011.json similarity index 100% rename from tests/data/devices/samjin-button.json rename to tests/data/devices/samjin-button-0x00000011.json diff --git a/tests/data/devices/samjin-multi.json b/tests/data/devices/samjin-multi-0x0000000b.json similarity index 100% rename from tests/data/devices/samjin-multi.json rename to tests/data/devices/samjin-multi-0x0000000b.json diff --git a/tests/data/devices/schneider-electric-eko07259.json b/tests/data/devices/schneider-electric-eko07259-0x01001d00.json similarity index 100% rename from tests/data/devices/schneider-electric-eko07259.json rename to tests/data/devices/schneider-electric-eko07259-0x01001d00.json diff --git a/tests/data/devices/schneider-electric-evsckt-outlet-1.json b/tests/data/devices/schneider-electric-evsckt-outlet-1-0x020a00ff.json similarity index 100% rename from tests/data/devices/schneider-electric-evsckt-outlet-1.json rename to tests/data/devices/schneider-electric-evsckt-outlet-1-0x020a00ff.json diff --git a/tests/data/devices/schneider-electric-nhmotion-unidim-1.json b/tests/data/devices/schneider-electric-nhmotion-unidim-1-0x020b0fff.json similarity index 100% rename from tests/data/devices/schneider-electric-nhmotion-unidim-1.json rename to tests/data/devices/schneider-electric-nhmotion-unidim-1-0x020b0fff.json diff --git a/tests/data/devices/schneider-electric-puck-shutter-1.json b/tests/data/devices/schneider-electric-puck-shutter-1-0x020c02ff.json similarity index 100% rename from tests/data/devices/schneider-electric-puck-shutter-1.json rename to tests/data/devices/schneider-electric-puck-shutter-1-0x020c02ff.json diff --git a/tests/data/devices/schneider-electric-s520619.json b/tests/data/devices/schneider-electric-s520619-0x01003500.json similarity index 100% rename from tests/data/devices/schneider-electric-s520619.json rename to tests/data/devices/schneider-electric-s520619-0x01003500.json diff --git a/tests/data/devices/schneider-electric-socket-outlet-1.json b/tests/data/devices/schneider-electric-socket-outlet-1-0x020612ff.json similarity index 100% rename from tests/data/devices/schneider-electric-socket-outlet-1.json rename to tests/data/devices/schneider-electric-socket-outlet-1-0x020612ff.json diff --git a/tests/data/devices/schneider-electric-socket-outlet-2.json b/tests/data/devices/schneider-electric-socket-outlet-2-0x020612ff.json similarity index 100% rename from tests/data/devices/schneider-electric-socket-outlet-2.json rename to tests/data/devices/schneider-electric-socket-outlet-2-0x020612ff.json diff --git a/tests/data/devices/sengled-e11-g13.json b/tests/data/devices/sengled-e11-g13-0x00000009.json similarity index 100% rename from tests/data/devices/sengled-e11-g13.json rename to tests/data/devices/sengled-e11-g13-0x00000009.json diff --git a/tests/data/devices/sengled-e12-n14.json b/tests/data/devices/sengled-e12-n14-0x00000004.json similarity index 100% rename from tests/data/devices/sengled-e12-n14.json rename to tests/data/devices/sengled-e12-n14-0x00000004.json diff --git a/tests/data/devices/sengled-e12-n1e.json b/tests/data/devices/sengled-e12-n1e-0x0000001e.json similarity index 100% rename from tests/data/devices/sengled-e12-n1e.json rename to tests/data/devices/sengled-e12-n1e-0x0000001e.json diff --git a/tests/data/devices/sengled-e1c-nb7.json b/tests/data/devices/sengled-e1c-nb7-0x0000001a.json similarity index 100% rename from tests/data/devices/sengled-e1c-nb7.json rename to tests/data/devices/sengled-e1c-nb7-0x0000001a.json diff --git a/tests/data/devices/sengled-e1f-n9g.json b/tests/data/devices/sengled-e1f-n9g-0x00000020.json similarity index 100% rename from tests/data/devices/sengled-e1f-n9g.json rename to tests/data/devices/sengled-e1f-n9g-0x00000020.json diff --git a/tests/data/devices/sengled-e1g-g8e.json b/tests/data/devices/sengled-e1g-g8e-0x0000000e.json old mode 100755 new mode 100644 similarity index 100% rename from tests/data/devices/sengled-e1g-g8e.json rename to tests/data/devices/sengled-e1g-g8e-0x0000000e.json diff --git a/tests/data/devices/sengled-e21-n1ea.json b/tests/data/devices/sengled-e21-n1ea-0x00000026.json similarity index 100% rename from tests/data/devices/sengled-e21-n1ea.json rename to tests/data/devices/sengled-e21-n1ea-0x00000026.json diff --git a/tests/data/devices/sengled-z01-a19nae26.json b/tests/data/devices/sengled-z01-a19nae26-0x00000020.json similarity index 100% rename from tests/data/devices/sengled-z01-a19nae26.json rename to tests/data/devices/sengled-z01-a19nae26-0x00000020.json diff --git a/tests/data/devices/signify-netherlands-b-v-lca001.json b/tests/data/devices/signify-netherlands-b-v-lca001-0x01002802.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-lca001.json rename to tests/data/devices/signify-netherlands-b-v-lca001-0x01002802.json diff --git a/tests/data/devices/signify-netherlands-b-v-lca005.json b/tests/data/devices/signify-netherlands-b-v-lca005-0x01002402.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-lca005.json rename to tests/data/devices/signify-netherlands-b-v-lca005-0x01002402.json diff --git a/tests/data/devices/signify-netherlands-b-v-lca007.json b/tests/data/devices/signify-netherlands-b-v-lca007-0x01001f0a.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-lca007.json rename to tests/data/devices/signify-netherlands-b-v-lca007-0x01001f0a.json diff --git a/tests/data/devices/signify-netherlands-b-v-lcb001.json b/tests/data/devices/signify-netherlands-b-v-lcb001-0x01002800.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-lcb001.json rename to tests/data/devices/signify-netherlands-b-v-lcb001-0x01002800.json diff --git a/tests/data/devices/signify-netherlands-b-v-lcb002.json b/tests/data/devices/signify-netherlands-b-v-lcb002-0x01001f0a.json old mode 100755 new mode 100644 similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-lcb002.json rename to tests/data/devices/signify-netherlands-b-v-lcb002-0x01001f0a.json diff --git a/tests/data/devices/signify-netherlands-b-v-lce001.json b/tests/data/devices/signify-netherlands-b-v-lce001-0x01002404.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-lce001.json rename to tests/data/devices/signify-netherlands-b-v-lce001-0x01002404.json diff --git a/tests/data/devices/signify-netherlands-b-v-lcg006.json b/tests/data/devices/signify-netherlands-b-v-lcg006-0x01002502.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-lcg006.json rename to tests/data/devices/signify-netherlands-b-v-lcg006-0x01002502.json diff --git a/tests/data/devices/signify-netherlands-b-v-lcx004.json b/tests/data/devices/signify-netherlands-b-v-lcx004-0x01001802.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-lcx004.json rename to tests/data/devices/signify-netherlands-b-v-lcx004-0x01001802.json diff --git a/tests/data/devices/signify-netherlands-b-v-lta010.json b/tests/data/devices/signify-netherlands-b-v-lta010-0x01002402.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-lta010.json rename to tests/data/devices/signify-netherlands-b-v-lta010-0x01002402.json diff --git a/tests/data/devices/signify-netherlands-b-v-ltb003.json b/tests/data/devices/signify-netherlands-b-v-ltb003-0x01001f0a.json old mode 100755 new mode 100644 similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-ltb003.json rename to tests/data/devices/signify-netherlands-b-v-ltb003-0x01001f0a.json diff --git a/tests/data/devices/signify-netherlands-b-v-lwa003.json b/tests/data/devices/signify-netherlands-b-v-lwa003-0x01001f0a.json old mode 100755 new mode 100644 similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-lwa003.json rename to tests/data/devices/signify-netherlands-b-v-lwa003-0x01001f0a.json diff --git a/tests/data/devices/signify-netherlands-b-v-rdm001.json b/tests/data/devices/signify-netherlands-b-v-rdm001-0x0000041a.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-rdm001.json rename to tests/data/devices/signify-netherlands-b-v-rdm001-0x0000041a.json diff --git a/tests/data/devices/signify-netherlands-b-v-rdm002.json b/tests/data/devices/signify-netherlands-b-v-rdm002-0x02003b19.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-rdm002.json rename to tests/data/devices/signify-netherlands-b-v-rdm002-0x02003b19.json diff --git a/tests/data/devices/signify-netherlands-b-v-rdm005.json b/tests/data/devices/signify-netherlands-b-v-rdm005-0x02005301.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-rdm005.json rename to tests/data/devices/signify-netherlands-b-v-rdm005-0x02005301.json diff --git a/tests/data/devices/signify-netherlands-b-v-rwl022.json b/tests/data/devices/signify-netherlands-b-v-rwl022-0x02002d02.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-rwl022.json rename to tests/data/devices/signify-netherlands-b-v-rwl022-0x02002d02.json diff --git a/tests/data/devices/signify-netherlands-b-v-sml003.json b/tests/data/devices/signify-netherlands-b-v-sml003-0x02003506.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-sml003.json rename to tests/data/devices/signify-netherlands-b-v-sml003-0x02003506.json diff --git a/tests/data/devices/signify-netherlands-b-v-sml004.json b/tests/data/devices/signify-netherlands-b-v-sml004-0x02003506.json similarity index 100% rename from tests/data/devices/signify-netherlands-b-v-sml004.json rename to tests/data/devices/signify-netherlands-b-v-sml004-0x02003506.json diff --git a/tests/data/devices/smartthings-multiv4.json b/tests/data/devices/smartthings-multiv4-0x0000001b.json similarity index 100% rename from tests/data/devices/smartthings-multiv4.json rename to tests/data/devices/smartthings-multiv4-0x0000001b.json diff --git a/tests/data/devices/smartthings-tagv4.json b/tests/data/devices/smartthings-tagv4-0x00000019.json similarity index 100% rename from tests/data/devices/smartthings-tagv4.json rename to tests/data/devices/smartthings-tagv4-0x00000019.json diff --git a/tests/data/devices/smartwings-wm25-l-z.json b/tests/data/devices/smartwings-wm25-l-z-0x00000002.json similarity index 100% rename from tests/data/devices/smartwings-wm25-l-z.json rename to tests/data/devices/smartwings-wm25-l-z-0x00000002.json diff --git a/tests/data/devices/somfy-situo-4-zigbee.json b/tests/data/devices/somfy-situo-4-zigbee-0x00011a00.json similarity index 100% rename from tests/data/devices/somfy-situo-4-zigbee.json rename to tests/data/devices/somfy-situo-4-zigbee-0x00011a00.json diff --git a/tests/data/devices/somfy-sonesse-28-wf-li-ion-roller.json b/tests/data/devices/somfy-sonesse-28-wf-li-ion-roller-0x4100e158.json similarity index 100% rename from tests/data/devices/somfy-sonesse-28-wf-li-ion-roller.json rename to tests/data/devices/somfy-sonesse-28-wf-li-ion-roller-0x4100e158.json diff --git a/tests/data/devices/somfy-ysia-5-hp-zigbee.json b/tests/data/devices/somfy-ysia-5-hp-zigbee-0x00e00041.json similarity index 100% rename from tests/data/devices/somfy-ysia-5-hp-zigbee.json rename to tests/data/devices/somfy-ysia-5-hp-zigbee-0x00e00041.json diff --git a/tests/data/devices/sonoff-mini-zbdim.json b/tests/data/devices/sonoff-mini-zbdim-0x00001005.json similarity index 100% rename from tests/data/devices/sonoff-mini-zbdim.json rename to tests/data/devices/sonoff-mini-zbdim-0x00001005.json diff --git a/tests/data/devices/sonoff-mini-zbrbs.json b/tests/data/devices/sonoff-mini-zbrbs-0x00001005.json similarity index 100% rename from tests/data/devices/sonoff-mini-zbrbs.json rename to tests/data/devices/sonoff-mini-zbrbs-0x00001005.json diff --git a/tests/data/devices/sonoff-s26r2zb.json b/tests/data/devices/sonoff-s26r2zb-0x00002000.json similarity index 100% rename from tests/data/devices/sonoff-s26r2zb.json rename to tests/data/devices/sonoff-s26r2zb-0x00002000.json diff --git a/tests/data/devices/sonoff-s60zbtpg.json b/tests/data/devices/sonoff-s60zbtpg-0x00001002.json similarity index 100% rename from tests/data/devices/sonoff-s60zbtpg.json rename to tests/data/devices/sonoff-s60zbtpg-0x00001002.json diff --git a/tests/data/devices/sonoff-snzb-01m.json b/tests/data/devices/sonoff-snzb-01m-0x00001005.json similarity index 100% rename from tests/data/devices/sonoff-snzb-01m.json rename to tests/data/devices/sonoff-snzb-01m-0x00001005.json diff --git a/tests/data/devices/sonoff-snzb-02d.json b/tests/data/devices/sonoff-snzb-02d-0x00002300.json similarity index 100% rename from tests/data/devices/sonoff-snzb-02d.json rename to tests/data/devices/sonoff-snzb-02d-0x00002300.json diff --git a/tests/data/devices/sonoff-snzb-04pr2.json b/tests/data/devices/sonoff-snzb-04pr2-0x00001001.json similarity index 100% rename from tests/data/devices/sonoff-snzb-04pr2.json rename to tests/data/devices/sonoff-snzb-04pr2-0x00001001.json diff --git a/tests/data/devices/sonoff-snzb-05p.json b/tests/data/devices/sonoff-snzb-05p-0x00001002.json similarity index 100% rename from tests/data/devices/sonoff-snzb-05p.json rename to tests/data/devices/sonoff-snzb-05p-0x00001002.json diff --git a/tests/data/devices/sonoff-snzb-06p.json b/tests/data/devices/sonoff-snzb-06p-0x00001006.json similarity index 100% rename from tests/data/devices/sonoff-snzb-06p.json rename to tests/data/devices/sonoff-snzb-06p-0x00001006.json diff --git a/tests/data/devices/sonoff-swv.json b/tests/data/devices/sonoff-swv-0x00001002.json similarity index 100% rename from tests/data/devices/sonoff-swv.json rename to tests/data/devices/sonoff-swv-0x00001002.json diff --git a/tests/data/devices/sonoff-trvzb.json b/tests/data/devices/sonoff-trvzb-0x00001201.json similarity index 100% rename from tests/data/devices/sonoff-trvzb.json rename to tests/data/devices/sonoff-trvzb-0x00001201.json diff --git a/tests/data/devices/sonoff-zbmicro.json b/tests/data/devices/sonoff-zbmicro-0x00001005.json similarity index 100% rename from tests/data/devices/sonoff-zbmicro.json rename to tests/data/devices/sonoff-zbmicro-0x00001005.json diff --git a/tests/data/devices/sonoff-zbminil2.json b/tests/data/devices/sonoff-zbminil2-0x0000100e.json similarity index 100% rename from tests/data/devices/sonoff-zbminil2.json rename to tests/data/devices/sonoff-zbminil2-0x0000100e.json diff --git a/tests/data/devices/sonoff-zbminir2.json b/tests/data/devices/sonoff-zbminir2-0x00001004.json similarity index 100% rename from tests/data/devices/sonoff-zbminir2.json rename to tests/data/devices/sonoff-zbminir2-0x00001004.json diff --git a/tests/data/devices/sunricher-hk-dim.json b/tests/data/devices/sunricher-hk-dim-0x00000036.json similarity index 100% rename from tests/data/devices/sunricher-hk-dim.json rename to tests/data/devices/sunricher-hk-dim-0x00000036.json diff --git a/tests/data/devices/sunricher-hk-ln-dim-a.json b/tests/data/devices/sunricher-hk-ln-dim-a-0x00000039.json similarity index 100% rename from tests/data/devices/sunricher-hk-ln-dim-a.json rename to tests/data/devices/sunricher-hk-ln-dim-a-0x00000039.json diff --git a/tests/data/devices/sunricher-on-off-2ch.json b/tests/data/devices/sunricher-on-off-2ch-0x00000004.json similarity index 100% rename from tests/data/devices/sunricher-on-off-2ch.json rename to tests/data/devices/sunricher-on-off-2ch-0x00000004.json diff --git a/tests/data/devices/the-home-depot-ecosmart-zbt-a19-cct-bulb.json b/tests/data/devices/the-home-depot-ecosmart-zbt-a19-cct-bulb-0x21036500.json similarity index 100% rename from tests/data/devices/the-home-depot-ecosmart-zbt-a19-cct-bulb.json rename to tests/data/devices/the-home-depot-ecosmart-zbt-a19-cct-bulb-0x21036500.json diff --git a/tests/data/devices/third-reality-inc-3rap0149bz.json b/tests/data/devices/third-reality-inc-3rap0149bz-0x0000000e.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rap0149bz.json rename to tests/data/devices/third-reality-inc-3rap0149bz-0x0000000e.json diff --git a/tests/data/devices/third-reality-inc-3rms16bz.json b/tests/data/devices/third-reality-inc-3rms16bz-0x0000004f.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rms16bz.json rename to tests/data/devices/third-reality-inc-3rms16bz-0x0000004f.json diff --git a/tests/data/devices/third-reality-inc-3rsb015bz.json b/tests/data/devices/third-reality-inc-3rsb015bz-0x00000048.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rsb015bz.json rename to tests/data/devices/third-reality-inc-3rsb015bz-0x00000048.json diff --git a/tests/data/devices/third-reality-inc-3rsm0147z.json b/tests/data/devices/third-reality-inc-3rsm0147z-0x0000001f.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rsm0147z.json rename to tests/data/devices/third-reality-inc-3rsm0147z-0x0000001f.json diff --git a/tests/data/devices/third-reality-inc-3rsnl02043z.json b/tests/data/devices/third-reality-inc-3rsnl02043z-0x0000003c.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rsnl02043z.json rename to tests/data/devices/third-reality-inc-3rsnl02043z-0x0000003c.json diff --git a/tests/data/devices/third-reality-inc-3rsp019bz.json b/tests/data/devices/third-reality-inc-3rsp019bz-0x1001301e.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rsp019bz.json rename to tests/data/devices/third-reality-inc-3rsp019bz-0x1001301e.json diff --git a/tests/data/devices/third-reality-inc-3rsp02028bz.json b/tests/data/devices/third-reality-inc-3rsp02028bz-0x10013058.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rsp02028bz.json rename to tests/data/devices/third-reality-inc-3rsp02028bz-0x10013058.json diff --git a/tests/data/devices/third-reality-inc-3rsp02064z.json b/tests/data/devices/third-reality-inc-3rsp02064z-0x0000002f.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rsp02064z.json rename to tests/data/devices/third-reality-inc-3rsp02064z-0x0000002f.json diff --git a/tests/data/devices/third-reality-inc-3rss009z.json b/tests/data/devices/third-reality-inc-3rss009z-0x0000001d.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rss009z.json rename to tests/data/devices/third-reality-inc-3rss009z-0x0000001d.json diff --git a/tests/data/devices/third-reality-inc-3rths24bz.json b/tests/data/devices/third-reality-inc-3rths24bz-0x00000015.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rths24bz.json rename to tests/data/devices/third-reality-inc-3rths24bz-0x00000015.json diff --git a/tests/data/devices/third-reality-inc-3rvs01031z.json b/tests/data/devices/third-reality-inc-3rvs01031z-0x00000028.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rvs01031z.json rename to tests/data/devices/third-reality-inc-3rvs01031z-0x00000028.json diff --git a/tests/data/devices/third-reality-inc-3rws18bz.json b/tests/data/devices/third-reality-inc-3rws18bz-0x00000038.json similarity index 100% rename from tests/data/devices/third-reality-inc-3rws18bz.json rename to tests/data/devices/third-reality-inc-3rws18bz-0x00000038.json diff --git a/tests/data/devices/tyst11-i5j6ifxj-5j6ifxj.json b/tests/data/devices/tyst11-i5j6ifxj-5j6ifxj-0x00000049.json similarity index 100% rename from tests/data/devices/tyst11-i5j6ifxj-5j6ifxj.json rename to tests/data/devices/tyst11-i5j6ifxj-5j6ifxj-0x00000049.json diff --git a/tests/data/devices/tyzb01-o63ssaah-ts0207.json b/tests/data/devices/tyzb01-o63ssaah-ts0207-0x00000043.json similarity index 100% rename from tests/data/devices/tyzb01-o63ssaah-ts0207.json rename to tests/data/devices/tyzb01-o63ssaah-ts0207-0x00000043.json diff --git a/tests/data/devices/tyzb01-qm6djpta-ts0215.json b/tests/data/devices/tyzb01-qm6djpta-ts0215-0x00000046.json similarity index 100% rename from tests/data/devices/tyzb01-qm6djpta-ts0215.json rename to tests/data/devices/tyzb01-qm6djpta-ts0215-0x00000046.json diff --git a/tests/data/devices/tyzb01-rifa0wlb-ts0011.json b/tests/data/devices/tyzb01-rifa0wlb-ts0011-0x00000041.json old mode 100755 new mode 100644 similarity index 100% rename from tests/data/devices/tyzb01-rifa0wlb-ts0011.json rename to tests/data/devices/tyzb01-rifa0wlb-ts0011-0x00000041.json diff --git a/tests/data/devices/tz3000-1dd0d5yi-ts130f.json b/tests/data/devices/tz3000-1dd0d5yi-ts130f-0x00000047.json similarity index 100% rename from tests/data/devices/tz3000-1dd0d5yi-ts130f.json rename to tests/data/devices/tz3000-1dd0d5yi-ts130f-0x00000047.json diff --git a/tests/data/devices/tz3000-1o6x1bl0-ts0201.json b/tests/data/devices/tz3000-1o6x1bl0-ts0201-0x00000041.json similarity index 100% rename from tests/data/devices/tz3000-1o6x1bl0-ts0201.json rename to tests/data/devices/tz3000-1o6x1bl0-ts0201-0x00000041.json diff --git a/tests/data/devices/tz3000-3ias4w4o-ts011f.json b/tests/data/devices/tz3000-3ias4w4o-ts011f-0x0000004e.json similarity index 100% rename from tests/data/devices/tz3000-3ias4w4o-ts011f.json rename to tests/data/devices/tz3000-3ias4w4o-ts011f-0x0000004e.json diff --git a/tests/data/devices/tz3000-8nkb7mof-ts0121.json b/tests/data/devices/tz3000-8nkb7mof-ts0121-0x00000042.json similarity index 100% rename from tests/data/devices/tz3000-8nkb7mof-ts0121.json rename to tests/data/devices/tz3000-8nkb7mof-ts0121-0x00000042.json diff --git a/tests/data/devices/tz3000-bgsigers-ts0201.json b/tests/data/devices/tz3000-bgsigers-ts0201-0x00000040.json similarity index 100% rename from tests/data/devices/tz3000-bgsigers-ts0201.json rename to tests/data/devices/tz3000-bgsigers-ts0201-0x00000040.json diff --git a/tests/data/devices/tz3000-bguser20-ts0201.json b/tests/data/devices/tz3000-bguser20-ts0201-0x00000045.json similarity index 100% rename from tests/data/devices/tz3000-bguser20-ts0201.json rename to tests/data/devices/tz3000-bguser20-ts0201-0x00000045.json diff --git a/tests/data/devices/tz3000-cehuw1lw-ts011f.json b/tests/data/devices/tz3000-cehuw1lw-ts011f-0x0000004d.json similarity index 100% rename from tests/data/devices/tz3000-cehuw1lw-ts011f.json rename to tests/data/devices/tz3000-cehuw1lw-ts011f-0x0000004d.json diff --git a/tests/data/devices/tz3000-cicwjqth-ts011f.json b/tests/data/devices/tz3000-cicwjqth-ts011f-0x74013001.json similarity index 100% rename from tests/data/devices/tz3000-cicwjqth-ts011f.json rename to tests/data/devices/tz3000-cicwjqth-ts011f-0x74013001.json diff --git a/tests/data/devices/tz3000-drc9tuqb-ts0001.json b/tests/data/devices/tz3000-drc9tuqb-ts0001-0x00000047.json similarity index 100% rename from tests/data/devices/tz3000-drc9tuqb-ts0001.json rename to tests/data/devices/tz3000-drc9tuqb-ts0001-0x00000047.json diff --git a/tests/data/devices/tz3000-eamtuojw-ts0201.json b/tests/data/devices/tz3000-eamtuojw-ts0201-0x00000041.json similarity index 100% rename from tests/data/devices/tz3000-eamtuojw-ts0201.json rename to tests/data/devices/tz3000-eamtuojw-ts0201-0x00000041.json diff --git a/tests/data/devices/tz3000-f2bw0b6k-ts0201.json b/tests/data/devices/tz3000-f2bw0b6k-ts0201-0x00000046.json similarity index 100% rename from tests/data/devices/tz3000-f2bw0b6k-ts0201.json rename to tests/data/devices/tz3000-f2bw0b6k-ts0201-0x00000046.json diff --git a/tests/data/devices/tz3000-famkxci2-ts0043.json b/tests/data/devices/tz3000-famkxci2-ts0043-0x00000044.json similarity index 100% rename from tests/data/devices/tz3000-famkxci2-ts0043.json rename to tests/data/devices/tz3000-famkxci2-ts0043-0x00000044.json diff --git a/tests/data/devices/tz3000-gbm10jnj-ts0043.json b/tests/data/devices/tz3000-gbm10jnj-ts0043-0x00000042.json similarity index 100% rename from tests/data/devices/tz3000-gbm10jnj-ts0043.json rename to tests/data/devices/tz3000-gbm10jnj-ts0043-0x00000042.json diff --git a/tests/data/devices/tz3000-gjpgagal-ts0049.json b/tests/data/devices/tz3000-gjpgagal-ts0049-0x00000049.json similarity index 100% rename from tests/data/devices/tz3000-gjpgagal-ts0049.json rename to tests/data/devices/tz3000-gjpgagal-ts0049-0x00000049.json diff --git a/tests/data/devices/tz3000-hafsqare-ts0011.json b/tests/data/devices/tz3000-hafsqare-ts0011-0x00000050.json similarity index 100% rename from tests/data/devices/tz3000-hafsqare-ts0011.json rename to tests/data/devices/tz3000-hafsqare-ts0011-0x00000050.json diff --git a/tests/data/devices/tz3000-idhkkbqj-ts0012.json b/tests/data/devices/tz3000-idhkkbqj-ts0012-0x00000041.json similarity index 100% rename from tests/data/devices/tz3000-idhkkbqj-ts0012.json rename to tests/data/devices/tz3000-idhkkbqj-ts0012-0x00000041.json diff --git a/tests/data/devices/tz3000-isw9u95y-ts0201.json b/tests/data/devices/tz3000-isw9u95y-ts0201-0x00000040.json similarity index 100% rename from tests/data/devices/tz3000-isw9u95y-ts0201.json rename to tests/data/devices/tz3000-isw9u95y-ts0201-0x00000040.json diff --git a/tests/data/devices/tz3000-itnrsufe-ts0201.json b/tests/data/devices/tz3000-itnrsufe-ts0201-0x00000042.json similarity index 100% rename from tests/data/devices/tz3000-itnrsufe-ts0201.json rename to tests/data/devices/tz3000-itnrsufe-ts0201-0x00000042.json diff --git a/tests/data/devices/tz3000-j1xl73iw-ts130f.json b/tests/data/devices/tz3000-j1xl73iw-ts130f-0x00000046.json similarity index 100% rename from tests/data/devices/tz3000-j1xl73iw-ts130f.json rename to tests/data/devices/tz3000-j1xl73iw-ts130f-0x00000046.json diff --git a/tests/data/devices/tz3000-ja5osu5g-ts004f.json b/tests/data/devices/tz3000-ja5osu5g-ts004f-0x00000041.json similarity index 100% rename from tests/data/devices/tz3000-ja5osu5g-ts004f.json rename to tests/data/devices/tz3000-ja5osu5g-ts004f-0x00000041.json diff --git a/tests/data/devices/tz3000-kqvb5akv-ts0001.json b/tests/data/devices/tz3000-kqvb5akv-ts0001-0x0000004a.json similarity index 100% rename from tests/data/devices/tz3000-kqvb5akv-ts0001.json rename to tests/data/devices/tz3000-kqvb5akv-ts0001-0x0000004a.json diff --git a/tests/data/devices/tz3000-mgusv51k-ts0052.json b/tests/data/devices/tz3000-mgusv51k-ts0052-0x00000044.json similarity index 100% rename from tests/data/devices/tz3000-mgusv51k-ts0052.json rename to tests/data/devices/tz3000-mgusv51k-ts0052-0x00000044.json diff --git a/tests/data/devices/tz3000-mkhkxx1p-ts0001.json b/tests/data/devices/tz3000-mkhkxx1p-ts0001-0x00000048.json similarity index 100% rename from tests/data/devices/tz3000-mkhkxx1p-ts0001.json rename to tests/data/devices/tz3000-mkhkxx1p-ts0001-0x00000048.json diff --git a/tests/data/devices/tz3000-mugyhz0q-ts0207.json b/tests/data/devices/tz3000-mugyhz0q-ts0207-0x00000041.json similarity index 100% rename from tests/data/devices/tz3000-mugyhz0q-ts0207.json rename to tests/data/devices/tz3000-mugyhz0q-ts0207-0x00000041.json diff --git a/tests/data/devices/tz3000-mw1pqqqt-ts0003.json b/tests/data/devices/tz3000-mw1pqqqt-ts0003-0x0000004a.json similarity index 100% rename from tests/data/devices/tz3000-mw1pqqqt-ts0003.json rename to tests/data/devices/tz3000-mw1pqqqt-ts0003-0x0000004a.json diff --git a/tests/data/devices/tz3000-o1jzcxou-ts011f.json b/tests/data/devices/tz3000-o1jzcxou-ts011f-0x00000043.json similarity index 100% rename from tests/data/devices/tz3000-o1jzcxou-ts011f.json rename to tests/data/devices/tz3000-o1jzcxou-ts011f-0x00000043.json diff --git a/tests/data/devices/tz3000-o4mkahkc-ts0202.json b/tests/data/devices/tz3000-o4mkahkc-ts0202-0x00000046.json similarity index 100% rename from tests/data/devices/tz3000-o4mkahkc-ts0202.json rename to tests/data/devices/tz3000-o4mkahkc-ts0202-0x00000046.json diff --git a/tests/data/devices/tz3000-p26flek3-ts0001.json b/tests/data/devices/tz3000-p26flek3-ts0001-0x00000053.json similarity index 100% rename from tests/data/devices/tz3000-p26flek3-ts0001.json rename to tests/data/devices/tz3000-p26flek3-ts0001-0x00000053.json diff --git a/tests/data/devices/tz3000-pl5v1yyy-ts011f.json b/tests/data/devices/tz3000-pl5v1yyy-ts011f-0x00000050.json similarity index 100% rename from tests/data/devices/tz3000-pl5v1yyy-ts011f.json rename to tests/data/devices/tz3000-pl5v1yyy-ts011f-0x00000050.json diff --git a/tests/data/devices/tz3000-qdnrzbd3-ts0202.json b/tests/data/devices/tz3000-qdnrzbd3-ts0202-0x00000046.json similarity index 100% rename from tests/data/devices/tz3000-qdnrzbd3-ts0202.json rename to tests/data/devices/tz3000-qdnrzbd3-ts0202-0x00000046.json diff --git a/tests/data/devices/tz3000-sgb0xhwn-ts011f.json b/tests/data/devices/tz3000-sgb0xhwn-ts011f-0x00000050.json similarity index 100% rename from tests/data/devices/tz3000-sgb0xhwn-ts011f.json rename to tests/data/devices/tz3000-sgb0xhwn-ts011f-0x00000050.json diff --git a/tests/data/devices/tz3000-tqlv4ug4-ts0001.json b/tests/data/devices/tz3000-tqlv4ug4-ts0001-0x00000048.json similarity index 100% rename from tests/data/devices/tz3000-tqlv4ug4-ts0001.json rename to tests/data/devices/tz3000-tqlv4ug4-ts0001-0x00000048.json diff --git a/tests/data/devices/tz3000-typdpbpg-ts011f.json b/tests/data/devices/tz3000-typdpbpg-ts011f-0x10013607.json similarity index 100% rename from tests/data/devices/tz3000-typdpbpg-ts011f.json rename to tests/data/devices/tz3000-typdpbpg-ts011f-0x10013607.json diff --git a/tests/data/devices/tz3000-u3oupgdy-ts0004.json b/tests/data/devices/tz3000-u3oupgdy-ts0004-0x00000050.json similarity index 100% rename from tests/data/devices/tz3000-u3oupgdy-ts0004.json rename to tests/data/devices/tz3000-u3oupgdy-ts0004-0x00000050.json diff --git a/tests/data/devices/tz3000-u4kojtqz-ts0002.json b/tests/data/devices/tz3000-u4kojtqz-ts0002-0x10013607.json similarity index 100% rename from tests/data/devices/tz3000-u4kojtqz-ts0002.json rename to tests/data/devices/tz3000-u4kojtqz-ts0002-0x10013607.json diff --git a/tests/data/devices/tz3000-uwkja6z1-ts011f.json b/tests/data/devices/tz3000-uwkja6z1-ts011f-0x00000045.json similarity index 100% rename from tests/data/devices/tz3000-uwkja6z1-ts011f.json rename to tests/data/devices/tz3000-uwkja6z1-ts011f-0x00000045.json diff --git a/tests/data/devices/tz3000-vw8pawxa-ts130f.json b/tests/data/devices/tz3000-vw8pawxa-ts130f-0x00000048.json similarity index 100% rename from tests/data/devices/tz3000-vw8pawxa-ts130f.json rename to tests/data/devices/tz3000-vw8pawxa-ts130f-0x00000048.json diff --git a/tests/data/devices/tz3000-wcgyhnp3-ts0222.json b/tests/data/devices/tz3000-wcgyhnp3-ts0222-0x00000045.json similarity index 100% rename from tests/data/devices/tz3000-wcgyhnp3-ts0222.json rename to tests/data/devices/tz3000-wcgyhnp3-ts0222-0x00000045.json diff --git a/tests/data/devices/tz3000-wn65ixz9-ts0001.json b/tests/data/devices/tz3000-wn65ixz9-ts0001-0x00000051.json similarity index 100% rename from tests/data/devices/tz3000-wn65ixz9-ts0001.json rename to tests/data/devices/tz3000-wn65ixz9-ts0001-0x00000051.json diff --git a/tests/data/devices/tz3000-yj6k7vfo-ts0041.json b/tests/data/devices/tz3000-yj6k7vfo-ts0041-0x00000044.json similarity index 100% rename from tests/data/devices/tz3000-yj6k7vfo-ts0041.json rename to tests/data/devices/tz3000-yj6k7vfo-ts0041-0x00000044.json diff --git a/tests/data/devices/tz3000-zl1kmjqx.json b/tests/data/devices/tz3000-zl1kmjqx-0x10013001.json similarity index 100% rename from tests/data/devices/tz3000-zl1kmjqx.json rename to tests/data/devices/tz3000-zl1kmjqx-0x10013001.json diff --git a/tests/data/devices/tz3000-zw7yf6yk-ts0001.json b/tests/data/devices/tz3000-zw7yf6yk-ts0001-0x00000048.json similarity index 100% rename from tests/data/devices/tz3000-zw7yf6yk-ts0001.json rename to tests/data/devices/tz3000-zw7yf6yk-ts0001-0x00000048.json diff --git a/tests/data/devices/tz3002-vaq2bfcu-ts0726.json b/tests/data/devices/tz3002-vaq2bfcu-ts0726-0x00000051.json similarity index 100% rename from tests/data/devices/tz3002-vaq2bfcu-ts0726.json rename to tests/data/devices/tz3002-vaq2bfcu-ts0726-0x00000051.json diff --git a/tests/data/devices/tz3002-zjuvw9zf-ts0726.json b/tests/data/devices/tz3002-zjuvw9zf-ts0726-0x00000055.json similarity index 100% rename from tests/data/devices/tz3002-zjuvw9zf-ts0726.json rename to tests/data/devices/tz3002-zjuvw9zf-ts0726-0x00000055.json diff --git a/tests/data/devices/tz3040-bb6xaihh-ts0202.json b/tests/data/devices/tz3040-bb6xaihh-ts0202-0x00000048.json similarity index 100% rename from tests/data/devices/tz3040-bb6xaihh-ts0202.json rename to tests/data/devices/tz3040-bb6xaihh-ts0202-0x00000048.json diff --git a/tests/data/devices/tz3210-09hzmirw-ts0502b.json b/tests/data/devices/tz3210-09hzmirw-ts0502b-0x0000005b.json similarity index 100% rename from tests/data/devices/tz3210-09hzmirw-ts0502b.json rename to tests/data/devices/tz3210-09hzmirw-ts0502b-0x0000005b.json diff --git a/tests/data/devices/tz3210-3mpwqzuu-ts110e.json b/tests/data/devices/tz3210-3mpwqzuu-ts110e-0x00000040.json similarity index 100% rename from tests/data/devices/tz3210-3mpwqzuu-ts110e.json rename to tests/data/devices/tz3210-3mpwqzuu-ts110e-0x00000040.json diff --git a/tests/data/devices/tz3210-7vgttna6-ts0001.json b/tests/data/devices/tz3210-7vgttna6-ts0001-0x00000073.json similarity index 100% rename from tests/data/devices/tz3210-7vgttna6-ts0001.json rename to tests/data/devices/tz3210-7vgttna6-ts0001-0x00000073.json diff --git a/tests/data/devices/tz3210-a04acm9s-ts0001.json b/tests/data/devices/tz3210-a04acm9s-ts0001-0x00000077.json similarity index 100% rename from tests/data/devices/tz3210-a04acm9s-ts0001.json rename to tests/data/devices/tz3210-a04acm9s-ts0001-0x00000077.json diff --git a/tests/data/devices/tz3210-comkuwws-ts0502b.json b/tests/data/devices/tz3210-comkuwws-ts0502b-0x00000065.json similarity index 100% rename from tests/data/devices/tz3210-comkuwws-ts0502b.json rename to tests/data/devices/tz3210-comkuwws-ts0502b-0x00000065.json diff --git a/tests/data/devices/tz3210-dwytrmda-ts130f.json b/tests/data/devices/tz3210-dwytrmda-ts130f-0x00000042.json similarity index 100% rename from tests/data/devices/tz3210-dwytrmda-ts130f.json rename to tests/data/devices/tz3210-dwytrmda-ts130f-0x00000042.json diff --git a/tests/data/devices/tz3210-ehcanwyc-ts0502b.json b/tests/data/devices/tz3210-ehcanwyc-ts0502b-0x00000065.json similarity index 100% rename from tests/data/devices/tz3210-ehcanwyc-ts0502b.json rename to tests/data/devices/tz3210-ehcanwyc-ts0502b-0x00000065.json diff --git a/tests/data/devices/tz3210-j4pdtz9v-ts0001.json b/tests/data/devices/tz3210-j4pdtz9v-ts0001-0x00000062.json similarity index 100% rename from tests/data/devices/tz3210-j4pdtz9v-ts0001.json rename to tests/data/devices/tz3210-j4pdtz9v-ts0001-0x00000062.json diff --git a/tests/data/devices/tz3210-jaap6jeb-ts0505b.json b/tests/data/devices/tz3210-jaap6jeb-ts0505b-0x00000065.json similarity index 100% rename from tests/data/devices/tz3210-jaap6jeb-ts0505b.json rename to tests/data/devices/tz3210-jaap6jeb-ts0505b-0x00000065.json diff --git a/tests/data/devices/tz3210-jtifm80b-ts0502b.json b/tests/data/devices/tz3210-jtifm80b-ts0502b-0x00000065.json similarity index 100% rename from tests/data/devices/tz3210-jtifm80b-ts0502b.json rename to tests/data/devices/tz3210-jtifm80b-ts0502b-0x00000065.json diff --git a/tests/data/devices/tz3210-k1msuvg6-ts110e.json b/tests/data/devices/tz3210-k1msuvg6-ts110e-0x00000040.json similarity index 100% rename from tests/data/devices/tz3210-k1msuvg6-ts110e.json rename to tests/data/devices/tz3210-k1msuvg6-ts110e-0x00000040.json diff --git a/tests/data/devices/tz3210-kjafhwd2-ts0210.json b/tests/data/devices/tz3210-kjafhwd2-ts0210-0x00000044.json similarity index 100% rename from tests/data/devices/tz3210-kjafhwd2-ts0210.json rename to tests/data/devices/tz3210-kjafhwd2-ts0210-0x00000044.json diff --git a/tests/data/devices/tz3210-klv2wul0-ts0505b.json b/tests/data/devices/tz3210-klv2wul0-ts0505b-0x00000065.json similarity index 100% rename from tests/data/devices/tz3210-klv2wul0-ts0505b.json rename to tests/data/devices/tz3210-klv2wul0-ts0505b-0x00000065.json diff --git a/tests/data/devices/tz3210-ncw88jfq-ts0201.json b/tests/data/devices/tz3210-ncw88jfq-ts0201-0x00000083.json similarity index 100% rename from tests/data/devices/tz3210-ncw88jfq-ts0201.json rename to tests/data/devices/tz3210-ncw88jfq-ts0201-0x00000083.json diff --git a/tests/data/devices/tz3210-qkj7rujp-ts0201.json b/tests/data/devices/tz3210-qkj7rujp-ts0201-0x00000043.json similarity index 100% rename from tests/data/devices/tz3210-qkj7rujp-ts0201.json rename to tests/data/devices/tz3210-qkj7rujp-ts0201-0x00000043.json diff --git a/tests/data/devices/tz3210-r5afgmkl-ts0505b.json b/tests/data/devices/tz3210-r5afgmkl-ts0505b-0x10013607.json similarity index 100% rename from tests/data/devices/tz3210-r5afgmkl-ts0505b.json rename to tests/data/devices/tz3210-r5afgmkl-ts0505b-0x10013607.json diff --git a/tests/data/devices/tz3210-ru41azca-ts0049.json b/tests/data/devices/tz3210-ru41azca-ts0049-0x00000040.json similarity index 100% rename from tests/data/devices/tz3210-ru41azca-ts0049.json rename to tests/data/devices/tz3210-ru41azca-ts0049-0x00000040.json diff --git a/tests/data/devices/tz3210-sb8x2xci-ts0001.json b/tests/data/devices/tz3210-sb8x2xci-ts0001-0x00000047.json similarity index 100% rename from tests/data/devices/tz3210-sb8x2xci-ts0001.json rename to tests/data/devices/tz3210-sb8x2xci-ts0001-0x00000047.json diff --git a/tests/data/devices/tz3210-tgvtvdoc-ts0207.json b/tests/data/devices/tz3210-tgvtvdoc-ts0207-0x00000043.json similarity index 100% rename from tests/data/devices/tz3210-tgvtvdoc-ts0207.json rename to tests/data/devices/tz3210-tgvtvdoc-ts0207-0x00000043.json diff --git a/tests/data/devices/tz3210-u1dreag7-ts0502b.json b/tests/data/devices/tz3210-u1dreag7-ts0502b-0x00000065.json similarity index 100% rename from tests/data/devices/tz3210-u1dreag7-ts0502b.json rename to tests/data/devices/tz3210-u1dreag7-ts0502b-0x00000065.json diff --git a/tests/data/devices/tz3210-ue9kyjnj-ts0502b.json b/tests/data/devices/tz3210-ue9kyjnj-ts0502b-0x00000059.json similarity index 100% rename from tests/data/devices/tz3210-ue9kyjnj-ts0502b.json rename to tests/data/devices/tz3210-ue9kyjnj-ts0502b-0x00000059.json diff --git a/tests/data/devices/tz3210-wuhzzfqg-ts0202.json b/tests/data/devices/tz3210-wuhzzfqg-ts0202-0x000000a1.json similarity index 100% rename from tests/data/devices/tz3210-wuhzzfqg-ts0202.json rename to tests/data/devices/tz3210-wuhzzfqg-ts0202-0x000000a1.json diff --git a/tests/data/devices/tz3210-zdrhqmo0-ts0502b.json b/tests/data/devices/tz3210-zdrhqmo0-ts0502b-0x00000064.json similarity index 100% rename from tests/data/devices/tz3210-zdrhqmo0-ts0502b.json rename to tests/data/devices/tz3210-zdrhqmo0-ts0502b-0x00000064.json diff --git a/tests/data/devices/tz3218-7fiyo3kv-ts000f.json b/tests/data/devices/tz3218-7fiyo3kv-ts000f-0x00000051.json similarity index 100% rename from tests/data/devices/tz3218-7fiyo3kv-ts000f.json rename to tests/data/devices/tz3218-7fiyo3kv-ts000f-0x00000051.json diff --git a/tests/data/devices/tz3218-t9ynfz4x-ts0225.json b/tests/data/devices/tz3218-t9ynfz4x-ts0225-0x00000045.json similarity index 100% rename from tests/data/devices/tz3218-t9ynfz4x-ts0225.json rename to tests/data/devices/tz3218-t9ynfz4x-ts0225-0x00000045.json diff --git a/tests/data/devices/tz3218-ya5d6wth-ts000f.json b/tests/data/devices/tz3218-ya5d6wth-ts000f-0x00000064.json similarity index 100% rename from tests/data/devices/tz3218-ya5d6wth-ts000f.json rename to tests/data/devices/tz3218-ya5d6wth-ts000f-0x00000064.json diff --git a/tests/data/devices/tz3290-ot6ewjvmejq5ekhl-ts1201.json b/tests/data/devices/tz3290-ot6ewjvmejq5ekhl-ts1201-0x00000043.json similarity index 100% rename from tests/data/devices/tz3290-ot6ewjvmejq5ekhl-ts1201.json rename to tests/data/devices/tz3290-ot6ewjvmejq5ekhl-ts1201-0x00000043.json diff --git a/tests/data/devices/tz6210-duv6fhwt-ts0601.json b/tests/data/devices/tz6210-duv6fhwt-ts0601-0x00000042.json similarity index 100% rename from tests/data/devices/tz6210-duv6fhwt-ts0601.json rename to tests/data/devices/tz6210-duv6fhwt-ts0601-0x00000042.json diff --git a/tests/data/devices/tzb210-417ikxay-ts0505b.json b/tests/data/devices/tzb210-417ikxay-ts0505b-0x00000040.json similarity index 100% rename from tests/data/devices/tzb210-417ikxay-ts0505b.json rename to tests/data/devices/tzb210-417ikxay-ts0505b-0x00000040.json diff --git a/tests/data/devices/tzb210-lmqquxus-ts0502b.json b/tests/data/devices/tzb210-lmqquxus-ts0502b-0x00000040.json similarity index 100% rename from tests/data/devices/tzb210-lmqquxus-ts0502b.json rename to tests/data/devices/tzb210-lmqquxus-ts0502b-0x00000040.json diff --git a/tests/data/devices/tzb210-rawkvnnm-ts0502b.json b/tests/data/devices/tzb210-rawkvnnm-ts0502b-0x00000040.json similarity index 100% rename from tests/data/devices/tzb210-rawkvnnm-ts0502b.json rename to tests/data/devices/tzb210-rawkvnnm-ts0502b-0x00000040.json diff --git a/tests/data/devices/tze200-2se8efxh-ts0601.json b/tests/data/devices/tze200-2se8efxh-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-2se8efxh-ts0601.json rename to tests/data/devices/tze200-2se8efxh-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-3t91nb6k-ts0601.json b/tests/data/devices/tze200-3t91nb6k-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-3t91nb6k-ts0601.json rename to tests/data/devices/tze200-3t91nb6k-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-3towulqd-ts0601.json b/tests/data/devices/tze200-3towulqd-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-3towulqd-ts0601.json rename to tests/data/devices/tze200-3towulqd-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-4utwozi2-ts0601.json b/tests/data/devices/tze200-4utwozi2-ts0601-0x00000043.json similarity index 100% rename from tests/data/devices/tze200-4utwozi2-ts0601.json rename to tests/data/devices/tze200-4utwozi2-ts0601-0x00000043.json diff --git a/tests/data/devices/tze200-579lguh2-ts0601.json b/tests/data/devices/tze200-579lguh2-ts0601-0x00000044.json similarity index 100% rename from tests/data/devices/tze200-579lguh2-ts0601.json rename to tests/data/devices/tze200-579lguh2-ts0601-0x00000044.json diff --git a/tests/data/devices/tze200-7bztmfm1-ts0601.json b/tests/data/devices/tze200-7bztmfm1-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-7bztmfm1-ts0601.json rename to tests/data/devices/tze200-7bztmfm1-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-7iqgciln-ts0601.json b/tests/data/devices/tze200-7iqgciln-ts0601-0x00000041.json similarity index 100% rename from tests/data/devices/tze200-7iqgciln-ts0601.json rename to tests/data/devices/tze200-7iqgciln-ts0601-0x00000041.json diff --git a/tests/data/devices/tze200-7ytb3h8u-ts0601.json b/tests/data/devices/tze200-7ytb3h8u-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-7ytb3h8u-ts0601.json rename to tests/data/devices/tze200-7ytb3h8u-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-81isopgh-ts0601.json b/tests/data/devices/tze200-81isopgh-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-81isopgh-ts0601.json rename to tests/data/devices/tze200-81isopgh-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-8whfphjv-ts0601.json b/tests/data/devices/tze200-8whfphjv-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-8whfphjv-ts0601.json rename to tests/data/devices/tze200-8whfphjv-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-9caxna4s-ts0301.json b/tests/data/devices/tze200-9caxna4s-ts0301-0x00000049.json similarity index 100% rename from tests/data/devices/tze200-9caxna4s-ts0301.json rename to tests/data/devices/tze200-9caxna4s-ts0301-0x00000049.json diff --git a/tests/data/devices/tze200-9xfjixap-ts0601.json b/tests/data/devices/tze200-9xfjixap-ts0601-0x00000043.json similarity index 100% rename from tests/data/devices/tze200-9xfjixap-ts0601.json rename to tests/data/devices/tze200-9xfjixap-ts0601-0x00000043.json diff --git a/tests/data/devices/tze200-a7sghmms-ts0601.json b/tests/data/devices/tze200-a7sghmms-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-a7sghmms-ts0601.json rename to tests/data/devices/tze200-a7sghmms-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-abatw3kj-ts0601.json b/tests/data/devices/tze200-abatw3kj-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-abatw3kj-ts0601.json rename to tests/data/devices/tze200-abatw3kj-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-b6wax7g0-ts0601.json b/tests/data/devices/tze200-b6wax7g0-ts0601-0x00000043.json similarity index 100% rename from tests/data/devices/tze200-b6wax7g0-ts0601.json rename to tests/data/devices/tze200-b6wax7g0-ts0601-0x00000043.json diff --git a/tests/data/devices/tze200-bkkmqmyo-ts0601.json b/tests/data/devices/tze200-bkkmqmyo-ts0601-0x00000041.json similarity index 100% rename from tests/data/devices/tze200-bkkmqmyo-ts0601.json rename to tests/data/devices/tze200-bkkmqmyo-ts0601-0x00000041.json diff --git a/tests/data/devices/tze200-c88teujp-ts0601.json b/tests/data/devices/tze200-c88teujp-ts0601-0x00000055.json similarity index 100% rename from tests/data/devices/tze200-c88teujp-ts0601.json rename to tests/data/devices/tze200-c88teujp-ts0601-0x00000055.json diff --git a/tests/data/devices/tze200-cirvgep4-ts0601.json b/tests/data/devices/tze200-cirvgep4-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-cirvgep4-ts0601.json rename to tests/data/devices/tze200-cirvgep4-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-g9a3awaj-ts0601.json b/tests/data/devices/tze200-g9a3awaj-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-g9a3awaj-ts0601.json rename to tests/data/devices/tze200-g9a3awaj-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-gjldowol-ts0601.json b/tests/data/devices/tze200-gjldowol-ts0601-0x00000050.json similarity index 100% rename from tests/data/devices/tze200-gjldowol-ts0601.json rename to tests/data/devices/tze200-gjldowol-ts0601-0x00000050.json diff --git a/tests/data/devices/tze200-guvc7pdy-ts0601.json b/tests/data/devices/tze200-guvc7pdy-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-guvc7pdy-ts0601.json rename to tests/data/devices/tze200-guvc7pdy-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-hhrtiq0x-ts0601.json b/tests/data/devices/tze200-hhrtiq0x-ts0601-0x00000055.json similarity index 100% rename from tests/data/devices/tze200-hhrtiq0x-ts0601.json rename to tests/data/devices/tze200-hhrtiq0x-ts0601-0x00000055.json diff --git a/tests/data/devices/tze200-hr0tdd47-ts0601.json b/tests/data/devices/tze200-hr0tdd47-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-hr0tdd47-ts0601.json rename to tests/data/devices/tze200-hr0tdd47-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-js3mgbjb-ts0601.json b/tests/data/devices/tze200-js3mgbjb-ts0601-0x00000044.json similarity index 100% rename from tests/data/devices/tze200-js3mgbjb-ts0601.json rename to tests/data/devices/tze200-js3mgbjb-ts0601-0x00000044.json diff --git a/tests/data/devices/tze200-jwsjbxjs-ts0601.json b/tests/data/devices/tze200-jwsjbxjs-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-jwsjbxjs-ts0601.json rename to tests/data/devices/tze200-jwsjbxjs-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-locansqn-ts0601.json b/tests/data/devices/tze200-locansqn-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-locansqn-ts0601.json rename to tests/data/devices/tze200-locansqn-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-mgxy2d9f-ts0601.json b/tests/data/devices/tze200-mgxy2d9f-ts0601-0x00000043.json similarity index 100% rename from tests/data/devices/tze200-mgxy2d9f-ts0601.json rename to tests/data/devices/tze200-mgxy2d9f-ts0601-0x00000043.json diff --git a/tests/data/devices/tze200-moycceze-ts0601.json b/tests/data/devices/tze200-moycceze-ts0601-0x00000043.json similarity index 100% rename from tests/data/devices/tze200-moycceze-ts0601.json rename to tests/data/devices/tze200-moycceze-ts0601-0x00000043.json diff --git a/tests/data/devices/tze200-mudxchsu-ts0601.json b/tests/data/devices/tze200-mudxchsu-ts0601-0x00000045.json similarity index 100% rename from tests/data/devices/tze200-mudxchsu-ts0601.json rename to tests/data/devices/tze200-mudxchsu-ts0601-0x00000045.json diff --git a/tests/data/devices/tze200-myd45weu-ts0601.json b/tests/data/devices/tze200-myd45weu-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-myd45weu-ts0601.json rename to tests/data/devices/tze200-myd45weu-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-nqaqq4cf-ts0601.json b/tests/data/devices/tze200-nqaqq4cf-ts0601-0x00000044.json similarity index 100% rename from tests/data/devices/tze200-nqaqq4cf-ts0601.json rename to tests/data/devices/tze200-nqaqq4cf-ts0601-0x00000044.json diff --git a/tests/data/devices/tze200-pl31aqf5-ts0601.json b/tests/data/devices/tze200-pl31aqf5-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-pl31aqf5-ts0601.json rename to tests/data/devices/tze200-pl31aqf5-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-qyflbnbj-ts0601.json b/tests/data/devices/tze200-qyflbnbj-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-qyflbnbj-ts0601.json rename to tests/data/devices/tze200-qyflbnbj-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-r32ctezx-ts0601.json b/tests/data/devices/tze200-r32ctezx-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-r32ctezx-ts0601.json rename to tests/data/devices/tze200-r32ctezx-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-r5ksy7qo-ts0601.json b/tests/data/devices/tze200-r5ksy7qo-ts0601-0x00000043.json similarity index 100% rename from tests/data/devices/tze200-r5ksy7qo-ts0601.json rename to tests/data/devices/tze200-r5ksy7qo-ts0601-0x00000043.json diff --git a/tests/data/devices/tze200-rmymn92d-ts0601.json b/tests/data/devices/tze200-rmymn92d-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-rmymn92d-ts0601.json rename to tests/data/devices/tze200-rmymn92d-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-sur6q7ko-ts0601.json b/tests/data/devices/tze200-sur6q7ko-ts0601-0x00000045.json similarity index 100% rename from tests/data/devices/tze200-sur6q7ko-ts0601.json rename to tests/data/devices/tze200-sur6q7ko-ts0601-0x00000045.json diff --git a/tests/data/devices/tze200-uf1qujxj-ts0601.json b/tests/data/devices/tze200-uf1qujxj-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-uf1qujxj-ts0601.json rename to tests/data/devices/tze200-uf1qujxj-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-vvmbj46n-ts0601.json b/tests/data/devices/tze200-vvmbj46n-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze200-vvmbj46n-ts0601.json rename to tests/data/devices/tze200-vvmbj46n-ts0601-0x00000048.json diff --git a/tests/data/devices/tze200-wdfurkoa-ts0601.json b/tests/data/devices/tze200-wdfurkoa-ts0601-0x00000041.json similarity index 100% rename from tests/data/devices/tze200-wdfurkoa-ts0601.json rename to tests/data/devices/tze200-wdfurkoa-ts0601-0x00000041.json diff --git a/tests/data/devices/tze200-wfxuhoea-ts0601.json b/tests/data/devices/tze200-wfxuhoea-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-wfxuhoea-ts0601.json rename to tests/data/devices/tze200-wfxuhoea-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-yia0p3tr-ts0601.json b/tests/data/devices/tze200-yia0p3tr-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze200-yia0p3tr-ts0601.json rename to tests/data/devices/tze200-yia0p3tr-ts0601-0x00000046.json diff --git a/tests/data/devices/tze200-yw7cahqs-ts0601.json b/tests/data/devices/tze200-yw7cahqs-ts0601-0x00000055.json similarity index 100% rename from tests/data/devices/tze200-yw7cahqs-ts0601.json rename to tests/data/devices/tze200-yw7cahqs-ts0601-0x00000055.json diff --git a/tests/data/devices/tze204-1v1dxkck-ts0601.json b/tests/data/devices/tze204-1v1dxkck-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-1v1dxkck-ts0601.json rename to tests/data/devices/tze204-1v1dxkck-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-1youk3hj-ts0601.json b/tests/data/devices/tze204-1youk3hj-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-1youk3hj-ts0601.json rename to tests/data/devices/tze204-1youk3hj-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-4fblxpma-ts0601.json b/tests/data/devices/tze204-4fblxpma-ts0601-0x00000049.json similarity index 100% rename from tests/data/devices/tze204-4fblxpma-ts0601.json rename to tests/data/devices/tze204-4fblxpma-ts0601-0x00000049.json diff --git a/tests/data/devices/tze204-58of2pfn-ts0601.json b/tests/data/devices/tze204-58of2pfn-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-58of2pfn-ts0601.json rename to tests/data/devices/tze204-58of2pfn-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-5slehgeo-ts0601.json b/tests/data/devices/tze204-5slehgeo-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-5slehgeo-ts0601.json rename to tests/data/devices/tze204-5slehgeo-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-81yrt3lo-ts0601.json b/tests/data/devices/tze204-81yrt3lo-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-81yrt3lo-ts0601.json rename to tests/data/devices/tze204-81yrt3lo-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-a2jcoyuk-ts0601.json b/tests/data/devices/tze204-a2jcoyuk-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-a2jcoyuk-ts0601.json rename to tests/data/devices/tze204-a2jcoyuk-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-ai4rqhky-ts0601.json b/tests/data/devices/tze204-ai4rqhky-ts0601-0x00000049.json similarity index 100% rename from tests/data/devices/tze204-ai4rqhky-ts0601.json rename to tests/data/devices/tze204-ai4rqhky-ts0601-0x00000049.json diff --git a/tests/data/devices/tze204-aoclfnxz-ts0601.json b/tests/data/devices/tze204-aoclfnxz-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-aoclfnxz-ts0601.json rename to tests/data/devices/tze204-aoclfnxz-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-c2fmom5z-ts0601.json b/tests/data/devices/tze204-c2fmom5z-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-c2fmom5z-ts0601.json rename to tests/data/devices/tze204-c2fmom5z-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-cirvgep4-ts0601.json b/tests/data/devices/tze204-cirvgep4-ts0601-0x00000049.json similarity index 100% rename from tests/data/devices/tze204-cirvgep4-ts0601.json rename to tests/data/devices/tze204-cirvgep4-ts0601-0x00000049.json diff --git a/tests/data/devices/tze204-d6i25bwg-ts0601.json b/tests/data/devices/tze204-d6i25bwg-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-d6i25bwg-ts0601.json rename to tests/data/devices/tze204-d6i25bwg-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-dwcarsat-ts0601.json b/tests/data/devices/tze204-dwcarsat-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-dwcarsat-ts0601.json rename to tests/data/devices/tze204-dwcarsat-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-eekpf0ft-ts0601.json b/tests/data/devices/tze204-eekpf0ft-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-eekpf0ft-ts0601.json rename to tests/data/devices/tze204-eekpf0ft-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-ex3rcdha-ts0601.json b/tests/data/devices/tze204-ex3rcdha-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-ex3rcdha-ts0601.json rename to tests/data/devices/tze204-ex3rcdha-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-fhvdgeuh-ts0601.json b/tests/data/devices/tze204-fhvdgeuh-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-fhvdgeuh-ts0601.json rename to tests/data/devices/tze204-fhvdgeuh-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-goecjd1t-ts0601.json b/tests/data/devices/tze204-goecjd1t-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-goecjd1t-ts0601.json rename to tests/data/devices/tze204-goecjd1t-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-gops3slb-ts0601.json b/tests/data/devices/tze204-gops3slb-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-gops3slb-ts0601.json rename to tests/data/devices/tze204-gops3slb-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-guvc7pdy-ts0601.json b/tests/data/devices/tze204-guvc7pdy-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-guvc7pdy-ts0601.json rename to tests/data/devices/tze204-guvc7pdy-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-iaeejhvf-ts0601.json b/tests/data/devices/tze204-iaeejhvf-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-iaeejhvf-ts0601.json rename to tests/data/devices/tze204-iaeejhvf-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-jrcfsaa3-ts0601.json b/tests/data/devices/tze204-jrcfsaa3-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-jrcfsaa3-ts0601.json rename to tests/data/devices/tze204-jrcfsaa3-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-lb0fsvba-ts0601.json b/tests/data/devices/tze204-lb0fsvba-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-lb0fsvba-ts0601.json rename to tests/data/devices/tze204-lb0fsvba-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-lbbg34rj-ts0601.json b/tests/data/devices/tze204-lbbg34rj-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-lbbg34rj-ts0601.json rename to tests/data/devices/tze204-lbbg34rj-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-lpedvtvr-ts0601.json b/tests/data/devices/tze204-lpedvtvr-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-lpedvtvr-ts0601.json rename to tests/data/devices/tze204-lpedvtvr-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-lsanae15-ts0601.json b/tests/data/devices/tze204-lsanae15-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-lsanae15-ts0601.json rename to tests/data/devices/tze204-lsanae15-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-ltwbm23f-ts0601.json b/tests/data/devices/tze204-ltwbm23f-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-ltwbm23f-ts0601.json rename to tests/data/devices/tze204-ltwbm23f-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-m64smti7-ts0601.json b/tests/data/devices/tze204-m64smti7-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-m64smti7-ts0601.json rename to tests/data/devices/tze204-m64smti7-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-m9dzckna-ts0601.json b/tests/data/devices/tze204-m9dzckna-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-m9dzckna-ts0601.json rename to tests/data/devices/tze204-m9dzckna-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-mtoaryre-ts0601.json b/tests/data/devices/tze204-mtoaryre-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-mtoaryre-ts0601.json rename to tests/data/devices/tze204-mtoaryre-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-mwomyz5n-ts0601.json b/tests/data/devices/tze204-mwomyz5n-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-mwomyz5n-ts0601.json rename to tests/data/devices/tze204-mwomyz5n-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-nbkshs6k-ts0601.json b/tests/data/devices/tze204-nbkshs6k-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-nbkshs6k-ts0601.json rename to tests/data/devices/tze204-nbkshs6k-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-nklqjk62-ts0601.json b/tests/data/devices/tze204-nklqjk62-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-nklqjk62-ts0601.json rename to tests/data/devices/tze204-nklqjk62-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-nlrfgpny-ts0601.json b/tests/data/devices/tze204-nlrfgpny-ts0601-0x00000049.json similarity index 100% rename from tests/data/devices/tze204-nlrfgpny-ts0601.json rename to tests/data/devices/tze204-nlrfgpny-ts0601-0x00000049.json diff --git a/tests/data/devices/tze204-nqqylykc-ts0601.json b/tests/data/devices/tze204-nqqylykc-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-nqqylykc-ts0601.json rename to tests/data/devices/tze204-nqqylykc-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-nvxorhcj-ts0601.json b/tests/data/devices/tze204-nvxorhcj-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-nvxorhcj-ts0601.json rename to tests/data/devices/tze204-nvxorhcj-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-ogx8u5z6-ts0601.json b/tests/data/devices/tze204-ogx8u5z6-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-ogx8u5z6-ts0601.json rename to tests/data/devices/tze204-ogx8u5z6-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-pcdmj88b-ts0601.json b/tests/data/devices/tze204-pcdmj88b-ts0601-0x00000049.json similarity index 100% rename from tests/data/devices/tze204-pcdmj88b-ts0601.json rename to tests/data/devices/tze204-pcdmj88b-ts0601-0x00000049.json diff --git a/tests/data/devices/tze204-pxbjch8m-ts0601.json b/tests/data/devices/tze204-pxbjch8m-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-pxbjch8m-ts0601.json rename to tests/data/devices/tze204-pxbjch8m-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-qasjif9e-ts0601.json b/tests/data/devices/tze204-qasjif9e-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-qasjif9e-ts0601.json rename to tests/data/devices/tze204-qasjif9e-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-qtnjuoae-ts0601.json b/tests/data/devices/tze204-qtnjuoae-ts0601-0x00000049.json similarity index 100% rename from tests/data/devices/tze204-qtnjuoae-ts0601.json rename to tests/data/devices/tze204-qtnjuoae-ts0601-0x00000049.json diff --git a/tests/data/devices/tze204-qvxrkeif-ts0601.json b/tests/data/devices/tze204-qvxrkeif-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-qvxrkeif-ts0601.json rename to tests/data/devices/tze204-qvxrkeif-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-qyr2m29i-ts0601.json b/tests/data/devices/tze204-qyr2m29i-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-qyr2m29i-ts0601.json rename to tests/data/devices/tze204-qyr2m29i-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-r32ctezx-ts0601.json b/tests/data/devices/tze204-r32ctezx-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-r32ctezx-ts0601.json rename to tests/data/devices/tze204-r32ctezx-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-rtrmfadk-ts0601.json b/tests/data/devices/tze204-rtrmfadk-ts0601-0x00000049.json similarity index 100% rename from tests/data/devices/tze204-rtrmfadk-ts0601.json rename to tests/data/devices/tze204-rtrmfadk-ts0601-0x00000049.json diff --git a/tests/data/devices/tze204-tagezcph-ts0601.json b/tests/data/devices/tze204-tagezcph-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-tagezcph-ts0601.json rename to tests/data/devices/tze204-tagezcph-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-tdhnhhiy-ts0601.json b/tests/data/devices/tze204-tdhnhhiy-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-tdhnhhiy-ts0601.json rename to tests/data/devices/tze204-tdhnhhiy-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-uxllnywp-ts0601.json b/tests/data/devices/tze204-uxllnywp-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-uxllnywp-ts0601.json rename to tests/data/devices/tze204-uxllnywp-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-vjpaih9f-ts0601.json b/tests/data/devices/tze204-vjpaih9f-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-vjpaih9f-ts0601.json rename to tests/data/devices/tze204-vjpaih9f-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-w1wwxoja-ts0601.json b/tests/data/devices/tze204-w1wwxoja-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-w1wwxoja-ts0601.json rename to tests/data/devices/tze204-w1wwxoja-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-wbhaespm-ts0601.json b/tests/data/devices/tze204-wbhaespm-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-wbhaespm-ts0601.json rename to tests/data/devices/tze204-wbhaespm-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-x8fp01wi-ts0601.json b/tests/data/devices/tze204-x8fp01wi-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-x8fp01wi-ts0601.json rename to tests/data/devices/tze204-x8fp01wi-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-x9usygq1-ts0601.json b/tests/data/devices/tze204-x9usygq1-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-x9usygq1-ts0601.json rename to tests/data/devices/tze204-x9usygq1-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-xalsoe3m-ts0601.json b/tests/data/devices/tze204-xalsoe3m-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-xalsoe3m-ts0601.json rename to tests/data/devices/tze204-xalsoe3m-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-xlppj4f5-ts0601.json b/tests/data/devices/tze204-xlppj4f5-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-xlppj4f5-ts0601.json rename to tests/data/devices/tze204-xlppj4f5-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-xnbkhhdr-ts0601.json b/tests/data/devices/tze204-xnbkhhdr-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-xnbkhhdr-ts0601.json rename to tests/data/devices/tze204-xnbkhhdr-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-xu4a5rhj-ts0601.json b/tests/data/devices/tze204-xu4a5rhj-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-xu4a5rhj-ts0601.json rename to tests/data/devices/tze204-xu4a5rhj-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-ya4ft0w4-ts0601.json b/tests/data/devices/tze204-ya4ft0w4-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-ya4ft0w4-ts0601.json rename to tests/data/devices/tze204-ya4ft0w4-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-yvx5lh6k-ts0601.json b/tests/data/devices/tze204-yvx5lh6k-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-yvx5lh6k-ts0601.json rename to tests/data/devices/tze204-yvx5lh6k-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze204-ztqnh5cg-ts0601.json b/tests/data/devices/tze204-ztqnh5cg-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze204-ztqnh5cg-ts0601.json rename to tests/data/devices/tze204-ztqnh5cg-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze20c-xbexmf8h-ts130f.json b/tests/data/devices/tze20c-xbexmf8h-ts130f-0x00000040.json similarity index 100% rename from tests/data/devices/tze20c-xbexmf8h-ts130f.json rename to tests/data/devices/tze20c-xbexmf8h-ts130f-0x00000040.json diff --git a/tests/data/devices/tze20c-zka46xbw-ts0601.json b/tests/data/devices/tze20c-zka46xbw-ts0601-0x00000051.json similarity index 100% rename from tests/data/devices/tze20c-zka46xbw-ts0601.json rename to tests/data/devices/tze20c-zka46xbw-ts0601-0x00000051.json diff --git a/tests/data/devices/tze284-2gi1hy8s-ts0601.json b/tests/data/devices/tze284-2gi1hy8s-ts0601-0x00000050.json similarity index 100% rename from tests/data/devices/tze284-2gi1hy8s-ts0601.json rename to tests/data/devices/tze284-2gi1hy8s-ts0601-0x00000050.json diff --git a/tests/data/devices/tze284-3mzb0sdz-ts0601.json b/tests/data/devices/tze284-3mzb0sdz-ts0601-0x00000050.json similarity index 100% rename from tests/data/devices/tze284-3mzb0sdz-ts0601.json rename to tests/data/devices/tze284-3mzb0sdz-ts0601-0x00000050.json diff --git a/tests/data/devices/tze284-6hrnp30w-ts0601.json b/tests/data/devices/tze284-6hrnp30w-ts0601-0x00000050.json similarity index 100% rename from tests/data/devices/tze284-6hrnp30w-ts0601.json rename to tests/data/devices/tze284-6hrnp30w-ts0601-0x00000050.json diff --git a/tests/data/devices/tze284-6ycgarab-ts0601.json b/tests/data/devices/tze284-6ycgarab-ts0601-0x00000050.json similarity index 100% rename from tests/data/devices/tze284-6ycgarab-ts0601.json rename to tests/data/devices/tze284-6ycgarab-ts0601-0x00000050.json diff --git a/tests/data/devices/tze284-78ioiaml-ts0601.json b/tests/data/devices/tze284-78ioiaml-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze284-78ioiaml-ts0601.json rename to tests/data/devices/tze284-78ioiaml-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze284-7gy9mqca-ts0601.json b/tests/data/devices/tze284-7gy9mqca-ts0601-0x0000004e.json similarity index 100% rename from tests/data/devices/tze284-7gy9mqca-ts0601.json rename to tests/data/devices/tze284-7gy9mqca-ts0601-0x0000004e.json diff --git a/tests/data/devices/tze284-7zazvlyn-ts0601.json b/tests/data/devices/tze284-7zazvlyn-ts0601-0x00000045.json similarity index 100% rename from tests/data/devices/tze284-7zazvlyn-ts0601.json rename to tests/data/devices/tze284-7zazvlyn-ts0601-0x00000045.json diff --git a/tests/data/devices/tze284-81yrt3lo-ts0601.json b/tests/data/devices/tze284-81yrt3lo-ts0601-0x0000004e.json similarity index 100% rename from tests/data/devices/tze284-81yrt3lo-ts0601.json rename to tests/data/devices/tze284-81yrt3lo-ts0601-0x0000004e.json diff --git a/tests/data/devices/tze284-8b9zpaav-ts0601.json b/tests/data/devices/tze284-8b9zpaav-ts0601-0x0000004e.json similarity index 100% rename from tests/data/devices/tze284-8b9zpaav-ts0601.json rename to tests/data/devices/tze284-8b9zpaav-ts0601-0x0000004e.json diff --git a/tests/data/devices/tze284-8se38w3c-ts0601.json b/tests/data/devices/tze284-8se38w3c-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-8se38w3c-ts0601.json rename to tests/data/devices/tze284-8se38w3c-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-a2xewxoo-ts0601.json b/tests/data/devices/tze284-a2xewxoo-ts0601-0x0000004e.json similarity index 100% rename from tests/data/devices/tze284-a2xewxoo-ts0601.json rename to tests/data/devices/tze284-a2xewxoo-ts0601-0x0000004e.json diff --git a/tests/data/devices/tze284-c6wv4xyo-ts0601.json b/tests/data/devices/tze284-c6wv4xyo-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-c6wv4xyo-ts0601.json rename to tests/data/devices/tze284-c6wv4xyo-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-dmckrsxg-ts0601.json b/tests/data/devices/tze284-dmckrsxg-ts0601-0x0000004e.json similarity index 100% rename from tests/data/devices/tze284-dmckrsxg-ts0601.json rename to tests/data/devices/tze284-dmckrsxg-ts0601-0x0000004e.json diff --git a/tests/data/devices/tze284-f5efvtbv-ts0601.json b/tests/data/devices/tze284-f5efvtbv-ts0601-0x0000004e.json similarity index 100% rename from tests/data/devices/tze284-f5efvtbv-ts0601.json rename to tests/data/devices/tze284-f5efvtbv-ts0601-0x0000004e.json diff --git a/tests/data/devices/tze284-g2e6cpnw-ts0601.json b/tests/data/devices/tze284-g2e6cpnw-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-g2e6cpnw-ts0601.json rename to tests/data/devices/tze284-g2e6cpnw-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-hodyryli-ts0601.json b/tests/data/devices/tze284-hodyryli-ts0601-0x00000050.json similarity index 100% rename from tests/data/devices/tze284-hodyryli-ts0601.json rename to tests/data/devices/tze284-hodyryli-ts0601-0x00000050.json diff --git a/tests/data/devices/tze284-iadro9bf-ts0601.json b/tests/data/devices/tze284-iadro9bf-ts0601-0x0000004e.json similarity index 100% rename from tests/data/devices/tze284-iadro9bf-ts0601.json rename to tests/data/devices/tze284-iadro9bf-ts0601-0x0000004e.json diff --git a/tests/data/devices/tze284-idvyees9-ts0601.json b/tests/data/devices/tze284-idvyees9-ts0601-0x0000004e.json similarity index 100% rename from tests/data/devices/tze284-idvyees9-ts0601.json rename to tests/data/devices/tze284-idvyees9-ts0601-0x0000004e.json diff --git a/tests/data/devices/tze284-kyyu8rbj-ts0601.json b/tests/data/devices/tze284-kyyu8rbj-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-kyyu8rbj-ts0601.json rename to tests/data/devices/tze284-kyyu8rbj-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-l8xiyymq-ts0601.json b/tests/data/devices/tze284-l8xiyymq-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze284-l8xiyymq-ts0601.json rename to tests/data/devices/tze284-l8xiyymq-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze284-lq0ffndf-ts0601.json b/tests/data/devices/tze284-lq0ffndf-ts0601-0x00000046.json similarity index 100% rename from tests/data/devices/tze284-lq0ffndf-ts0601.json rename to tests/data/devices/tze284-lq0ffndf-ts0601-0x00000046.json diff --git a/tests/data/devices/tze284-ltwbm23f-ts0601.json b/tests/data/devices/tze284-ltwbm23f-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-ltwbm23f-ts0601.json rename to tests/data/devices/tze284-ltwbm23f-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-myd45weu-ts0601.json b/tests/data/devices/tze284-myd45weu-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-myd45weu-ts0601.json rename to tests/data/devices/tze284-myd45weu-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-nklqjk62-ts0601.json b/tests/data/devices/tze284-nklqjk62-ts0601-0x0000004e.json similarity index 100% rename from tests/data/devices/tze284-nklqjk62-ts0601.json rename to tests/data/devices/tze284-nklqjk62-ts0601-0x0000004e.json diff --git a/tests/data/devices/tze284-nnhwcvbk-ts0601.json b/tests/data/devices/tze284-nnhwcvbk-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-nnhwcvbk-ts0601.json rename to tests/data/devices/tze284-nnhwcvbk-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-o3x45p96-ts0601.json b/tests/data/devices/tze284-o3x45p96-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-o3x45p96-ts0601.json rename to tests/data/devices/tze284-o3x45p96-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-o9ofysmo-ts0601.json b/tests/data/devices/tze284-o9ofysmo-ts0601-0x00000050.json similarity index 100% rename from tests/data/devices/tze284-o9ofysmo-ts0601.json rename to tests/data/devices/tze284-o9ofysmo-ts0601-0x00000050.json diff --git a/tests/data/devices/tze284-ogx8u5z6-ts0601.json b/tests/data/devices/tze284-ogx8u5z6-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-ogx8u5z6-ts0601.json rename to tests/data/devices/tze284-ogx8u5z6-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-oitavov2-ts0601.json b/tests/data/devices/tze284-oitavov2-ts0601-0x00000050.json similarity index 100% rename from tests/data/devices/tze284-oitavov2-ts0601.json rename to tests/data/devices/tze284-oitavov2-ts0601-0x00000050.json diff --git a/tests/data/devices/tze284-pcdmj88b-ts0601.json b/tests/data/devices/tze284-pcdmj88b-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-pcdmj88b-ts0601.json rename to tests/data/devices/tze284-pcdmj88b-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-qyflbnbj-ts0601.json b/tests/data/devices/tze284-qyflbnbj-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-qyflbnbj-ts0601.json rename to tests/data/devices/tze284-qyflbnbj-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-rjxqso4a-ts0601.json b/tests/data/devices/tze284-rjxqso4a-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-rjxqso4a-ts0601.json rename to tests/data/devices/tze284-rjxqso4a-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-rlytpmij-ts0601.json b/tests/data/devices/tze284-rlytpmij-ts0601-0x00000051.json similarity index 100% rename from tests/data/devices/tze284-rlytpmij-ts0601.json rename to tests/data/devices/tze284-rlytpmij-ts0601-0x00000051.json diff --git a/tests/data/devices/tze284-rvnbnvw8-ts0601.json b/tests/data/devices/tze284-rvnbnvw8-ts0601-0x0000004e.json similarity index 100% rename from tests/data/devices/tze284-rvnbnvw8-ts0601.json rename to tests/data/devices/tze284-rvnbnvw8-ts0601-0x0000004e.json diff --git a/tests/data/devices/tze284-sgabhwa6-ts0601.json b/tests/data/devices/tze284-sgabhwa6-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-sgabhwa6-ts0601.json rename to tests/data/devices/tze284-sgabhwa6-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-upagmta9-ts0601.json b/tests/data/devices/tze284-upagmta9-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-upagmta9-ts0601.json rename to tests/data/devices/tze284-upagmta9-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-vawy74yh-ts0601.json b/tests/data/devices/tze284-vawy74yh-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-vawy74yh-ts0601.json rename to tests/data/devices/tze284-vawy74yh-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-vuwtqx0t-ts0601.json b/tests/data/devices/tze284-vuwtqx0t-ts0601-0x00000050.json similarity index 100% rename from tests/data/devices/tze284-vuwtqx0t-ts0601.json rename to tests/data/devices/tze284-vuwtqx0t-ts0601-0x00000050.json diff --git a/tests/data/devices/tze284-wtikaxzs-ts0601.json b/tests/data/devices/tze284-wtikaxzs-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-wtikaxzs-ts0601.json rename to tests/data/devices/tze284-wtikaxzs-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-xnbkhhdr-ts0601.json b/tests/data/devices/tze284-xnbkhhdr-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-xnbkhhdr-ts0601.json rename to tests/data/devices/tze284-xnbkhhdr-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-zjhoqbrd-ts0601.json b/tests/data/devices/tze284-zjhoqbrd-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-zjhoqbrd-ts0601.json rename to tests/data/devices/tze284-zjhoqbrd-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze284-zm8zpwas-ts0601.json b/tests/data/devices/tze284-zm8zpwas-ts0601-0x00000050.json similarity index 100% rename from tests/data/devices/tze284-zm8zpwas-ts0601.json rename to tests/data/devices/tze284-zm8zpwas-ts0601-0x00000050.json diff --git a/tests/data/devices/tze284-znvwzxkq-ts0601.json b/tests/data/devices/tze284-znvwzxkq-ts0601-0x0000004a.json similarity index 100% rename from tests/data/devices/tze284-znvwzxkq-ts0601.json rename to tests/data/devices/tze284-znvwzxkq-ts0601-0x0000004a.json diff --git a/tests/data/devices/tze284-zp8xakad-ts0601.json b/tests/data/devices/tze284-zp8xakad-ts0601-0x0000004d.json similarity index 100% rename from tests/data/devices/tze284-zp8xakad-ts0601.json rename to tests/data/devices/tze284-zp8xakad-ts0601-0x0000004d.json diff --git a/tests/data/devices/tze28c1000000-alh14edn-ts0601.json b/tests/data/devices/tze28c1000000-alh14edn-ts0601-0x00000048.json similarity index 100% rename from tests/data/devices/tze28c1000000-alh14edn-ts0601.json rename to tests/data/devices/tze28c1000000-alh14edn-ts0601-0x00000048.json diff --git a/tests/data/devices/tze608-c75zqghm-ts0603.json b/tests/data/devices/tze608-c75zqghm-ts0603-0x00000040.json similarity index 100% rename from tests/data/devices/tze608-c75zqghm-ts0603.json rename to tests/data/devices/tze608-c75zqghm-ts0603-0x00000040.json diff --git a/tests/data/devices/ubisys-s1-5501.json b/tests/data/devices/ubisys-s1-5501-0x02600460.json similarity index 100% rename from tests/data/devices/ubisys-s1-5501.json rename to tests/data/devices/ubisys-s1-5501-0x02600460.json diff --git a/tests/data/devices/universal-electronics-inc-urc4460bc0-x-r.json b/tests/data/devices/universal-electronics-inc-urc4460bc0-x-r-0x20160921.json similarity index 100% rename from tests/data/devices/universal-electronics-inc-urc4460bc0-x-r.json rename to tests/data/devices/universal-electronics-inc-urc4460bc0-x-r-0x20160921.json diff --git a/tests/data/devices/xiaoyan-terncy-sd01.json b/tests/data/devices/xiaoyan-terncy-sd01-0x0000001a.json similarity index 100% rename from tests/data/devices/xiaoyan-terncy-sd01.json rename to tests/data/devices/xiaoyan-terncy-sd01-0x0000001a.json diff --git a/tests/data/devices/yale-yrd256-tsdb.json b/tests/data/devices/yale-yrd256-tsdb-0x0105002b.json similarity index 100% rename from tests/data/devices/yale-yrd256-tsdb.json rename to tests/data/devices/yale-yrd256-tsdb-0x0105002b.json diff --git a/tests/data/devices/yooksmart-d10110.json b/tests/data/devices/yooksmart-d10110-0x12046780.json similarity index 100% rename from tests/data/devices/yooksmart-d10110.json rename to tests/data/devices/yooksmart-d10110-0x12046780.json diff --git a/tests/data/devices/zemismart-spm02-3z3.json b/tests/data/devices/zemismart-spm02-3z3-0x0000000e.json similarity index 100% rename from tests/data/devices/zemismart-spm02-3z3.json rename to tests/data/devices/zemismart-spm02-3z3-0x0000000e.json diff --git a/tests/data/devices/zen-within-zen-01.json b/tests/data/devices/zen-within-zen-01-0x0000021f.json similarity index 100% rename from tests/data/devices/zen-within-zen-01.json rename to tests/data/devices/zen-within-zen-01-0x0000021f.json From a3058ef739a58d06e2150589e7080c38967eb492 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:20:08 -0400 Subject: [PATCH 05/13] Import new devices and older firmwares of existing devices --- ...ra-lumi-sensor-occupy-agl8-0x00003a29.json | 453 ++++ ...ra-lumi-sensor-occupy-agl8-0x0000412a.json | 453 ++++ .../bosch-rbsh-trv0-zb-eu-0x38011514.json | 1184 ++++++++++ tests/data/devices/bweetech-semote.json | 322 +++ .../devices/centralite-3326-l-0x1c005310.json | 491 +++++ .../devices/computime-slt3c-0x02040105.json | 685 ++++++ ...l702-al-01-7009-z102lg03-1-0x00001203.json | 649 ++++++ .../devices/ewelink-snzb-01p-0x00002200.json | 341 +++ .../frient-a-s-kepzb-110-0x0001060a.json | 465 ++++ tests/data/devices/frient-a-s-smszb-120.json | 556 +++++ .../gledopto-gl-c-009p-0x17013001.json | 574 +++++ .../gledopto-gl-c-009p-0x25013001.json | 453 ++++ ...ea-of-sweden-rodret-dimmer-0x01000057.json | 393 ++++ tests/data/devices/inovelli-vzm30-sn.json | 1941 +++++++++++++++++ .../legrand-light-switch-with-neutral.json | 615 ++++++ .../lumi-lumi-curtain-acn002-0x00000f20.json | 755 +++++++ .../lumi-lumi-plug-maeu01-0x0000002d.json | 1032 +++++++++ .../lumi-lumi-remote-cagl02-0x0000001c.json | 384 ++++ .../data/devices/lumi-lumi-switch-n0agl1.json | 1041 +++++++++ .../devices/philips-rwl020-0x420045b6.json | 432 ++++ .../devices/philips-sml001-0x43007305.json | 615 ++++++ .../devices/philips-sml001-0x43007401.json | 615 ++++++ ...ify-netherlands-b-v-rdm002-0x02003b13.json | 370 ++++ ...ify-netherlands-b-v-rdm004-0x02004d23.json | 365 ++++ ...ify-netherlands-b-v-rwl022-0x02004d27.json | 365 ++++ tests/data/devices/sonoff-swv-0x00001003.json | 498 +++++ .../data/devices/sonoff-trvzb-0x00001400.json | 1224 +++++++++++ .../data/devices/sonoff-trvzb-0x00001401.json | 1218 +++++++++++ ...third-reality-inc-3rws18bz-0x00000049.json | 497 +++++ .../tz3000-09gto2zn-ts0013-0x00000050.json | 769 +++++++ .../data/devices/tz3000-1dd0d5yi-ts130f.json | 521 +++++ .../tz3210-3ulg9kpo-ts0021-0x00000042.json | 340 +++ ...90-7v1k4vufotpowp9z-ts1201-0x00000043.json | 345 +++ .../tze200-4vobcgd3-ts0601-0x00000053.json | 231 ++ .../data/devices/tze200-a7sghmms-ts0601.json | 630 ++++++ .../tze200-nklqjk62-ts0601-0x00000046.json | 297 +++ .../tze204-b8vxct9l-ts0601-0x0000004a.json | 266 +++ .../tze204-ltwbm23f-ts0601-0x0000004e.json | 1054 +++++++++ .../data/devices/tze204-rtrmfadk-ts0601.json | 777 +++++++ .../data/devices/tze284-432zhuwe-ts0601.json | 237 ++ .../data/devices/tze284-6uyu20xu-ts0601.json | 243 +++ .../tze284-aao3yzhs-ts0601-0x0000004d.json | 398 ++++ .../tze284-cf4b5ktf-ts0601-0x0000004e.json | 266 +++ 43 files changed, 25360 insertions(+) create mode 100644 tests/data/devices/aqara-lumi-sensor-occupy-agl8-0x00003a29.json create mode 100644 tests/data/devices/aqara-lumi-sensor-occupy-agl8-0x0000412a.json create mode 100644 tests/data/devices/bosch-rbsh-trv0-zb-eu-0x38011514.json create mode 100644 tests/data/devices/bweetech-semote.json create mode 100644 tests/data/devices/centralite-3326-l-0x1c005310.json create mode 100644 tests/data/devices/computime-slt3c-0x02040105.json create mode 100644 tests/data/devices/ewelink-ck-bl702-al-01-7009-z102lg03-1-0x00001203.json create mode 100644 tests/data/devices/ewelink-snzb-01p-0x00002200.json create mode 100644 tests/data/devices/frient-a-s-kepzb-110-0x0001060a.json create mode 100644 tests/data/devices/frient-a-s-smszb-120.json create mode 100644 tests/data/devices/gledopto-gl-c-009p-0x17013001.json create mode 100644 tests/data/devices/gledopto-gl-c-009p-0x25013001.json create mode 100644 tests/data/devices/ikea-of-sweden-rodret-dimmer-0x01000057.json create mode 100644 tests/data/devices/inovelli-vzm30-sn.json create mode 100644 tests/data/devices/legrand-light-switch-with-neutral.json create mode 100644 tests/data/devices/lumi-lumi-curtain-acn002-0x00000f20.json create mode 100644 tests/data/devices/lumi-lumi-plug-maeu01-0x0000002d.json create mode 100644 tests/data/devices/lumi-lumi-remote-cagl02-0x0000001c.json create mode 100644 tests/data/devices/lumi-lumi-switch-n0agl1.json create mode 100644 tests/data/devices/philips-rwl020-0x420045b6.json create mode 100644 tests/data/devices/philips-sml001-0x43007305.json create mode 100644 tests/data/devices/philips-sml001-0x43007401.json create mode 100644 tests/data/devices/signify-netherlands-b-v-rdm002-0x02003b13.json create mode 100644 tests/data/devices/signify-netherlands-b-v-rdm004-0x02004d23.json create mode 100644 tests/data/devices/signify-netherlands-b-v-rwl022-0x02004d27.json create mode 100644 tests/data/devices/sonoff-swv-0x00001003.json create mode 100644 tests/data/devices/sonoff-trvzb-0x00001400.json create mode 100644 tests/data/devices/sonoff-trvzb-0x00001401.json create mode 100644 tests/data/devices/third-reality-inc-3rws18bz-0x00000049.json create mode 100644 tests/data/devices/tz3000-09gto2zn-ts0013-0x00000050.json create mode 100644 tests/data/devices/tz3000-1dd0d5yi-ts130f.json create mode 100644 tests/data/devices/tz3210-3ulg9kpo-ts0021-0x00000042.json create mode 100644 tests/data/devices/tz3290-7v1k4vufotpowp9z-ts1201-0x00000043.json create mode 100644 tests/data/devices/tze200-4vobcgd3-ts0601-0x00000053.json create mode 100644 tests/data/devices/tze200-a7sghmms-ts0601.json create mode 100644 tests/data/devices/tze200-nklqjk62-ts0601-0x00000046.json create mode 100644 tests/data/devices/tze204-b8vxct9l-ts0601-0x0000004a.json create mode 100644 tests/data/devices/tze204-ltwbm23f-ts0601-0x0000004e.json create mode 100644 tests/data/devices/tze204-rtrmfadk-ts0601.json create mode 100644 tests/data/devices/tze284-432zhuwe-ts0601.json create mode 100644 tests/data/devices/tze284-6uyu20xu-ts0601.json create mode 100644 tests/data/devices/tze284-aao3yzhs-ts0601-0x0000004d.json create mode 100644 tests/data/devices/tze284-cf4b5ktf-ts0601-0x0000004e.json diff --git a/tests/data/devices/aqara-lumi-sensor-occupy-agl8-0x00003a29.json b/tests/data/devices/aqara-lumi-sensor-occupy-agl8-0x00003a29.json new file mode 100644 index 000000000..ae5661b2a --- /dev/null +++ b/tests/data/devices/aqara-lumi-sensor-occupy-agl8-0x00003a29.json @@ -0,0 +1,453 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:ae:99:5e:c4", + "nwk": "0x6184", + "manufacturer": "Aqara", + "model": "lumi.sensor_occupy.agl8", + "friendly_manufacturer": "Aqara", + "friendly_model": "lumi.sensor_occupy.agl8", + "name": "Aqara lumi.sensor_occupy.agl8", + "quirk_applied": false, + "quirk_class": "zigpy.device.Device", + "exposes_features": [], + "manufacturer_code": 4447, + "power_source": "Battery or Unknown", + "lqi": 58, + "rssi": null, + "last_seen": "2026-03-04T05:03:16.935559+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4447, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "OCCUPANCY_SENSOR", + "id": 263 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "Aqara" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "lumi.sensor_occupy.agl8" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 1 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 255 + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 30.3 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0012", + "endpoint_attribute": "multistate_input", + "attributes": [] + }, + { + "cluster_id": "0x0400", + "endpoint_attribute": "illuminance", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "uint16", + "value": 3011 + } + ] + }, + { + "cluster_id": "0x0402", + "endpoint_attribute": "temperature", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "int16", + "value": 2175 + } + ] + }, + { + "cluster_id": "0x0405", + "endpoint_attribute": "humidity", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "uint16", + "value": 3998 + } + ] + }, + { + "cluster_id": "0xfcc0", + "endpoint_attribute": "manufacturer_specific", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 14889 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "Aqara", + "model": "lumi.sensor_occupy.agl8", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4447, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0107", + "input_clusters": [ + "0x0012", + "0x0400", + "0x0405", + "0x0402", + "0x0001", + "0x0003", + "0x0000", + "0xfcc0" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 58 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_size": "Unknown", + "battery_quantity": 1, + "battery_voltage": 3.03 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-1024", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Illuminance", + "translation_key": null, + "translation_placeholders": null, + "device_class": "illuminance", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "lx" + }, + "state": { + "class_name": "Illuminance", + "available": true, + "state": 2 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-1026", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Temperature", + "translation_key": null, + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "Temperature", + "available": true, + "state": 21.75 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-1029", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Humidity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "humidity", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "%" + }, + "state": { + "class_name": "Humidity", + "available": true, + "state": 39.98 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00003a29", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/aqara-lumi-sensor-occupy-agl8-0x0000412a.json b/tests/data/devices/aqara-lumi-sensor-occupy-agl8-0x0000412a.json new file mode 100644 index 000000000..acf9adf89 --- /dev/null +++ b/tests/data/devices/aqara-lumi-sensor-occupy-agl8-0x0000412a.json @@ -0,0 +1,453 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:ae:99:5e:c4", + "nwk": "0x1234", + "manufacturer": "Aqara", + "model": "lumi.sensor_occupy.agl8", + "friendly_manufacturer": "Aqara", + "friendly_model": "lumi.sensor_occupy.agl8", + "name": "Aqara lumi.sensor_occupy.agl8", + "quirk_applied": false, + "quirk_class": "zigpy.device.Device", + "exposes_features": [], + "manufacturer_code": 4447, + "power_source": "Battery or Unknown", + "lqi": 196, + "rssi": -51, + "last_seen": "2026-06-23T19:11:05.887260+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4447, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 1036, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 1036, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "OCCUPANCY_SENSOR", + "id": 263 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "Aqara" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "lumi.sensor_occupy.agl8" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 1 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 255 + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 3.179 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0012", + "endpoint_attribute": "multistate_input", + "attributes": [] + }, + { + "cluster_id": "0x0400", + "endpoint_attribute": "illuminance", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "uint16", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0402", + "endpoint_attribute": "temperature", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "int16", + "value": 2734 + } + ] + }, + { + "cluster_id": "0x0405", + "endpoint_attribute": "humidity", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "uint16", + "value": 4599 + } + ] + }, + { + "cluster_id": "0xfcc0", + "endpoint_attribute": "manufacturer_specific", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 16682 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "Aqara", + "model": "lumi.sensor_occupy.agl8", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4447, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 1036, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 1036, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0107", + "input_clusters": [ + "0x0012", + "0x0400", + "0x0405", + "0x0402", + "0x0001", + "0x0003", + "0x0000", + "0xfcc0" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 196 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -51 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_size": "Unknown", + "battery_quantity": 1, + "battery_voltage": 0.32 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-1024", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Illuminance", + "translation_key": null, + "translation_placeholders": null, + "device_class": "illuminance", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "lx" + }, + "state": { + "class_name": "Illuminance", + "available": true, + "state": 0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-1026", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Temperature", + "translation_key": null, + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "Temperature", + "available": true, + "state": 27.34 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-1029", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Humidity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "humidity", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "%" + }, + "state": { + "class_name": "Humidity", + "available": true, + "state": 45.99 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:99:5e:c4-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:99:5e:c4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x0000412a", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/bosch-rbsh-trv0-zb-eu-0x38011514.json b/tests/data/devices/bosch-rbsh-trv0-zb-eu-0x38011514.json new file mode 100644 index 000000000..a58fc40d4 --- /dev/null +++ b/tests/data/devices/bosch-rbsh-trv0-zb-eu-0x38011514.json @@ -0,0 +1,1184 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:d1:eb:38:68", + "nwk": "0x7763", + "manufacturer": "BOSCH", + "model": "RBSH-TRV0-ZB-EU", + "friendly_manufacturer": "BOSCH", + "friendly_model": "RBSH-TRV0-ZB-EU", + "name": "BOSCH RBSH-TRV0-ZB-EU", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4617, + "power_source": "Battery or Unknown", + "lqi": 236, + "rssi": -41, + "last_seen": "2026-02-07T18:19:03.958227+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4617, + "maximum_buffer_size": 127, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "THERMOSTAT", + "id": 769 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "BOSCH" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "RBSH-TRV0-ZB-EU" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 56 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 2 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 3 + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 26 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0020", + "endpoint_attribute": "poll_control", + "attributes": [] + }, + { + "cluster_id": "0x0201", + "endpoint_attribute": "thermostat", + "attributes": [ + { + "id": "0x0006", + "name": "abs_max_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0004", + "name": "abs_max_heat_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0005", + "name": "abs_min_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0003", + "name": "abs_min_heat_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x4043", + "name": "boost_heating", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x001b", + "name": "ctrl_sequence_of_oper", + "zcl_type": "enum8", + "value": 2 + }, + { + "id": "0x0000", + "name": "local_temperature", + "zcl_type": "int16", + "value": 1980 + }, + { + "id": "0x0010", + "name": "local_temperature_calibration", + "zcl_type": "int8", + "value": -37 + }, + { + "id": "0x0018", + "name": "max_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0016", + "name": "max_heat_setpoint_limit", + "zcl_type": "int16", + "value": 3000 + }, + { + "id": "0x0017", + "name": "min_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0015", + "name": "min_heat_setpoint_limit", + "zcl_type": "int16", + "value": 500 + }, + { + "id": "0x0002", + "name": "occupancy", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0011", + "name": "occupied_cooling_setpoint", + "zcl_type": "int16", + "value": 2300 + }, + { + "id": "0x0012", + "name": "occupied_heating_setpoint", + "zcl_type": "int16", + "value": 2100 + }, + { + "id": "0x4007", + "name": "operating_mode", + "zcl_type": "enum8", + "value": 1 + }, + { + "id": "0x0007", + "name": "pi_cooling_demand", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x4020", + "name": "pi_heating_demand", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x4040", + "name": "remote_temperature", + "zcl_type": "int16", + "value": 0 + }, + { + "id": "0x001e", + "name": "running_mode", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0029", + "name": "running_state", + "zcl_type": "map16", + "unsupported": true + }, + { + "id": "0x0030", + "name": "setpoint_change_source", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x001c", + "name": "system_mode", + "zcl_type": "enum8", + "value": 4 + }, + { + "id": "0x0013", + "name": "unoccupied_cooling_setpoint", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0014", + "name": "unoccupied_heating_setpoint", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x4022", + "name": "valve_adapt_status", + "zcl_type": "enum8", + "value": 2 + }, + { + "id": "0x4042", + "name": "window_open", + "zcl_type": "enum8", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0204", + "endpoint_attribute": "thermostat_ui", + "attributes": [ + { + "id": "0x403b", + "name": "display_brightness", + "zcl_type": "enum8", + "value": 7 + }, + { + "id": "0x403a", + "name": "display_on_time", + "zcl_type": "enum8", + "value": 10 + }, + { + "id": "0x400b", + "name": "display_orientation", + "zcl_type": "uint8", + "value": 0 + }, + { + "id": "0x4039", + "name": "displayed_temperature", + "zcl_type": "enum8", + "value": 1 + }, + { + "id": "0x0001", + "name": "keypad_lockout", + "zcl_type": "enum8", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0b05", + "endpoint_attribute": "diagnostic", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 939595028 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "BOSCH", + "model": "RBSH-TRV0-ZB-EU", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4617, + "maximum_buffer_size": 127, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0301", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0004", + "0x0020", + "0x0201", + "0x0204", + "0x0b05" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + }, + { + "info_object": { + "fallback_name": "Calibrate valve", + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-calibrate_valve", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "Button", + "translation_key": "calibrate_valve", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "calibrate_valve", + "args": [], + "kwargs": {} + }, + "state": { + "class_name": "Button", + "available": true + } + } + ], + "climate": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1", + "migrate_unique_ids": [], + "platform": "climate", + "class_name": "Thermostat", + "translation_key": "thermostat", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "max_temp": 30.0, + "min_temp": 5.0, + "supported_features": 385, + "fan_modes": null, + "preset_modes": [], + "hvac_modes": [ + "off", + "heat" + ] + }, + "state": { + "class_name": "Thermostat", + "available": true, + "current_temperature": 19.8, + "outdoor_temperature": null, + "target_temperature": 21.0, + "target_temperature_high": null, + "target_temperature_low": null, + "hvac_action": "idle", + "hvac_mode": "heat", + "preset_mode": "none", + "fan_mode": "auto", + "system_mode": "[4]/heat", + "occupancy": null, + "occupied_cooling_setpoint": 2300, + "occupied_heating_setpoint": 2100, + "pi_heating_demand": 0, + "pi_cooling_demand": null, + "unoccupied_cooling_setpoint": null, + "unoccupied_heating_setpoint": null + }, + "extra_state_attributes": [ + "occupancy", + "occupied_cooling_setpoint", + "occupied_heating_setpoint", + "pi_cooling_demand", + "pi_heating_demand", + "system_mode", + "unoccupied_cooling_setpoint", + "unoccupied_heating_setpoint" + ] + } + ], + "number": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-513-local_temperature_calibration", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "BoschThermostatLocalTempCalibration", + "translation_key": "local_temperature_calibration", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "box", + "native_max_value": 5.0, + "native_min_value": -5.0, + "native_step": 0.1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "BoschThermostatLocalTempCalibration", + "available": true, + "state": -3.7 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-513-max_heat_setpoint_limit", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "MaxHeatSetpointLimit", + "translation_key": "max_heat_setpoint_limit", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "box", + "native_max_value": 327.67, + "native_min_value": 5.0, + "native_step": 0.5, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "MaxHeatSetpointLimit", + "available": true, + "state": 30.0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-513-min_heat_setpoint_limit", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "MinHeatSetpointLimit", + "translation_key": "min_heat_setpoint_limit", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "box", + "native_max_value": 30.0, + "native_min_value": -273.15000000000003, + "native_step": 0.5, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "MinHeatSetpointLimit", + "available": true, + "state": 5.0 + } + }, + { + "info_object": { + "fallback_name": "Display brightness", + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-display_brightness", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "display_brightness", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 10, + "native_min_value": 0, + "native_step": 1, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 7 + } + }, + { + "info_object": { + "fallback_name": "Display on-time", + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-display_on_time", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "display_on_time", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 30, + "native_min_value": 5, + "native_step": 1, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 10 + } + }, + { + "info_object": { + "fallback_name": "Remote temperature", + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-remote_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "temperature", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 30, + "native_min_value": 5, + "native_step": 0.1, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 0.0 + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-516-keypad_lockout", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "KeypadLockout", + "translation_key": "keypad_lockout", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "KeypadLockoutEnum", + "options": [ + "Unlock", + "Lock1", + "Lock2", + "Lock3", + "Lock4" + ] + }, + "state": { + "class_name": "KeypadLockout", + "available": true, + "state": "Unlock" + } + }, + { + "info_object": { + "fallback_name": "Control sequence", + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-ctrl_sequence_of_oper", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "ctrl_sequence_of_oper", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "BoschControlSequenceOfOperation", + "options": [ + "Cooling", + "Heating" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": "Heating" + } + }, + { + "info_object": { + "fallback_name": "Display orientation", + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-display_orientation", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "display_orientation", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "BoschDisplayOrientation", + "options": [ + "Normal", + "Flipped" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": "Normal" + } + }, + { + "info_object": { + "fallback_name": "Displayed temperature", + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-displayed_temperature", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "displayed_temperature", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "BoschDisplayedTemperature", + "options": [ + "Target", + "Measured" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": "Measured" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 236 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -41 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 28.0, + "battery_size": "AA", + "battery_quantity": 2, + "battery_voltage": 2.6 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-513-hvac_action", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ThermostatHVACAction", + "translation_key": "hvac_action", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "ThermostatHVACAction", + "available": true, + "state": "idle" + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-513-pi_heating_demand", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "PiHeatingDemand", + "translation_key": "pi_heating_demand", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "PiHeatingDemand", + "available": true, + "state": 0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-513-setpoint_change_source", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "SetpointChangeSource", + "translation_key": "setpoint_change_source", + "translation_placeholders": null, + "device_class": "enum", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "SetpointChangeSource", + "available": true, + "state": "Manual" + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-513-setpoint_change_source_timestamp", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "SetpointChangeSourceTimestamp", + "translation_key": "setpoint_change_source_timestamp", + "translation_placeholders": null, + "device_class": "timestamp", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "SetpointChangeSourceTimestamp", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": "Operating mode", + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-operating_mode", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "EnumSensor", + "translation_key": "operating_mode", + "translation_placeholders": null, + "device_class": "enum", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "EnumSensor", + "available": true, + "state": "Manual" + } + }, + { + "info_object": { + "fallback_name": "Valve adaptation status", + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-valve_adapt_status", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "EnumSensor", + "translation_key": "valve_adapt_status", + "translation_placeholders": null, + "device_class": "enum", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "EnumSensor", + "available": true, + "state": "CalibrationInProgress" + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": "Boost heating", + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-boost_heating", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "boost_heating", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "boost_heating", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + }, + { + "info_object": { + "fallback_name": "Window open", + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-window_open", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "window_open", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "window_open", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:d1:eb:38:68-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:d1:eb:38:68", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x38011514", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/bweetech-semote.json b/tests/data/devices/bweetech-semote.json new file mode 100644 index 000000000..47ff59ee2 --- /dev/null +++ b/tests/data/devices/bweetech-semote.json @@ -0,0 +1,322 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:c7:ea:48:e4", + "nwk": "0x85C7", + "manufacturer": "Bweetech", + "model": "SEMOTE", + "friendly_manufacturer": "Bweetech", + "friendly_model": "SEMOTE", + "name": "Bweetech SEMOTE", + "quirk_applied": false, + "quirk_class": "zigpy.device.Device", + "exposes_features": [], + "manufacturer_code": 4107, + "power_source": "Battery or Unknown", + "lqi": 104, + "rssi": -85, + "last_seen": "2026-06-03T13:36:37.668513+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "COLOR_DIMMER_SWITCH", + "id": 261 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "Bweetech" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "SEMOTE" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x1000", + "endpoint_attribute": "lightlink", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [] + }, + { + "cluster_id": "0x0300", + "endpoint_attribute": "light_color", + "attributes": [] + }, + { + "cluster_id": "0x1000", + "endpoint_attribute": "lightlink", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "Bweetech", + "model": "SEMOTE", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0105", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0004", + "0x1000" + ], + "output_clusters": [ + "0x0003", + "0x0004", + "0x0005", + "0x0006", + "0x0008", + "0x0300", + "0x1000" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:c7:ea:48:e4-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:c7:ea:48:e4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:c7:ea:48:e4-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:c7:ea:48:e4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 104 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:c7:ea:48:e4-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:c7:ea:48:e4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -85 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:c7:ea:48:e4-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:c7:ea:48:e4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": null + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/centralite-3326-l-0x1c005310.json b/tests/data/devices/centralite-3326-l-0x1c005310.json new file mode 100644 index 000000000..f10883784 --- /dev/null +++ b/tests/data/devices/centralite-3326-l-0x1c005310.json @@ -0,0 +1,491 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:3f:f3:df:a9", + "nwk": "0xF3FA", + "manufacturer": "CentraLite", + "model": "3326-L", + "friendly_manufacturer": "CentraLite", + "friendly_model": "3326-L", + "name": "CentraLite 3326-L", + "quirk_applied": true, + "quirk_class": "zhaquirks.centralite.motion.CentraLiteMotionSensor", + "exposes_features": [], + "manufacturer_code": 49887, + "power_source": "Battery or Unknown", + "lqi": 255, + "rssi": -71, + "last_seen": "2026-02-09T12:44:38.368741+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 49887, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 0, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "IAS_ZONE", + "id": 1026 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "CentraLite" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "3326-L" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x003e", + "name": "battery_alarm_state", + "zcl_type": "map32", + "value": 0 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 1 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 2 + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 29 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0020", + "endpoint_attribute": "poll_control", + "attributes": [ + { + "id": "0x0000", + "name": "checkin_interval", + "zcl_type": "uint32", + "value": 13200 + } + ] + }, + { + "cluster_id": "0x0402", + "endpoint_attribute": "temperature", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "int16", + "value": 1562 + } + ] + }, + { + "cluster_id": "0x0500", + "endpoint_attribute": "ias_zone", + "attributes": [ + { + "id": "0x0010", + "name": "cie_addr", + "zcl_type": "EUI64", + "value": [ + 50, + 79, + 50, + 2, + 0, + 141, + 21, + 0 + ] + }, + { + "id": "0x0000", + "name": "zone_state", + "zcl_type": "enum8", + "value": 1 + }, + { + "id": "0x0002", + "name": "zone_status", + "zcl_type": "map16", + "value": 36 + }, + { + "id": "0x0001", + "name": "zone_type", + "zcl_type": "enum16", + "value": 13 + } + ] + }, + { + "cluster_id": "0x0b05", + "endpoint_attribute": "diagnostic", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 469783312 + } + ] + } + ] + }, + "2": { + "profile_id": 49887, + "device_type": { + "name": "unknown", + "id": 263 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0b05", + "endpoint_attribute": "diagnostic", + "attributes": [] + }, + { + "cluster_id": "0xfc46", + "endpoint_attribute": "manufacturer_specific", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "CentraLite", + "model": "3326-L", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 49887, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 0, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0402", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0020", + "0x0402", + "0x0500", + "0x0b05" + ], + "output_clusters": [ + "0x0019" + ] + }, + "2": { + "profile_id": "0xc2df", + "device_type": "0x0107", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0b05", + "0xfc46" + ], + "output_clusters": [ + "0x0003" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3f:f3:df:a9-1-1280", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "IASZone", + "translation_key": null, + "translation_placeholders": null, + "device_class": "motion", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:3f:f3:df:a9", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "zone_status" + }, + "state": { + "class_name": "IASZone", + "available": true, + "state": false + } + } + ], + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3f:f3:df:a9-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3f:f3:df:a9", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3f:f3:df:a9-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3f:f3:df:a9", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 255 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3f:f3:df:a9-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3f:f3:df:a9", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -71 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3f:f3:df:a9-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3f:f3:df:a9", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": null, + "battery_size": "Other", + "battery_quantity": 1, + "battery_voltage": 2.9 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3f:f3:df:a9-1-1026", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Temperature", + "translation_key": null, + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3f:f3:df:a9", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "Temperature", + "available": true, + "state": 15.62 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3f:f3:df:a9-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3f:f3:df:a9", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x1c005310", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/computime-slt3c-0x02040105.json b/tests/data/devices/computime-slt3c-0x02040105.json new file mode 100644 index 000000000..96418d753 --- /dev/null +++ b/tests/data/devices/computime-slt3c-0x02040105.json @@ -0,0 +1,685 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:ad:ea:07:68", + "nwk": "0x4A83", + "manufacturer": "Computime", + "model": "SLT3c", + "friendly_manufacturer": "Computime", + "friendly_model": "SLT3c", + "name": "Computime SLT3c", + "quirk_applied": false, + "quirk_class": "zigpy.device.Device", + "exposes_features": [], + "manufacturer_code": 4153, + "power_source": "Battery or Unknown", + "lqi": 136, + "rssi": -66, + "last_seen": "2026-06-10T09:45:26.688274+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4153, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 255, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 255, + "descriptor_capability_field": 0 + }, + "endpoints": { + "9": { + "profile_id": 260, + "device_type": { + "name": "TEMPERATURE_SENSOR", + "id": 770 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "Computime" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "SLT3c" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 64 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 49 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0009", + "endpoint_attribute": "alarms", + "attributes": [] + }, + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0020", + "endpoint_attribute": "poll_control", + "attributes": [ + { + "id": "0x0003", + "name": "fast_poll_timeout", + "zcl_type": "uint16", + "value": 120 + } + ] + }, + { + "cluster_id": "0x0201", + "endpoint_attribute": "thermostat", + "attributes": [ + { + "id": "0x0006", + "name": "abs_max_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0004", + "name": "abs_max_heat_setpoint_limit", + "zcl_type": "int16", + "value": 3000 + }, + { + "id": "0x0005", + "name": "abs_min_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0003", + "name": "abs_min_heat_setpoint_limit", + "zcl_type": "int16", + "value": 508 + }, + { + "id": "0x001b", + "name": "ctrl_sequence_of_oper", + "zcl_type": "enum8", + "value": 2 + }, + { + "id": "0x0000", + "name": "local_temperature", + "zcl_type": "int16", + "value": 0 + }, + { + "id": "0x0010", + "name": "local_temperature_calibration", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0018", + "name": "max_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0016", + "name": "max_heat_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0017", + "name": "min_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0015", + "name": "min_heat_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0002", + "name": "occupancy", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0011", + "name": "occupied_cooling_setpoint", + "zcl_type": "int16", + "value": 2600 + }, + { + "id": "0x0012", + "name": "occupied_heating_setpoint", + "zcl_type": "int16", + "value": 1700 + }, + { + "id": "0x0007", + "name": "pi_cooling_demand", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0008", + "name": "pi_heating_demand", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x001e", + "name": "running_mode", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0029", + "name": "running_state", + "zcl_type": "map16", + "unsupported": true + }, + { + "id": "0x0030", + "name": "setpoint_change_source", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0032", + "name": "setpoint_change_source_timestamp", + "zcl_type": "UTC", + "unsupported": true + }, + { + "id": "0x001c", + "name": "system_mode", + "zcl_type": "enum8", + "value": 1 + }, + { + "id": "0x0013", + "name": "unoccupied_cooling_setpoint", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0014", + "name": "unoccupied_heating_setpoint", + "zcl_type": "int16", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0204", + "endpoint_attribute": "thermostat_ui", + "attributes": [ + { + "id": "0x0001", + "name": "keypad_lockout", + "zcl_type": "enum8", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0402", + "endpoint_attribute": "temperature", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "int16", + "value": 2179 + } + ] + }, + { + "cluster_id": "0xfd00", + "endpoint_attribute": "manufacturer_specific", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 33816837 + } + ] + }, + { + "cluster_id": "0x0201", + "endpoint_attribute": "thermostat", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "Computime", + "model": "SLT3c", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4153, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 255, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 255, + "descriptor_capability_field": 0 + }, + "endpoints": { + "9": { + "profile_id": "0x0104", + "device_type": "0x0302", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0009", + "0x000a", + "0x0020", + "0x0201", + "0x0204", + "0x0402", + "0xfd00" + ], + "output_clusters": [ + "0x0000", + "0x0003", + "0x0019", + "0x0201" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ad:ea:07:68-9-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ad:ea:07:68", + "endpoint_id": 9, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "climate": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ad:ea:07:68-9-513", + "migrate_unique_ids": [], + "platform": "climate", + "class_name": "Thermostat", + "translation_key": "thermostat", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:ad:ea:07:68", + "endpoint_id": 9, + "available": true, + "group_id": null, + "max_temp": 30.0, + "min_temp": 5.1, + "supported_features": 385, + "fan_modes": null, + "preset_modes": [], + "hvac_modes": [ + "off", + "heat" + ] + }, + "state": { + "class_name": "Thermostat", + "available": true, + "current_temperature": 0.0, + "outdoor_temperature": null, + "target_temperature": null, + "target_temperature_high": 26.0, + "target_temperature_low": 17.0, + "hvac_action": null, + "hvac_mode": "heat_cool", + "preset_mode": "none", + "fan_mode": "auto", + "system_mode": "[1]/heat_cool", + "occupancy": null, + "occupied_cooling_setpoint": 2600, + "occupied_heating_setpoint": 1700, + "pi_heating_demand": null, + "pi_cooling_demand": null, + "unoccupied_cooling_setpoint": null, + "unoccupied_heating_setpoint": null + }, + "extra_state_attributes": [ + "occupancy", + "occupied_cooling_setpoint", + "occupied_heating_setpoint", + "pi_cooling_demand", + "pi_heating_demand", + "system_mode", + "unoccupied_cooling_setpoint", + "unoccupied_heating_setpoint" + ] + } + ], + "select": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ad:ea:07:68-9-516-keypad_lockout", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "KeypadLockout", + "translation_key": "keypad_lockout", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ad:ea:07:68", + "endpoint_id": 9, + "available": true, + "group_id": null, + "enum": "KeypadLockoutEnum", + "options": [ + "Unlock", + "Lock1", + "Lock2", + "Lock3", + "Lock4" + ] + }, + "state": { + "class_name": "KeypadLockout", + "available": true, + "state": "Unlock" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ad:ea:07:68-9-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ad:ea:07:68", + "endpoint_id": 9, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 136 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ad:ea:07:68-9-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ad:ea:07:68", + "endpoint_id": 9, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -66 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ad:ea:07:68-9-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ad:ea:07:68", + "endpoint_id": 9, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 32.0, + "battery_voltage": 4.9 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ad:ea:07:68-9-1026", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Temperature", + "translation_key": null, + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ad:ea:07:68", + "endpoint_id": 9, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "Temperature", + "available": true, + "state": 21.79 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ad:ea:07:68-9-513-hvac_action", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ThermostatHVACAction", + "translation_key": "hvac_action", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ad:ea:07:68", + "endpoint_id": 9, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "ThermostatHVACAction", + "available": true, + "state": null + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ad:ea:07:68-9-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ad:ea:07:68", + "endpoint_id": 9, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x02040105", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/ewelink-ck-bl702-al-01-7009-z102lg03-1-0x00001203.json b/tests/data/devices/ewelink-ck-bl702-al-01-7009-z102lg03-1-0x00001203.json new file mode 100644 index 000000000..67060caf3 --- /dev/null +++ b/tests/data/devices/ewelink-ck-bl702-al-01-7009-z102lg03-1-0x00001203.json @@ -0,0 +1,649 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:9e:6f:ce:74", + "nwk": "0x6435", + "manufacturer": "eWeLink", + "model": "CK-BL702-AL-01(7009_Z102LG03-1)", + "friendly_manufacturer": "eWeLink", + "friendly_model": "CK-BL702-AL-01(7009_Z102LG03-1)", + "name": "eWeLink CK-BL702-AL-01(7009_Z102LG03-1)", + "quirk_applied": false, + "quirk_class": "zigpy.device.Device", + "exposes_features": [], + "manufacturer_code": 4742, + "power_source": "Mains", + "lqi": 108, + "rssi": -84, + "last_seen": "2025-09-01T15:24:08.329791+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4742, + "maximum_buffer_size": 127, + "maximum_incoming_transfer_size": 242, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 242, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "EXTENDED_COLOR_LIGHT", + "id": 269 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "eWeLink" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "CK-BL702-AL-01(7009_Z102LG03-1)" + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 1 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "value": 1 + } + ] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [ + { + "id": "0x0000", + "name": "current_level", + "zcl_type": "uint8", + "value": 254 + }, + { + "id": "0x0014", + "name": "default_move_rate", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0013", + "name": "off_transition_time", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0011", + "name": "on_level", + "zcl_type": "uint8", + "value": 255 + }, + { + "id": "0x0010", + "name": "on_off_transition_time", + "zcl_type": "uint16", + "value": 0 + }, + { + "id": "0x0012", + "name": "on_transition_time", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x4000", + "name": "start_up_current_level", + "zcl_type": "uint8", + "value": 255 + } + ] + }, + { + "cluster_id": "0x0300", + "endpoint_attribute": "light_color", + "attributes": [ + { + "id": "0x400a", + "name": "color_capabilities", + "zcl_type": "map16", + "value": 31 + }, + { + "id": "0x4002", + "name": "color_loop_active", + "zcl_type": "uint8", + "value": 0 + }, + { + "id": "0x0008", + "name": "color_mode", + "zcl_type": "enum8", + "value": 1 + }, + { + "id": "0x400c", + "name": "color_temp_physical_max", + "zcl_type": "uint16", + "value": 500 + }, + { + "id": "0x400b", + "name": "color_temp_physical_min", + "zcl_type": "uint16", + "value": 142 + }, + { + "id": "0x0007", + "name": "color_temperature", + "zcl_type": "uint16", + "value": 153 + }, + { + "id": "0x0000", + "name": "current_hue", + "zcl_type": "uint8", + "value": 21 + }, + { + "id": "0x0001", + "name": "current_saturation", + "zcl_type": "uint8", + "value": 240 + }, + { + "id": "0x0003", + "name": "current_x", + "zcl_type": "uint16", + "value": 20495 + }, + { + "id": "0x0004", + "name": "current_y", + "zcl_type": "uint16", + "value": 21541 + }, + { + "id": "0x000f", + "name": "options", + "zcl_type": "map8", + "value": 1 + }, + { + "id": "0x4010", + "name": "start_up_color_temperature", + "zcl_type": "uint16", + "value": 65535 + } + ] + }, + { + "cluster_id": "0x1000", + "endpoint_attribute": "lightlink", + "attributes": [] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": null, + "attributes": [] + }, + { + "cluster_id": "0xfc11", + "endpoint_attribute": "manufacturer_specific", + "attributes": [] + }, + { + "cluster_id": "0xfc57", + "endpoint_attribute": "works_with_all_hubs", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 4611 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "eWeLink", + "model": "CK-BL702-AL-01(7009_Z102LG03-1)", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4742, + "maximum_buffer_size": 127, + "maximum_incoming_transfer_size": 242, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 242, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x010d", + "input_clusters": [ + "0x0000", + "0x0003", + "0x0004", + "0x0005", + "0x0006", + "0x0008", + "0x0300", + "0x1000", + "0xef00", + "0xfc11", + "0xfc57" + ], + "output_clusters": [ + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9e:6f:ce:74-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9e:6f:ce:74", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "light": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9e:6f:ce:74-1", + "migrate_unique_ids": [], + "platform": "light", + "class_name": "ForceOnLight", + "translation_key": "light", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:9e:6f:ce:74", + "endpoint_id": 1, + "available": true, + "group_id": null, + "effect_list": [ + "off", + "colorloop" + ], + "supported_features": 44, + "min_mireds": 142, + "max_mireds": 500 + }, + "state": { + "class_name": "ForceOnLight", + "available": true, + "on": true, + "brightness": 254, + "xy_color": [ + 0.31273365377279316, + 0.3286945906767376 + ], + "color_temp": 153, + "effect_list": [ + "off", + "colorloop" + ], + "effect": "off", + "supported_features": 44, + "color_mode": "xy", + "supported_color_modes": [ + "brightness", + "color_temp", + "onoff", + "xy" + ], + "off_with_transition": false, + "off_brightness": null + }, + "extra_state_attributes": [ + "off_brightness", + "off_with_transition" + ] + } + ], + "number": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9e:6f:ce:74-1-768-start_up_color_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "StartUpColorTemperatureConfigurationEntity", + "translation_key": "start_up_color_temperature", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9e:6f:ce:74", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 500, + "native_min_value": 142, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "StartUpColorTemperatureConfigurationEntity", + "available": true, + "state": 65535 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9e:6f:ce:74-1-8-on_level", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "OnLevelConfigurationEntity", + "translation_key": "on_level", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9e:6f:ce:74", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 255, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "OnLevelConfigurationEntity", + "available": true, + "state": 255 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9e:6f:ce:74-1-8-on_off_transition_time", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "OnOffTransitionTimeConfigurationEntity", + "translation_key": "on_off_transition_time", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9e:6f:ce:74", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 65535, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "OnOffTransitionTimeConfigurationEntity", + "available": true, + "state": 0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9e:6f:ce:74-1-8-start_up_current_level", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "StartUpCurrentLevelConfigurationEntity", + "translation_key": "start_up_current_level", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9e:6f:ce:74", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 255, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "StartUpCurrentLevelConfigurationEntity", + "available": true, + "state": 255 + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9e:6f:ce:74-1-6-StartUpOnOff", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "StartupOnOffSelectEntity", + "translation_key": "start_up_on_off", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9e:6f:ce:74", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "StartUpOnOff", + "options": [ + "Off", + "On", + "Toggle", + "PreviousValue" + ] + }, + "state": { + "class_name": "StartupOnOffSelectEntity", + "available": true, + "state": "On" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9e:6f:ce:74-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9e:6f:ce:74", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 108 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9e:6f:ce:74-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9e:6f:ce:74", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -84 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9e:6f:ce:74-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9e:6f:ce:74", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00001203", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/ewelink-snzb-01p-0x00002200.json b/tests/data/devices/ewelink-snzb-01p-0x00002200.json new file mode 100644 index 000000000..2263490ec --- /dev/null +++ b/tests/data/devices/ewelink-snzb-01p-0x00002200.json @@ -0,0 +1,341 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:6a:05:59:94", + "nwk": "0x1089", + "manufacturer": "eWeLink", + "model": "SNZB-01P", + "friendly_manufacturer": "eWeLink", + "friendly_model": "SNZB-01P", + "name": "eWeLink SNZB-01P", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4742, + "power_source": "Battery or Unknown", + "lqi": 123, + "rssi": null, + "last_seen": "2025-10-13T08:08:01.415322+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4742, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 255, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 255, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_SWITCH", + "id": 0 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "eWeLink" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "SNZB-01P" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 31 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0020", + "endpoint_attribute": "poll_control", + "attributes": [ + { + "id": "0x0003", + "name": "fast_poll_timeout", + "zcl_type": "uint16", + "value": 120 + } + ] + }, + { + "cluster_id": "0xfc57", + "endpoint_attribute": "works_with_all_hubs", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 8704 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "eWeLink", + "model": "SNZB-01P", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4742, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 255, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 255, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0000", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0020", + "0xfc57" + ], + "output_clusters": [ + "0x0003", + "0x0006", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6a:05:59:94-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:05:59:94", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6a:05:59:94-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:05:59:94", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 123 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6a:05:59:94-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:05:59:94", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6a:05:59:94-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:05:59:94", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_voltage": 3.1 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6a:05:59:94-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:05:59:94", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00002200", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/frient-a-s-kepzb-110-0x0001060a.json b/tests/data/devices/frient-a-s-kepzb-110-0x0001060a.json new file mode 100644 index 000000000..2a80640b4 --- /dev/null +++ b/tests/data/devices/frient-a-s-kepzb-110-0x0001060a.json @@ -0,0 +1,465 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:44:6d:00:26", + "nwk": "0x70E8", + "manufacturer": "frient A/S", + "model": "KEPZB-110", + "friendly_manufacturer": "frient A/S", + "friendly_model": "KEPZB-110", + "name": "frient A/S KEPZB-110", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4117, + "power_source": "Battery or Unknown", + "lqi": 76, + "rssi": -92, + "last_seen": "2025-10-07T16:08:43.497224+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4117, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 1500, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 1500, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 49353, + "device_type": { + "name": "unknown", + "id": 1 + }, + "in_clusters": [ + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [] + } + ], + "out_clusters": [] + }, + "44": { + "profile_id": 260, + "device_type": { + "name": "IAS_ANCILLARY_CONTROL", + "id": 1025 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "frient A/S" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "KEPZB-110" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 4 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 3 + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 62 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0020", + "endpoint_attribute": "poll_control", + "attributes": [] + }, + { + "cluster_id": "0x0500", + "endpoint_attribute": "ias_zone", + "attributes": [ + { + "id": "0x0010", + "name": "cie_addr", + "zcl_type": "EUI64", + "value": [ + 50, + 79, + 50, + 2, + 0, + 141, + 21, + 0 + ] + }, + { + "id": "0x0000", + "name": "zone_state", + "zcl_type": "enum8", + "value": 1 + }, + { + "id": "0x0002", + "name": "zone_status", + "zcl_type": "map16", + "value": 16 + }, + { + "id": "0x0001", + "name": "zone_type", + "zcl_type": "enum16", + "value": 541 + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 67082 + } + ] + }, + { + "cluster_id": "0x0501", + "endpoint_attribute": "ias_ace", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "frient A/S", + "model": "KEPZB-110", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4117, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 1500, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 1500, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0xc0c9", + "device_type": "0x0001", + "input_clusters": [ + "0x0005", + "0x0006" + ], + "output_clusters": [] + }, + "44": { + "profile_id": "0x0104", + "device_type": "0x0401", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0020", + "0x0500" + ], + "output_clusters": [ + "0x0003", + "0x000a", + "0x0019", + "0x0501" + ] + } + } + }, + "zha_lib_entities": { + "alarm_control_panel": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:44:6d:00:26-44-1281", + "migrate_unique_ids": [], + "platform": "alarm_control_panel", + "class_name": "AlarmControlPanel", + "translation_key": "alarm_control_panel", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:44:6d:00:26", + "endpoint_id": 44, + "available": true, + "group_id": null, + "code_arm_required": false, + "code_format": "number", + "supported_features": 15 + }, + "state": { + "class_name": "AlarmControlPanel", + "available": true, + "state": "disarmed" + } + } + ], + "binary_sensor": [ + { + "info_object": { + "fallback_name": "Tamper", + "unique_id": "ab:cd:ef:12:44:6d:00:26-44-tamper", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "BinarySensor", + "translation_key": null, + "translation_placeholders": null, + "device_class": "tamper", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:44:6d:00:26", + "endpoint_id": 44, + "available": true, + "group_id": null, + "attribute_name": "zone_status" + }, + "state": { + "class_name": "BinarySensor", + "available": true, + "state": false + } + } + ], + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:44:6d:00:26-44-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:44:6d:00:26", + "endpoint_id": 44, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:44:6d:00:26-44-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:44:6d:00:26", + "endpoint_id": 44, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 76 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:44:6d:00:26-44-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:44:6d:00:26", + "endpoint_id": 44, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -92 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:44:6d:00:26-44-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:44:6d:00:26", + "endpoint_id": 44, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": null, + "battery_size": "AA", + "battery_quantity": 4, + "battery_voltage": 6.2 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:44:6d:00:26-44-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:44:6d:00:26", + "endpoint_id": 44, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x0001060a", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/frient-a-s-smszb-120.json b/tests/data/devices/frient-a-s-smszb-120.json new file mode 100644 index 000000000..ab4906a93 --- /dev/null +++ b/tests/data/devices/frient-a-s-smszb-120.json @@ -0,0 +1,556 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:2d:1d:92:32", + "nwk": "0x58EB", + "manufacturer": "frient A/S", + "model": "SMSZB-120", + "friendly_manufacturer": "frient A/S", + "friendly_model": "SMSZB-120", + "name": "frient A/S SMSZB-120", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [ + "siren_basic" + ], + "manufacturer_code": 4117, + "power_source": "Battery or Unknown", + "lqi": 212, + "rssi": -47, + "last_seen": "2025-09-09T14:07:27.359123+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 0, + "manufacturer_code": 4117, + "maximum_buffer_size": 80, + "maximum_incoming_transfer_size": 80, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 80, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 49353, + "device_type": { + "name": "unknown", + "id": 1 + }, + "in_clusters": [ + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "unsupported": true + } + ] + } + ], + "out_clusters": [] + }, + "35": { + "profile_id": 260, + "device_type": { + "name": "IAS_ZONE", + "id": 1026 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "frient A/S" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "SMSZB-120" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x003e", + "name": "battery_alarm_state", + "zcl_type": "map32", + "value": 0 + }, + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 32 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x000f", + "endpoint_attribute": "binary_input", + "attributes": [ + { + "id": "0x0055", + "name": "present_value", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x006f", + "name": "status_flags", + "zcl_type": "map8", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0020", + "endpoint_attribute": "poll_control", + "attributes": [ + { + "id": "0x0000", + "name": "checkin_interval", + "zcl_type": "uint32", + "value": 13200 + } + ] + }, + { + "cluster_id": "0x0500", + "endpoint_attribute": "ias_zone", + "attributes": [ + { + "id": "0x0010", + "name": "cie_addr", + "zcl_type": "EUI64", + "value": [ + 50, + 79, + 50, + 2, + 0, + 141, + 21, + 0 + ] + }, + { + "id": "0x0002", + "name": "zone_status", + "zcl_type": "map16", + "value": 48 + }, + { + "id": "0x0001", + "name": "zone_type", + "zcl_type": "enum16", + "value": 40 + } + ] + }, + { + "cluster_id": "0x0502", + "endpoint_attribute": "ias_wd", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [] + } + ] + }, + "38": { + "profile_id": 260, + "device_type": { + "name": "TEMPERATURE_SENSOR", + "id": 770 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0402", + "endpoint_attribute": "temperature", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "int16", + "value": 2343 + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "frient A/S", + "model": "SMSZB-120", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 0, + "manufacturer_code": 4117, + "maximum_buffer_size": 80, + "maximum_incoming_transfer_size": 80, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 80, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0xc0c9", + "device_type": "0x0001", + "input_clusters": [ + "0x0003", + "0x0005", + "0x0006" + ], + "output_clusters": [] + }, + "35": { + "profile_id": "0x0104", + "device_type": "0x0402", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x000f", + "0x0020", + "0x0500", + "0x0502" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + }, + "38": { + "profile_id": "0x0104", + "device_type": "0x0302", + "input_clusters": [ + "0x0000", + "0x0003", + "0x0402" + ], + "output_clusters": [ + "0x0003" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:2d:1d:92:32-35-1280", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "IASZone", + "translation_key": null, + "translation_placeholders": null, + "device_class": "smoke", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:2d:1d:92:32", + "endpoint_id": 35, + "available": true, + "group_id": null, + "attribute_name": "zone_status" + }, + "state": { + "class_name": "IASZone", + "available": true, + "state": false + } + } + ], + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:2d:1d:92:32-35-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:2d:1d:92:32", + "endpoint_id": 35, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:2d:1d:92:32-35-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:2d:1d:92:32", + "endpoint_id": 35, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 212 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:2d:1d:92:32-35-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:2d:1d:92:32", + "endpoint_id": 35, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -47 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:2d:1d:92:32-35-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:2d:1d:92:32", + "endpoint_id": 35, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_voltage": 3.2 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:2d:1d:92:32-38-1026", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Temperature", + "translation_key": null, + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:2d:1d:92:32", + "endpoint_id": 38, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "Temperature", + "available": true, + "state": 23.43 + } + } + ], + "siren": [ + { + "info_object": { + "fallback_name": "Siren", + "unique_id": "ab:cd:ef:12:2d:1d:92:32-35-1282", + "migrate_unique_ids": [], + "platform": "siren", + "class_name": "BasicSiren", + "translation_key": null, + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:2d:1d:92:32", + "endpoint_id": 35, + "available": true, + "group_id": null, + "available_tones": {}, + "supported_features": 19 + }, + "state": { + "class_name": "BasicSiren", + "available": true, + "state": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:2d:1d:92:32-35-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:2d:1d:92:32", + "endpoint_id": 35, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": null, + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/gledopto-gl-c-009p-0x17013001.json b/tests/data/devices/gledopto-gl-c-009p-0x17013001.json new file mode 100644 index 000000000..8c5301bbd --- /dev/null +++ b/tests/data/devices/gledopto-gl-c-009p-0x17013001.json @@ -0,0 +1,574 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:8c:97:e8:62", + "nwk": "0x176A", + "manufacturer": "GLEDOPTO", + "model": "GL-C-009P", + "friendly_manufacturer": "GLEDOPTO", + "friendly_model": "GL-C-009P", + "name": "GLEDOPTO GL-C-009P", + "quirk_applied": false, + "quirk_class": "zigpy.device.Device", + "exposes_features": [], + "manufacturer_code": 4687, + "power_source": "Mains", + "lqi": 204, + "rssi": -60, + "last_seen": "2026-06-07T01:36:10.165238+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4687, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "DIMMABLE_LIGHT", + "id": 257 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "GLEDOPTO" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "GL-C-009P" + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [ + { + "id": "0x0000", + "name": "current_level", + "zcl_type": "uint8", + "value": 143 + }, + { + "id": "0x0014", + "name": "default_move_rate", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0013", + "name": "off_transition_time", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0011", + "name": "on_level", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0010", + "name": "on_off_transition_time", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0012", + "name": "on_transition_time", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x4000", + "name": "start_up_current_level", + "zcl_type": "uint8", + "value": 255 + } + ] + }, + { + "cluster_id": "0x0300", + "endpoint_attribute": "light_color", + "attributes": [ + { + "id": "0x400a", + "name": "color_capabilities", + "zcl_type": "map16", + "value": 0 + }, + { + "id": "0x4002", + "name": "color_loop_active", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0008", + "name": "color_mode", + "zcl_type": "enum8", + "value": 2 + }, + { + "id": "0x400c", + "name": "color_temp_physical_max", + "zcl_type": "uint16", + "value": 495 + }, + { + "id": "0x400b", + "name": "color_temp_physical_min", + "zcl_type": "uint16", + "value": 158 + }, + { + "id": "0x0007", + "name": "color_temperature", + "zcl_type": "uint16", + "value": 158 + }, + { + "id": "0x0003", + "name": "current_x", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0004", + "name": "current_y", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x000f", + "name": "options", + "zcl_type": "map8", + "value": 0 + }, + { + "id": "0x4010", + "name": "start_up_color_temperature", + "zcl_type": "uint16", + "value": 65535 + } + ] + }, + { + "cluster_id": "0x1000", + "endpoint_attribute": "lightlink", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 385953793 + } + ] + } + ] + }, + "242": { + "profile_id": 41440, + "device_type": { + "name": "PROXY_BASIC", + "id": 97 + }, + "in_clusters": [], + "out_clusters": [ + { + "cluster_id": "0x0021", + "endpoint_attribute": "green_power", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "GLEDOPTO", + "model": "GL-C-009P", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4687, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0101", + "input_clusters": [ + "0x0000", + "0x0003", + "0x0004", + "0x0005", + "0x0006", + "0x0008", + "0x0300", + "0x1000" + ], + "output_clusters": [ + "0x0019" + ] + }, + "242": { + "profile_id": "0xa1e0", + "device_type": "0x0061", + "input_clusters": [], + "output_clusters": [ + "0x0021" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "light": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-1", + "migrate_unique_ids": [], + "platform": "light", + "class_name": "Light", + "translation_key": "light", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 1, + "available": true, + "group_id": null, + "effect_list": [ + "off" + ], + "supported_features": 40, + "min_mireds": 158, + "max_mireds": 495 + }, + "state": { + "class_name": "Light", + "available": true, + "on": false, + "brightness": 143, + "xy_color": null, + "color_temp": 158, + "effect_list": [ + "off" + ], + "effect": "off", + "supported_features": 40, + "color_mode": "color_temp", + "supported_color_modes": [ + "brightness", + "color_temp", + "onoff" + ], + "off_with_transition": false, + "off_brightness": null + }, + "extra_state_attributes": [ + "off_brightness", + "off_with_transition" + ] + } + ], + "number": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-1-768-start_up_color_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "StartUpColorTemperatureConfigurationEntity", + "translation_key": "start_up_color_temperature", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 495, + "native_min_value": 158, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "StartUpColorTemperatureConfigurationEntity", + "available": true, + "state": 65535 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-1-8-start_up_current_level", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "StartUpCurrentLevelConfigurationEntity", + "translation_key": "start_up_current_level", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 255, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "StartUpCurrentLevelConfigurationEntity", + "available": true, + "state": 255 + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-1-6-StartUpOnOff", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "StartupOnOffSelectEntity", + "translation_key": "start_up_on_off", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "StartUpOnOff", + "options": [ + "Off", + "On", + "Toggle", + "PreviousValue" + ] + }, + "state": { + "class_name": "StartupOnOffSelectEntity", + "available": true, + "state": "Off" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 204 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -60 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x17013001", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/gledopto-gl-c-009p-0x25013001.json b/tests/data/devices/gledopto-gl-c-009p-0x25013001.json new file mode 100644 index 000000000..4f4d1faae --- /dev/null +++ b/tests/data/devices/gledopto-gl-c-009p-0x25013001.json @@ -0,0 +1,453 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:8c:97:e8:62", + "nwk": "0x27EB", + "manufacturer": "GLEDOPTO", + "model": "GL-C-009P", + "friendly_manufacturer": "GLEDOPTO", + "friendly_model": "GL-C-009P", + "name": "GLEDOPTO GL-C-009P", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4687, + "power_source": "Mains", + "lqi": 112, + "rssi": -72, + "last_seen": "2026-03-07T18:12:04.230931+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4687, + "maximum_buffer_size": 74, + "maximum_incoming_transfer_size": 404, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 404, + "descriptor_capability_field": 0 + }, + "endpoints": { + "11": { + "profile_id": 260, + "device_type": { + "name": "DIMMABLE_LIGHT", + "id": 257 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "GLEDOPTO" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "GL-C-009P" + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 1 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "value": 255 + } + ] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [ + { + "id": "0x0000", + "name": "current_level", + "zcl_type": "uint8", + "value": 138 + }, + { + "id": "0x0014", + "name": "default_move_rate", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0013", + "name": "off_transition_time", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0011", + "name": "on_level", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0010", + "name": "on_off_transition_time", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0012", + "name": "on_transition_time", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x4000", + "name": "start_up_current_level", + "zcl_type": "uint8", + "value": 255 + } + ] + }, + { + "cluster_id": "0x1000", + "endpoint_attribute": "lightlink", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 620834817 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "GLEDOPTO", + "model": "GL-C-009P", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4687, + "maximum_buffer_size": 74, + "maximum_incoming_transfer_size": 404, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 404, + "descriptor_capability_field": 0 + }, + "endpoints": { + "11": { + "profile_id": "0x0104", + "device_type": "0x0101", + "input_clusters": [ + "0x0000", + "0x0003", + "0x0004", + "0x0005", + "0x0006", + "0x0008", + "0x0300", + "0x1000" + ], + "output_clusters": [ + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-11-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 11, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "light": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-11", + "migrate_unique_ids": [], + "platform": "light", + "class_name": "Light", + "translation_key": "light", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 11, + "available": true, + "group_id": null, + "effect_list": [ + "off" + ], + "supported_features": 40, + "min_mireds": 153, + "max_mireds": 500 + }, + "state": { + "class_name": "Light", + "available": true, + "on": true, + "brightness": 138, + "xy_color": null, + "color_temp": null, + "effect_list": [ + "off" + ], + "effect": "off", + "supported_features": 40, + "color_mode": "brightness", + "supported_color_modes": [ + "brightness", + "onoff" + ], + "off_with_transition": false, + "off_brightness": null + }, + "extra_state_attributes": [ + "off_brightness", + "off_with_transition" + ] + } + ], + "number": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-11-8-start_up_current_level", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "StartUpCurrentLevelConfigurationEntity", + "translation_key": "start_up_current_level", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 11, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 255, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "StartUpCurrentLevelConfigurationEntity", + "available": true, + "state": 255 + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-11-6-StartUpOnOff", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "StartupOnOffSelectEntity", + "translation_key": "start_up_on_off", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 11, + "available": true, + "group_id": null, + "enum": "StartUpOnOff", + "options": [ + "Off", + "On", + "Toggle", + "PreviousValue" + ] + }, + "state": { + "class_name": "StartupOnOffSelectEntity", + "available": true, + "state": "PreviousValue" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-11-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 11, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 112 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-11-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 11, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -72 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:97:e8:62-11-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:97:e8:62", + "endpoint_id": 11, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x25013001", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/ikea-of-sweden-rodret-dimmer-0x01000057.json b/tests/data/devices/ikea-of-sweden-rodret-dimmer-0x01000057.json new file mode 100644 index 000000000..75cf5d873 --- /dev/null +++ b/tests/data/devices/ikea-of-sweden-rodret-dimmer-0x01000057.json @@ -0,0 +1,393 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:05:fa:0a:e0", + "nwk": "0x0E8A", + "manufacturer": "IKEA of Sweden", + "model": "RODRET Dimmer", + "friendly_manufacturer": "IKEA of Sweden", + "friendly_model": "RODRET Dimmer", + "name": "IKEA of Sweden RODRET Dimmer", + "quirk_applied": true, + "quirk_class": "zhaquirks.ikea.twobtnremote.IkeaRodretRemote2BtnNew", + "exposes_features": [], + "manufacturer_code": 4476, + "power_source": "Battery or Unknown", + "lqi": 15, + "rssi": null, + "last_seen": "2025-08-14T19:37:13.098110+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4476, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "NON_COLOR_CONTROLLER", + "id": 2080 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0013", + "name": "alarm_mask", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "IKEA of Sweden" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "RODRET Dimmer" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 1 + }, + { + "id": "0x0034", + "name": "battery_rated_voltage", + "zcl_type": "uint8", + "value": 15 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 4 + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 15 + }, + { + "id": "0xfffe", + "name": "reporting_status", + "zcl_type": "enum8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0020", + "endpoint_attribute": "poll_control", + "attributes": [ + { + "id": "0x0003", + "name": "fast_poll_timeout", + "zcl_type": "uint16", + "value": 120 + } + ] + }, + { + "cluster_id": "0x1000", + "endpoint_attribute": "lightlink", + "attributes": [] + }, + { + "cluster_id": "0xfc7c", + "endpoint_attribute": "manufacturer_specific", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [ + { + "id": "0xfffd", + "name": "cluster_revision", + "zcl_type": "uint16", + "value": 3 + } + ] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 16777303 + } + ] + }, + { + "cluster_id": "0x1000", + "endpoint_attribute": "lightlink", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "IKEA of Sweden", + "model": "RODRET Dimmer", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4476, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0820", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0004", + "0x0020", + "0x1000", + "0xfc7c" + ], + "output_clusters": [ + "0x0003", + "0x0004", + "0x0006", + "0x0008", + "0x0019", + "0x1000" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:05:fa:0a:e0-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:05:fa:0a:e0", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:05:fa:0a:e0-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:05:fa:0a:e0", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 15 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:05:fa:0a:e0-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:05:fa:0a:e0", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:05:fa:0a:e0-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:05:fa:0a:e0", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_size": "AAA", + "battery_quantity": 1, + "battery_voltage": 1.5 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:05:fa:0a:e0-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:05:fa:0a:e0", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x01000057", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/inovelli-vzm30-sn.json b/tests/data/devices/inovelli-vzm30-sn.json new file mode 100644 index 000000000..de9def020 --- /dev/null +++ b/tests/data/devices/inovelli-vzm30-sn.json @@ -0,0 +1,1941 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "nwk": "0x0CE2", + "manufacturer": "Inovelli", + "model": "VZM30-SN", + "friendly_manufacturer": "Inovelli", + "friendly_model": "VZM30-SN", + "name": "Inovelli VZM30-SN", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4655, + "power_source": "Mains", + "lqi": 240, + "rssi": -40, + "last_seen": "2026-02-15T23:30:25.615727+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4655, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 500, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 500, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "DIMMABLE_LIGHT", + "id": 257 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "Inovelli" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "VZM30-SN" + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 1 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "value": 255 + } + ] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [ + { + "id": "0x0000", + "name": "current_level", + "zcl_type": "uint8", + "value": 254 + }, + { + "id": "0x0014", + "name": "default_move_rate", + "zcl_type": "uint8", + "value": 0 + }, + { + "id": "0x0013", + "name": "off_transition_time", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0011", + "name": "on_level", + "zcl_type": "uint8", + "value": 255 + }, + { + "id": "0x0010", + "name": "on_off_transition_time", + "zcl_type": "uint16", + "value": 0 + }, + { + "id": "0x0012", + "name": "on_transition_time", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x4000", + "name": "start_up_current_level", + "zcl_type": "uint8", + "value": 255 + } + ] + }, + { + "cluster_id": "0x0702", + "endpoint_attribute": "smartenergy_metering", + "attributes": [ + { + "id": "0x0000", + "name": "current_summ_delivered", + "zcl_type": "uint48", + "value": 0 + }, + { + "id": "0x0001", + "name": "current_summ_received", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0100", + "name": "current_tier1_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0102", + "name": "current_tier2_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0104", + "name": "current_tier3_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0106", + "name": "current_tier4_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0108", + "name": "current_tier5_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x010a", + "name": "current_tier6_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0304", + "name": "demand_formatting", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0302", + "name": "divisor", + "zcl_type": "uint24", + "value": 100 + }, + { + "id": "0x0400", + "name": "instantaneous_demand", + "zcl_type": "int24", + "unsupported": true + }, + { + "id": "0x0306", + "name": "metering_device_type", + "zcl_type": "map8", + "value": 0 + }, + { + "id": "0x0301", + "name": "multiplier", + "zcl_type": "uint24", + "value": 1 + }, + { + "id": "0x0200", + "name": "status", + "zcl_type": "map8", + "value": 0 + }, + { + "id": "0x0303", + "name": "summation_formatting", + "zcl_type": "map8", + "value": 66 + }, + { + "id": "0x0300", + "name": "unit_of_measure", + "zcl_type": "enum8", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0b04", + "endpoint_attribute": "electrical_measurement", + "attributes": [ + { + "id": "0x0603", + "name": "ac_current_divisor", + "zcl_type": "uint16", + "value": 99 + }, + { + "id": "0x0602", + "name": "ac_current_multiplier", + "zcl_type": "uint16", + "value": 1 + }, + { + "id": "0x0300", + "name": "ac_frequency", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0401", + "name": "ac_frequency_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0302", + "name": "ac_frequency_max", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0400", + "name": "ac_frequency_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0605", + "name": "ac_power_divisor", + "zcl_type": "uint16", + "value": 10 + }, + { + "id": "0x0604", + "name": "ac_power_multiplier", + "zcl_type": "uint16", + "value": 1 + }, + { + "id": "0x0601", + "name": "ac_voltage_divisor", + "zcl_type": "uint16", + "value": 10 + }, + { + "id": "0x0600", + "name": "ac_voltage_multiplier", + "zcl_type": "uint16", + "value": 1 + }, + { + "id": "0x050b", + "name": "active_power", + "zcl_type": "int16", + "value": 0 + }, + { + "id": "0x050d", + "name": "active_power_max", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x090d", + "name": "active_power_max_ph_b", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0a0d", + "name": "active_power_max_ph_c", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x090b", + "name": "active_power_ph_b", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0a0b", + "name": "active_power_ph_c", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x050f", + "name": "apparent_power", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0103", + "name": "dc_current", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0203", + "name": "dc_current_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0202", + "name": "dc_current_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0106", + "name": "dc_power", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0205", + "name": "dc_power_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0204", + "name": "dc_power_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0100", + "name": "dc_voltage", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0201", + "name": "dc_voltage_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0200", + "name": "dc_voltage_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0000", + "name": "measurement_type", + "zcl_type": "map32", + "unsupported": true + }, + { + "id": "0x0403", + "name": "power_divisor", + "zcl_type": "uint32", + "unsupported": true + }, + { + "id": "0x0510", + "name": "power_factor", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0910", + "name": "power_factor_ph_b", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0a10", + "name": "power_factor_ph_c", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0402", + "name": "power_multiplier", + "zcl_type": "uint32", + "unsupported": true + }, + { + "id": "0x0508", + "name": "rms_current", + "zcl_type": "uint16", + "value": 0 + }, + { + "id": "0x050a", + "name": "rms_current_max", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x090a", + "name": "rms_current_max_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a0a", + "name": "rms_current_max_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0908", + "name": "rms_current_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a08", + "name": "rms_current_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0505", + "name": "rms_voltage", + "zcl_type": "uint16", + "value": 1185 + }, + { + "id": "0x0507", + "name": "rms_voltage_max", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0907", + "name": "rms_voltage_max_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a07", + "name": "rms_voltage_max_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0905", + "name": "rms_voltage_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a05", + "name": "rms_voltage_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0304", + "name": "total_active_power", + "zcl_type": "int32", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0b05", + "endpoint_attribute": "diagnostic", + "attributes": [] + }, + { + "cluster_id": "0xfc31", + "endpoint_attribute": "inovelli_vzm31sn_cluster", + "attributes": [ + { + "id": "0x0012", + "name": "active_power_reports", + "zcl_type": "uint8", + "value": 10 + }, + { + "id": "0x000c", + "name": "auto_off_timer", + "zcl_type": "uint16", + "value": 0 + }, + { + "id": "0x000d", + "name": "default_level_local", + "zcl_type": "uint8", + "value": 255 + }, + { + "id": "0x000e", + "name": "default_level_remote", + "zcl_type": "uint8", + "value": 255 + }, + { + "id": "0x0006", + "name": "dimming_speed_down_local", + "zcl_type": "uint8", + "value": 127 + }, + { + "id": "0x0005", + "name": "dimming_speed_down_remote", + "zcl_type": "uint8", + "value": 127 + }, + { + "id": "0x0002", + "name": "dimming_speed_up_local", + "zcl_type": "uint8", + "value": 127 + }, + { + "id": "0x0001", + "name": "dimming_speed_up_remote", + "zcl_type": "uint8", + "value": 25 + }, + { + "id": "0x000b", + "name": "invert_switch", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x0011", + "name": "load_level_indicator_timeout", + "zcl_type": "uint8", + "value": 11 + }, + { + "id": "0x000a", + "name": "maximum_level", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0009", + "name": "minimum_level", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0004", + "name": "ramp_rate_off_to_on_local", + "zcl_type": "uint8", + "value": 127 + }, + { + "id": "0x0003", + "name": "ramp_rate_off_to_on_remote", + "zcl_type": "uint8", + "value": 0 + }, + { + "id": "0x0008", + "name": "ramp_rate_on_to_off_local", + "zcl_type": "uint8", + "value": 127 + }, + { + "id": "0x0007", + "name": "ramp_rate_on_to_off_remote", + "zcl_type": "uint8", + "value": 127 + }, + { + "id": "0x000f", + "name": "state_after_power_restored", + "zcl_type": "uint8", + "value": 255 + } + ] + }, + { + "cluster_id": "0xfc57", + "endpoint_attribute": "works_with_all_hubs", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "unsupported": true + } + ] + } + ] + }, + "2": { + "profile_id": 260, + "device_type": { + "name": "DIMMER_SWITCH", + "id": 260 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [] + }, + { + "cluster_id": "0xfc31", + "endpoint_attribute": "inovelli_vzm31sn_cluster", + "attributes": [] + } + ] + }, + "3": { + "profile_id": 260, + "device_type": { + "name": "DIMMER_SWITCH", + "id": 260 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [] + }, + { + "cluster_id": "0xfc31", + "endpoint_attribute": "inovelli_vzm31sn_cluster", + "attributes": [] + } + ] + }, + "4": { + "profile_id": 260, + "device_type": { + "name": "TEMPERATURE_SENSOR", + "id": 770 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0402", + "endpoint_attribute": "temperature", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "int16", + "value": 1760 + } + ] + }, + { + "cluster_id": "0x0405", + "endpoint_attribute": "humidity", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "uint16", + "value": 6147 + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + } + ] + }, + "242": { + "profile_id": 41440, + "device_type": { + "name": "PROXY_BASIC", + "id": 97 + }, + "in_clusters": [], + "out_clusters": [ + { + "cluster_id": "0x0021", + "endpoint_attribute": "green_power", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "Inovelli", + "model": "VZM30-SN", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4655, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 500, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 500, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0100", + "input_clusters": [ + "0x0000", + "0x0003", + "0x0004", + "0x0005", + "0x0006", + "0x0008", + "0x0702", + "0x0b04", + "0x0b05", + "0xfc31", + "0xfc57" + ], + "output_clusters": [ + "0x0019" + ] + }, + "2": { + "profile_id": "0x0104", + "device_type": "0x0104", + "input_clusters": [ + "0x0000", + "0x0003", + "0x0004", + "0x0005" + ], + "output_clusters": [ + "0x0003", + "0x0006", + "0x0008", + "0xfc31" + ] + }, + "3": { + "profile_id": "0x0104", + "device_type": "0x0104", + "input_clusters": [ + "0x0000", + "0x0003", + "0x0004", + "0x0005" + ], + "output_clusters": [ + "0x0003", + "0x0006", + "0x0008", + "0xfc31" + ] + }, + "4": { + "profile_id": "0x0104", + "device_type": "0x0302", + "input_clusters": [ + "0x0000", + "0x0003", + "0x0402", + "0x0405" + ], + "output_clusters": [ + "0x0003" + ] + }, + "242": { + "profile_id": "0xa1e0", + "device_type": "0x0061", + "input_clusters": [], + "output_clusters": [ + "0x0021" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "light": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1", + "migrate_unique_ids": [], + "platform": "light", + "class_name": "Light", + "translation_key": "light", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "effect_list": [ + "off" + ], + "supported_features": 40, + "min_mireds": 153, + "max_mireds": 500 + }, + "state": { + "class_name": "Light", + "available": true, + "on": true, + "brightness": 254, + "xy_color": null, + "color_temp": null, + "effect_list": [ + "off" + ], + "effect": "off", + "supported_features": 40, + "color_mode": "brightness", + "supported_color_modes": [ + "brightness", + "onoff" + ], + "off_with_transition": false, + "off_brightness": null + }, + "extra_state_attributes": [ + "off_brightness", + "off_with_transition" + ] + } + ], + "number": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-auto_off_timer", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliAutoShutoffTimer", + "translation_key": "auto_off_timer", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 32767, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliAutoShutoffTimer", + "available": true, + "state": 0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-default_level_local", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliLocalDefaultLevel", + "translation_key": "default_level_local", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 255, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliLocalDefaultLevel", + "available": true, + "state": 255 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-default_level_remote", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliRemoteDefaultLevel", + "translation_key": "default_level_remote", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 255, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliRemoteDefaultLevel", + "available": true, + "state": 255 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-dimming_speed_down_local", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliLocalDimmingDownSpeed", + "translation_key": "dimming_speed_down_local", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 127, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliLocalDimmingDownSpeed", + "available": true, + "state": 127 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-dimming_speed_down_remote", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliRemoteDimmingDownSpeed", + "translation_key": "dimming_speed_down_remote", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 127, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliRemoteDimmingDownSpeed", + "available": true, + "state": 127 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-dimming_speed_up_local", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliLocalDimmingUpSpeed", + "translation_key": "dimming_speed_up_local", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 127, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliLocalDimmingUpSpeed", + "available": true, + "state": 127 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-dimming_speed_up_remote", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliRemoteDimmingUpSpeed", + "translation_key": "dimming_speed_up_remote", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 126, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliRemoteDimmingUpSpeed", + "available": true, + "state": 25 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-load_level_indicator_timeout", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliLoadLevelIndicatorTimeout", + "translation_key": "load_level_indicator_timeout", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 11, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliLoadLevelIndicatorTimeout", + "available": true, + "state": 11 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-ramp_rate_off_to_on_local", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliLocalRampRateOffToOn", + "translation_key": "ramp_rate_off_to_on_local", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 127, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliLocalRampRateOffToOn", + "available": true, + "state": 127 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-ramp_rate_off_to_on_remote", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliRemoteDimmingSpeedOffToOn", + "translation_key": "ramp_rate_off_to_on_remote", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 127, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliRemoteDimmingSpeedOffToOn", + "available": true, + "state": 0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-ramp_rate_on_to_off_local", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliLocalRampRateOnToOff", + "translation_key": "ramp_rate_on_to_off_local", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 127, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliLocalRampRateOnToOff", + "available": true, + "state": 127 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-ramp_rate_on_to_off_remote", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliRemoteDimmingSpeedOnToOff", + "translation_key": "ramp_rate_on_to_off_remote", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 127, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliRemoteDimmingSpeedOnToOff", + "available": true, + "state": 127 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-state_after_power_restored", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "InovelliStartupDefaultLevel", + "translation_key": "state_after_power_restored", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 255, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "InovelliStartupDefaultLevel", + "available": true, + "state": 255 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-8-default_move_rate", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "DefaultMoveRateConfigurationEntity", + "translation_key": "default_move_rate", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 254, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "DefaultMoveRateConfigurationEntity", + "available": true, + "state": 0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-8-on_level", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "OnLevelConfigurationEntity", + "translation_key": "on_level", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 255, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "OnLevelConfigurationEntity", + "available": true, + "state": 255 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-8-on_off_transition_time", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "OnOffTransitionTimeConfigurationEntity", + "translation_key": "on_off_transition_time", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 65535, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "OnOffTransitionTimeConfigurationEntity", + "available": true, + "state": 0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-8-start_up_current_level", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "StartUpCurrentLevelConfigurationEntity", + "translation_key": "start_up_current_level", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 255, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "StartUpCurrentLevelConfigurationEntity", + "available": true, + "state": 255 + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-6-StartUpOnOff", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "StartupOnOffSelectEntity", + "translation_key": "start_up_on_off", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "StartUpOnOff", + "options": [ + "Off", + "On", + "Toggle", + "PreviousValue" + ] + }, + "state": { + "class_name": "StartupOnOffSelectEntity", + "available": true, + "state": "PreviousValue" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 240 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -40 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-1794-summation_delivered", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "SmartEnergySummation", + "translation_key": "summation_delivered", + "translation_placeholders": null, + "device_class": "energy", + "state_class": "total_increasing", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 3, + "unit": "kWh" + }, + "state": { + "class_name": "SmartEnergySummation", + "available": true, + "state": 0.0, + "device_type": "Electric Metering", + "status": "NO_ALARMS", + "zcl_unit_of_measurement": 0 + }, + "extra_state_attributes": [ + "device_type", + "status", + "zcl_unit_of_measurement" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-2820", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ElectricalMeasurementActivePower", + "translation_key": null, + "translation_placeholders": null, + "device_class": "power", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 1, + "unit": "W" + }, + "state": { + "class_name": "ElectricalMeasurementActivePower", + "available": true, + "state": 0.0 + }, + "extra_state_attributes": [ + "active_power_max", + "measurement_type" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-2820-rms_current", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ElectricalMeasurementRMSCurrent", + "translation_key": null, + "translation_placeholders": null, + "device_class": "current", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 2, + "unit": "A" + }, + "state": { + "class_name": "ElectricalMeasurementRMSCurrent", + "available": true, + "state": 0.0 + }, + "extra_state_attributes": [ + "measurement_type", + "rms_current_max" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-2820-rms_voltage", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ElectricalMeasurementRMSVoltage", + "translation_key": null, + "translation_placeholders": null, + "device_class": "voltage", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 1, + "unit": "V" + }, + "state": { + "class_name": "ElectricalMeasurementRMSVoltage", + "available": true, + "state": 118.5 + }, + "extra_state_attributes": [ + "measurement_type", + "rms_voltage_max" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "InovelliInternalTemperature", + "translation_key": "internal_temp_monitor", + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "InovelliInternalTemperature", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-overheated", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "InovelliOverheated", + "translation_key": "overheated", + "translation_placeholders": null, + "device_class": "enum", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "InovelliOverheated", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-4-1026", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Temperature", + "translation_key": null, + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 4, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "Temperature", + "available": true, + "state": 17.6 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-4-1029", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Humidity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "humidity", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 4, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "%" + }, + "state": { + "class_name": "Humidity", + "available": true, + "state": 61.47 + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-64561-invert_switch", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "InovelliInvertSwitch", + "translation_key": "invert_switch", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "invert_switch", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "InovelliInvertSwitch", + "available": true, + "state": false, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9a:d6:cb:e7-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9a:d6:cb:e7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": null, + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/legrand-light-switch-with-neutral.json b/tests/data/devices/legrand-light-switch-with-neutral.json new file mode 100644 index 000000000..6d71a128b --- /dev/null +++ b/tests/data/devices/legrand-light-switch-with-neutral.json @@ -0,0 +1,615 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:39:bc:b5:2d", + "nwk": "0x6CCF", + "manufacturer": " Legrand", + "model": " Light switch with neutral", + "friendly_manufacturer": " Legrand", + "friendly_model": " Light switch with neutral", + "name": " Legrand Light switch with neutral", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4129, + "power_source": "Mains", + "lqi": 212, + "rssi": -58, + "last_seen": "2025-09-11T19:28:42.125323+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": true, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4129, + "maximum_buffer_size": 89, + "maximum_incoming_transfer_size": 63, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 63, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_LIGHT", + "id": 256 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": " Legrand" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": " Light switch with neutral" + }, + { + "id": "0x4000", + "name": "sw_build_id", + "zcl_type": "string", + "value": "001c" + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "value": 255 + } + ] + }, + { + "cluster_id": "0x000f", + "endpoint_attribute": "binary_input", + "attributes": [ + { + "id": "0x001c", + "name": "description", + "zcl_type": "string", + "unsupported": true + }, + { + "id": "0x0055", + "name": "present_value", + "zcl_type": "bool", + "value": 0 + } + ] + }, + { + "cluster_id": "0xfc01", + "endpoint_attribute": "legrand_cluster", + "attributes": [ + { + "id": "0x0000", + "name": "device_mode", + "zcl_type": "data16", + "unsupported": true + }, + { + "id": "0x0001", + "name": "led_dark", + "zcl_type": "bool", + "value": 0 + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x4000", + "name": "sw_build_id", + "zcl_type": "string", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "unsupported": true + }, + { + "id": "0x0003", + "name": "current_zigbee_stack_version", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x000a", + "name": "image_stamp", + "zcl_type": "uint32", + "unsupported": true + }, + { + "id": "0x0008", + "name": "image_type_id", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0xfffe", + "name": "reporting_status", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x000b", + "name": "upgrade_activation_policy", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x0000", + "name": "upgrade_server_id", + "zcl_type": "EUI64", + "value": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } + ] + }, + { + "cluster_id": "0x0102", + "endpoint_attribute": "window_covering", + "attributes": [] + }, + { + "cluster_id": "0xfc01", + "endpoint_attribute": "manufacturer_specific", + "attributes": [] + } + ] + }, + "242": { + "profile_id": 41440, + "device_type": { + "name": "COMBO_BASIC", + "id": 102 + }, + "in_clusters": [ + { + "cluster_id": "0x0021", + "endpoint_attribute": "green_power", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0021", + "endpoint_attribute": "green_power", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": " Legrand", + "model": " Light switch with neutral", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 1, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4129, + "maximum_buffer_size": 89, + "maximum_incoming_transfer_size": 63, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 63, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0100", + "input_clusters": [ + "0x0000", + "0x0003", + "0x0004", + "0x0005", + "0x0006", + "0x000f", + "0xfc01" + ], + "output_clusters": [ + "0x0000", + "0x0005", + "0x0006", + "0x0019", + "0x0102", + "0xfc01" + ] + }, + "242": { + "profile_id": "0xa1e0", + "device_type": "0x0066", + "input_clusters": [ + "0x0021" + ], + "output_clusters": [ + "0x0021" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:39:bc:b5:2d-1-15", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "BinaryInput", + "translation_key": "binary_input", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:39:bc:b5:2d", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "present_value" + }, + "state": { + "class_name": "BinaryInput", + "available": true, + "state": false + } + } + ], + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:39:bc:b5:2d-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:39:bc:b5:2d", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "light": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:39:bc:b5:2d-1", + "migrate_unique_ids": [], + "platform": "light", + "class_name": "Light", + "translation_key": "light", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:39:bc:b5:2d", + "endpoint_id": 1, + "available": true, + "group_id": null, + "effect_list": [ + "off" + ], + "supported_features": 8, + "min_mireds": 153, + "max_mireds": 500 + }, + "state": { + "class_name": "Light", + "available": true, + "on": false, + "brightness": null, + "xy_color": null, + "color_temp": null, + "effect_list": [ + "off" + ], + "effect": "off", + "supported_features": 8, + "color_mode": "onoff", + "supported_color_modes": [ + "onoff" + ], + "off_with_transition": false, + "off_brightness": null + }, + "extra_state_attributes": [ + "off_brightness", + "off_with_transition" + ] + } + ], + "select": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:39:bc:b5:2d-1-6-StartUpOnOff", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "StartupOnOffSelectEntity", + "translation_key": "start_up_on_off", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:39:bc:b5:2d", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "StartUpOnOff", + "options": [ + "Off", + "On", + "Toggle", + "PreviousValue" + ] + }, + "state": { + "class_name": "StartupOnOffSelectEntity", + "available": true, + "state": "PreviousValue" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:39:bc:b5:2d-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:39:bc:b5:2d", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 212 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:39:bc:b5:2d-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:39:bc:b5:2d", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -58 + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": "Turn on LED when off", + "unique_id": "ab:cd:ef:12:39:bc:b5:2d-1-led_dark", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "turn_on_led_when_off", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:39:bc:b5:2d", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "led_dark", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + }, + { + "info_object": { + "fallback_name": "Turn on LED when on", + "unique_id": "ab:cd:ef:12:39:bc:b5:2d-1-led_on", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "turn_on_led_when_on", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:39:bc:b5:2d", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "led_on", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:39:bc:b5:2d-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:39:bc:b5:2d", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": null, + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/lumi-lumi-curtain-acn002-0x00000f20.json b/tests/data/devices/lumi-lumi-curtain-acn002-0x00000f20.json new file mode 100644 index 000000000..d5b608e70 --- /dev/null +++ b/tests/data/devices/lumi-lumi-curtain-acn002-0x00000f20.json @@ -0,0 +1,755 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:dc:6a:11:ac", + "nwk": "0x3A21", + "manufacturer": "LUMI", + "model": "lumi.curtain.acn002", + "friendly_manufacturer": "LUMI", + "friendly_model": "lumi.curtain.acn002", + "name": "LUMI lumi.curtain.acn002", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4447, + "power_source": "Battery or Unknown", + "lqi": null, + "rssi": null, + "last_seen": "2026-05-07T05:12:52.177250+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4447, + "maximum_buffer_size": 127, + "maximum_incoming_transfer_size": 100, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 100, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_LIGHT", + "id": 256 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "LUMI" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "lumi.curtain.acn002" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 1 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 255 + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0002", + "endpoint_attribute": "device_temperature", + "attributes": [ + { + "id": "0x0000", + "name": "current_temperature", + "zcl_type": "int16", + "value": 30 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [] + }, + { + "cluster_id": "0x0009", + "endpoint_attribute": "alarms", + "attributes": [] + }, + { + "cluster_id": "0x000d", + "endpoint_attribute": "analog_output", + "attributes": [ + { + "id": "0x0100", + "name": "application_type", + "zcl_type": "uint32", + "unsupported": true + }, + { + "id": "0x001c", + "name": "description", + "zcl_type": "string", + "value": "Current position" + }, + { + "id": "0x0075", + "name": "engineering_units", + "zcl_type": "enum16", + "unsupported": true + }, + { + "id": "0x0041", + "name": "max_present_value", + "zcl_type": "single", + "value": 100.0 + }, + { + "id": "0x0045", + "name": "min_present_value", + "zcl_type": "single", + "value": 0.0 + }, + { + "id": "0x0051", + "name": "out_of_service", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x0055", + "name": "present_value", + "zcl_type": "single", + "value": 0.0 + }, + { + "id": "0x0068", + "name": "relinquish_default", + "zcl_type": "single", + "unsupported": true + }, + { + "id": "0x006a", + "name": "resolution", + "zcl_type": "single", + "value": 1.0 + }, + { + "id": "0x006f", + "name": "status_flags", + "zcl_type": "map8", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0013", + "endpoint_attribute": "multistate_output", + "attributes": [ + { + "id": "0x0055", + "name": "present_value", + "zcl_type": "uint16", + "value": 1 + } + ] + }, + { + "cluster_id": "0x0102", + "endpoint_attribute": "window_covering", + "attributes": [ + { + "id": "0x0007", + "name": "config_status", + "zcl_type": "map8", + "value": 43 + }, + { + "id": "0x0008", + "name": "current_position_lift_percentage", + "zcl_type": "uint8", + "value": 0 + }, + { + "id": "0x0009", + "name": "current_position_tilt_percentage", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0011", + "name": "installed_closed_limit_lift", + "zcl_type": "uint16", + "value": 65535 + }, + { + "id": "0x0013", + "name": "installed_closed_limit_tilt", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0010", + "name": "installed_open_limit_lift", + "zcl_type": "uint16", + "value": 0 + }, + { + "id": "0x0012", + "name": "installed_open_limit_tilt", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0017", + "name": "window_covering_mode", + "zcl_type": "map8", + "value": 8 + }, + { + "id": "0x0000", + "name": "window_covering_type", + "zcl_type": "enum8", + "value": 0 + } + ] + }, + { + "cluster_id": "0xfcc0", + "endpoint_attribute": "opple_cluster", + "attributes": [ + { + "id": "0x0409", + "name": "charging", + "zcl_type": "uint8", + "value": 2 + }, + { + "id": "0x0402", + "name": "positions_stored", + "zcl_type": "bool", + "value": 1 + }, + { + "id": "0x0408", + "name": "speed", + "zcl_type": "uint8", + "value": 2 + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 3872 + } + ] + } + ] + }, + "242": { + "profile_id": 41440, + "device_type": { + "name": "PROXY_BASIC", + "id": 97 + }, + "in_clusters": [], + "out_clusters": [ + { + "cluster_id": "0x0021", + "endpoint_attribute": "green_power", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "LUMI", + "model": "lumi.curtain.acn002", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4447, + "maximum_buffer_size": 127, + "maximum_incoming_transfer_size": 100, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 100, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0100", + "input_clusters": [ + "0x0000", + "0x0002", + "0x0003", + "0x0004", + "0x0005", + "0x0006", + "0x0009", + "0x000d", + "0x0013", + "0x0102" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + }, + "242": { + "profile_id": "0xa1e0", + "device_type": "0x0061", + "input_clusters": [], + "output_clusters": [ + "0x0021" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": "Charging", + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-charging", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "BinarySensor", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery_charging", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "charging" + }, + "state": { + "class_name": "BinarySensor", + "available": true, + "state": false + } + }, + { + "info_object": { + "fallback_name": "Calibrated", + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-positions_stored", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "BinarySensor", + "translation_key": "calibrated", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "positions_stored" + }, + "state": { + "class_name": "BinarySensor", + "available": true, + "state": true + } + } + ], + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "cover": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-258", + "migrate_unique_ids": [], + "platform": "cover", + "class_name": "Cover", + "translation_key": "cover", + "translation_placeholders": null, + "device_class": "shade", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null + }, + "state": { + "class_name": "Cover", + "available": true, + "current_position": 100, + "current_tilt_position": null, + "state": "open", + "is_opening": false, + "is_closing": false, + "is_closed": false, + "supported_features": 15 + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": "Speed", + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-speed", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "speed", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "AqaraRollerDriverSpeed", + "options": [ + "Low", + "Medium", + "High" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": "High" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": null, + "battery_size": "Unknown", + "battery_quantity": 1 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-2", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "DeviceTemperature", + "translation_key": "device_temperature", + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "DeviceTemperature", + "available": true, + "state": 0.3 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-258-window_covering_type", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "WindowCoveringTypeSensor", + "translation_key": "window_covering_type", + "translation_placeholders": null, + "device_class": "enum", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "WindowCoveringTypeSensor", + "available": true, + "state": "Rollershade" + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-258-inverted", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "WindowCoveringInversionSwitch", + "translation_key": "inverted", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "config_status", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "WindowCoveringInversionSwitch", + "available": true, + "state": false, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:dc:6a:11:ac-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:dc:6a:11:ac", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00000f20", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/lumi-lumi-plug-maeu01-0x0000002d.json b/tests/data/devices/lumi-lumi-plug-maeu01-0x0000002d.json new file mode 100644 index 000000000..e4008d991 --- /dev/null +++ b/tests/data/devices/lumi-lumi-plug-maeu01-0x0000002d.json @@ -0,0 +1,1032 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:49:c1:10:71", + "nwk": "0x3E39", + "manufacturer": "LUMI", + "model": "lumi.plug.maeu01", + "friendly_manufacturer": "LUMI", + "friendly_model": "lumi.plug.maeu01", + "name": "LUMI lumi.plug.maeu01", + "quirk_applied": true, + "quirk_class": "zhaquirks.xiaomi.aqara.plug_eu.PlugMAEU01", + "exposes_features": [], + "manufacturer_code": 4447, + "power_source": "Mains", + "lqi": 164, + "rssi": -70, + "last_seen": "2026-04-18T05:25:30.234077+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4447, + "maximum_buffer_size": 127, + "maximum_incoming_transfer_size": 100, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 100, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "SMART_PLUG", + "id": 81 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0001", + "name": "app_version", + "zcl_type": "uint8", + "value": 45 + }, + { + "id": "0x0006", + "name": "date_code", + "zcl_type": "string", + "value": "07-19-2024" + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "LUMI" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "lumi.plug.maeu01" + } + ] + }, + { + "cluster_id": "0x0002", + "endpoint_attribute": "device_temperature", + "attributes": [ + { + "id": "0x0000", + "name": "current_temperature", + "zcl_type": "int16", + "value": 1800 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 1 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0009", + "endpoint_attribute": "alarms", + "attributes": [] + }, + { + "cluster_id": "0x0702", + "endpoint_attribute": "smartenergy_metering", + "attributes": [ + { + "id": "0x0000", + "name": "current_summ_delivered", + "zcl_type": "uint48", + "value": 36079 + }, + { + "id": "0x0001", + "name": "current_summ_received", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0100", + "name": "current_tier1_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0102", + "name": "current_tier2_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0104", + "name": "current_tier3_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0106", + "name": "current_tier4_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0108", + "name": "current_tier5_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x010a", + "name": "current_tier6_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0304", + "name": "demand_formatting", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0302", + "name": "divisor", + "zcl_type": "uint24", + "value": 1000 + }, + { + "id": "0x0400", + "name": "instantaneous_demand", + "zcl_type": "int24", + "unsupported": true + }, + { + "id": "0x0306", + "name": "metering_device_type", + "zcl_type": "map8", + "value": 0 + }, + { + "id": "0x0301", + "name": "multiplier", + "zcl_type": "uint24", + "value": 1 + }, + { + "id": "0x0200", + "name": "status", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0303", + "name": "summation_formatting", + "zcl_type": "map8", + "value": 35 + }, + { + "id": "0x0300", + "name": "unit_of_measure", + "zcl_type": "enum8", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0b04", + "endpoint_attribute": "electrical_measurement", + "attributes": [ + { + "id": "0x0603", + "name": "ac_current_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0602", + "name": "ac_current_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0300", + "name": "ac_frequency", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0401", + "name": "ac_frequency_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0302", + "name": "ac_frequency_max", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0400", + "name": "ac_frequency_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0605", + "name": "ac_power_divisor", + "zcl_type": "uint16", + "value": 10 + }, + { + "id": "0x0604", + "name": "ac_power_multiplier", + "zcl_type": "uint16", + "value": 1 + }, + { + "id": "0x0601", + "name": "ac_voltage_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0600", + "name": "ac_voltage_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x050b", + "name": "active_power", + "zcl_type": "int16", + "value": 0 + }, + { + "id": "0x050d", + "name": "active_power_max", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x090d", + "name": "active_power_max_ph_b", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0a0d", + "name": "active_power_max_ph_c", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x090b", + "name": "active_power_ph_b", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0a0b", + "name": "active_power_ph_c", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x050f", + "name": "apparent_power", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0103", + "name": "dc_current", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0203", + "name": "dc_current_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0202", + "name": "dc_current_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0106", + "name": "dc_power", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0205", + "name": "dc_power_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0204", + "name": "dc_power_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0100", + "name": "dc_voltage", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0201", + "name": "dc_voltage_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0200", + "name": "dc_voltage_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0000", + "name": "measurement_type", + "zcl_type": "map32", + "unsupported": true + }, + { + "id": "0x0403", + "name": "power_divisor", + "zcl_type": "uint32", + "value": 1 + }, + { + "id": "0x0510", + "name": "power_factor", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0910", + "name": "power_factor_ph_b", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0a10", + "name": "power_factor_ph_c", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0402", + "name": "power_multiplier", + "zcl_type": "uint32", + "value": 1 + }, + { + "id": "0x0508", + "name": "rms_current", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x050a", + "name": "rms_current_max", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x090a", + "name": "rms_current_max_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a0a", + "name": "rms_current_max_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0908", + "name": "rms_current_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a08", + "name": "rms_current_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0505", + "name": "rms_voltage", + "zcl_type": "uint16", + "value": 230 + }, + { + "id": "0x0507", + "name": "rms_voltage_max", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0907", + "name": "rms_voltage_max_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a07", + "name": "rms_voltage_max_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0905", + "name": "rms_voltage_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a05", + "name": "rms_voltage_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0304", + "name": "total_active_power", + "zcl_type": "int32", + "unsupported": true + } + ] + }, + { + "cluster_id": "0xfcc0", + "endpoint_attribute": "opple_cluster", + "attributes": [ + { + "id": "0x0207", + "name": "consumer_connected", + "zcl_type": "bool", + "value": 1 + }, + { + "id": "0x0009", + "name": "mode", + "zcl_type": "uint8", + "value": 1 + }, + { + "id": "0x0201", + "name": "power_outage_memory", + "zcl_type": "bool", + "value": 1 + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 45 + } + ] + } + ] + }, + "21": { + "profile_id": 260, + "device_type": { + "name": "SMART_PLUG", + "id": 81 + }, + "in_clusters": [ + { + "cluster_id": "0x000c", + "endpoint_attribute": "analog_input", + "attributes": [ + { + "id": "0x0100", + "name": "application_type", + "zcl_type": "uint32", + "value": 589824 + }, + { + "id": "0x001c", + "name": "description", + "zcl_type": "string", + "unsupported": true + }, + { + "id": "0x0075", + "name": "engineering_units", + "zcl_type": "enum16", + "unsupported": true + }, + { + "id": "0x0041", + "name": "max_present_value", + "zcl_type": "single", + "unsupported": true + }, + { + "id": "0x0045", + "name": "min_present_value", + "zcl_type": "single", + "unsupported": true + }, + { + "id": "0x0051", + "name": "out_of_service", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x0055", + "name": "present_value", + "zcl_type": "single", + "value": 0.0 + }, + { + "id": "0x0067", + "name": "reliability", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x006a", + "name": "resolution", + "zcl_type": "single", + "unsupported": true + }, + { + "id": "0x006f", + "name": "status_flags", + "zcl_type": "map8", + "value": 0 + } + ] + } + ], + "out_clusters": [] + }, + "242": { + "profile_id": 41440, + "device_type": { + "name": "PROXY_BASIC", + "id": 97 + }, + "in_clusters": [], + "out_clusters": [ + { + "cluster_id": "0x0021", + "endpoint_attribute": "green_power", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "LUMI", + "model": "lumi.plug.maeu01", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4447, + "maximum_buffer_size": 127, + "maximum_incoming_transfer_size": 100, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 100, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0051", + "input_clusters": [ + "0x0000", + "0x0002", + "0x0003", + "0x0004", + "0x0005", + "0x0006", + "0x0009", + "0x0702", + "0x0b04" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + }, + "242": { + "profile_id": "0xa1e0", + "device_type": "0x0061", + "input_clusters": [], + "output_clusters": [ + "0x0021" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:49:c1:10:71-1-64704-consumer_connected", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "XiaomiPlugConsumerConnected", + "translation_key": "consumer_connected", + "translation_placeholders": null, + "device_class": "plug", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:49:c1:10:71", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "consumer_connected" + }, + "state": { + "class_name": "XiaomiPlugConsumerConnected", + "available": true, + "state": true + } + } + ], + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:49:c1:10:71-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:49:c1:10:71", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:49:c1:10:71-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:49:c1:10:71", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 164 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:49:c1:10:71-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:49:c1:10:71", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -70 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:49:c1:10:71-1-1794-summation_delivered", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "SmartEnergySummation", + "translation_key": "summation_delivered", + "translation_placeholders": null, + "device_class": "energy", + "state_class": "total_increasing", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:49:c1:10:71", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 3, + "unit": "kWh" + }, + "state": { + "class_name": "SmartEnergySummation", + "available": true, + "state": 36.079, + "device_type": "Electric Metering", + "zcl_unit_of_measurement": 0 + }, + "extra_state_attributes": [ + "device_type", + "status", + "zcl_unit_of_measurement" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:49:c1:10:71-1-2", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "DeviceTemperature", + "translation_key": "device_temperature", + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:49:c1:10:71", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "DeviceTemperature", + "available": true, + "state": 18.0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:49:c1:10:71-1-2820", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ElectricalMeasurementActivePower", + "translation_key": null, + "translation_placeholders": null, + "device_class": "power", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:49:c1:10:71", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 1, + "unit": "W" + }, + "state": { + "class_name": "ElectricalMeasurementActivePower", + "available": true, + "state": 0.0 + }, + "extra_state_attributes": [ + "active_power_max", + "measurement_type" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:49:c1:10:71-1-2820-rms_voltage", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ElectricalMeasurementRMSVoltage", + "translation_key": null, + "translation_placeholders": null, + "device_class": "voltage", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:49:c1:10:71", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 1, + "unit": "V" + }, + "state": { + "class_name": "ElectricalMeasurementRMSVoltage", + "available": true, + "state": 230.0 + }, + "extra_state_attributes": [ + "measurement_type", + "rms_voltage_max" + ] + } + ], + "switch": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:49:c1:10:71-1", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "Switch", + "translation_key": "switch", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:49:c1:10:71", + "endpoint_id": 1, + "available": true, + "group_id": null + }, + "state": { + "class_name": "Switch", + "state": 1, + "available": true + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:49:c1:10:71-1-power_outage_memory", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "XiaomiPlugPowerOutageMemorySwitch", + "translation_key": "power_outage_memory", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:49:c1:10:71", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "power_outage_memory", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "XiaomiPlugPowerOutageMemorySwitch", + "available": true, + "state": true, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:49:c1:10:71-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:49:c1:10:71", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x0000002d", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/lumi-lumi-remote-cagl02-0x0000001c.json b/tests/data/devices/lumi-lumi-remote-cagl02-0x0000001c.json new file mode 100644 index 000000000..404c2cb60 --- /dev/null +++ b/tests/data/devices/lumi-lumi-remote-cagl02-0x0000001c.json @@ -0,0 +1,384 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:6c:02:d4:c2", + "nwk": "0x16E8", + "manufacturer": "LUMI", + "model": "lumi.remote.cagl02", + "friendly_manufacturer": "LUMI", + "friendly_model": "lumi.remote.cagl02", + "name": "LUMI lumi.remote.cagl02", + "quirk_applied": true, + "quirk_class": "zhaquirks.xiaomi.aqara.cube_aqgl01.CubeCAGL02", + "exposes_features": [], + "manufacturer_code": 4447, + "power_source": "Battery or Unknown", + "lqi": 255, + "rssi": -21, + "last_seen": "2025-09-03T12:34:21.195400+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4447, + "maximum_buffer_size": 127, + "maximum_incoming_transfer_size": 100, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 100, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "undefined_0x6f01", + "id": 28417 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 1 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 9 + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0012", + "endpoint_attribute": "multistate_input", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 28 + } + ] + } + ] + }, + "2": { + "profile_id": 260, + "device_type": { + "name": "undefined_0x6f01", + "id": 28417 + }, + "in_clusters": [ + { + "cluster_id": "0x0012", + "endpoint_attribute": "multistate_input", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0012", + "endpoint_attribute": "multistate_input", + "attributes": [] + } + ] + }, + "3": { + "profile_id": 260, + "device_type": { + "name": "undefined_0x6f01", + "id": 28417 + }, + "in_clusters": [ + { + "cluster_id": "0x000c", + "endpoint_attribute": "analog_input", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000c", + "endpoint_attribute": "analog_input", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "LUMI", + "model": "lumi.remote.cagl02", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4447, + "maximum_buffer_size": 127, + "maximum_incoming_transfer_size": 100, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 100, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0103", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0006", + "0x0012" + ], + "output_clusters": [ + "0x0000", + "0x0003", + "0x0019" + ] + }, + "2": { + "profile_id": "0x0104", + "device_type": "0x0103", + "input_clusters": [ + "0x0012" + ], + "output_clusters": [ + "0x0012" + ] + }, + "3": { + "profile_id": "0x0104", + "device_type": "0x0103", + "input_clusters": [ + "0x000c" + ], + "output_clusters": [ + "0x000c" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6c:02:d4:c2-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6c:02:d4:c2", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6c:02:d4:c2-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6c:02:d4:c2", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 255 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6c:02:d4:c2-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6c:02:d4:c2", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -21 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6c:02:d4:c2-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6c:02:d4:c2", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": null, + "battery_size": "CR2450", + "battery_quantity": 1 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6c:02:d4:c2-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6c:02:d4:c2", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x0000001c", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/lumi-lumi-switch-n0agl1.json b/tests/data/devices/lumi-lumi-switch-n0agl1.json new file mode 100644 index 000000000..534162d62 --- /dev/null +++ b/tests/data/devices/lumi-lumi-switch-n0agl1.json @@ -0,0 +1,1041 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:e9:c7:8a:67", + "nwk": "0x8AF1", + "manufacturer": "LUMI", + "model": "lumi.switch.n0agl1", + "friendly_manufacturer": "LUMI", + "friendly_model": "lumi.switch.n0agl1", + "name": "LUMI lumi.switch.n0agl1", + "quirk_applied": true, + "quirk_class": "zhaquirks.xiaomi.aqara.switch_t1.SwitchT1Alt3", + "exposes_features": [], + "manufacturer_code": 4447, + "power_source": "Mains", + "lqi": 255, + "rssi": -64, + "last_seen": "2025-05-12T10:38:28.889996+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4447, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_SWITCH", + "id": 0 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "LUMI" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "lumi.switch.n0agl1" + }, + { + "id": "0x4000", + "name": "sw_build_id", + "zcl_type": "string", + "value": "" + } + ] + }, + { + "cluster_id": "0x0002", + "endpoint_attribute": "device_temperature", + "attributes": [ + { + "id": "0x0000", + "name": "current_temperature", + "zcl_type": "int16", + "value": 18 + }, + { + "id": "0x0010", + "name": "dev_temp_alarm_mask", + "zcl_type": "map8", + "value": 1 + }, + { + "id": "0x0012", + "name": "high_temp_thres", + "zcl_type": "int16", + "value": 70 + }, + { + "id": "0x0011", + "name": "low_temp_thres", + "zcl_type": "int16", + "value": 0 + }, + { + "id": "0x0002", + "name": "max_temp_experienced", + "zcl_type": "int16", + "value": 0 + }, + { + "id": "0x0001", + "name": "min_temp_experienced", + "zcl_type": "int16", + "value": 0 + }, + { + "id": "0x0003", + "name": "over_temp_total_dwell", + "zcl_type": "uint16", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "value": 255 + } + ] + }, + { + "cluster_id": "0x0009", + "endpoint_attribute": "alarms", + "attributes": [] + }, + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0702", + "endpoint_attribute": "smartenergy_metering", + "attributes": [ + { + "id": "0x0019", + "name": "control_temperature", + "zcl_type": "int24", + "unsupported": true + }, + { + "id": "0x0000", + "name": "current_summ_delivered", + "zcl_type": "uint48", + "value": 41150 + }, + { + "id": "0x0001", + "name": "current_summ_received", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0100", + "name": "current_tier1_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0102", + "name": "current_tier2_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0104", + "name": "current_tier3_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0106", + "name": "current_tier4_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0108", + "name": "current_tier5_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x010a", + "name": "current_tier6_summ_delivered", + "zcl_type": "uint48", + "unsupported": true + }, + { + "id": "0x0304", + "name": "demand_formatting", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0302", + "name": "divisor", + "zcl_type": "uint24", + "value": 1000 + }, + { + "id": "0x0017", + "name": "inlet_temperature", + "zcl_type": "int24", + "unsupported": true + }, + { + "id": "0x0400", + "name": "instantaneous_demand", + "zcl_type": "int24", + "unsupported": true + }, + { + "id": "0x0306", + "name": "metering_device_type", + "zcl_type": "map8", + "value": 0 + }, + { + "id": "0x0301", + "name": "multiplier", + "zcl_type": "uint24", + "value": 1 + }, + { + "id": "0x0018", + "name": "outlet_temperature", + "zcl_type": "int24", + "unsupported": true + }, + { + "id": "0x0200", + "name": "status", + "zcl_type": "map8", + "value": 0 + }, + { + "id": "0x0303", + "name": "summation_formatting", + "zcl_type": "map8", + "value": 35 + }, + { + "id": "0x030d", + "name": "temperature_formatting", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x030c", + "name": "temperature_unit_of_measure", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0300", + "name": "unit_of_measure", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x0803", + "name": "water_specific_alarm_mask", + "zcl_type": "map16", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0b04", + "endpoint_attribute": "electrical_measurement", + "attributes": [ + { + "id": "0x0603", + "name": "ac_current_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0602", + "name": "ac_current_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0300", + "name": "ac_frequency", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0401", + "name": "ac_frequency_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0302", + "name": "ac_frequency_max", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0400", + "name": "ac_frequency_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0605", + "name": "ac_power_divisor", + "zcl_type": "uint16", + "value": 10 + }, + { + "id": "0x0604", + "name": "ac_power_multiplier", + "zcl_type": "uint16", + "value": 1 + }, + { + "id": "0x0601", + "name": "ac_voltage_divisor", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0600", + "name": "ac_voltage_multiplier", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x050b", + "name": "active_power", + "zcl_type": "int16", + "value": 0 + }, + { + "id": "0x050d", + "name": "active_power_max", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x090d", + "name": "active_power_max_ph_b", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0a0d", + "name": "active_power_max_ph_c", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x090b", + "name": "active_power_ph_b", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0a0b", + "name": "active_power_ph_c", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x050f", + "name": "apparent_power", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0000", + "name": "measurement_type", + "zcl_type": "map32", + "value": 8 + }, + { + "id": "0x0403", + "name": "power_divisor", + "zcl_type": "uint32", + "value": 1 + }, + { + "id": "0x0510", + "name": "power_factor", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0910", + "name": "power_factor_ph_b", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0a10", + "name": "power_factor_ph_c", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0402", + "name": "power_multiplier", + "zcl_type": "uint32", + "value": 1 + }, + { + "id": "0x0508", + "name": "rms_current", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x050a", + "name": "rms_current_max", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x090a", + "name": "rms_current_max_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a0a", + "name": "rms_current_max_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0908", + "name": "rms_current_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a08", + "name": "rms_current_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0505", + "name": "rms_voltage", + "zcl_type": "uint16", + "value": 229 + }, + { + "id": "0x0507", + "name": "rms_voltage_max", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0907", + "name": "rms_voltage_max_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a07", + "name": "rms_voltage_max_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0905", + "name": "rms_voltage_ph_b", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0a05", + "name": "rms_voltage_ph_c", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0304", + "name": "total_active_power", + "zcl_type": "int32", + "value": 42380 + } + ] + }, + { + "cluster_id": "0xfcc0", + "endpoint_attribute": "opple_cluster", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "unsupported": true + } + ] + } + ] + }, + "21": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_SWITCH", + "id": 0 + }, + "in_clusters": [ + { + "cluster_id": "0x000c", + "endpoint_attribute": "analog_input", + "attributes": [ + { + "id": "0x0055", + "name": "present_value", + "zcl_type": "single", + "value": 0.0 + } + ] + } + ], + "out_clusters": [] + }, + "31": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_SWITCH", + "id": 0 + }, + "in_clusters": [ + { + "cluster_id": "0x000c", + "endpoint_attribute": "analog_input", + "attributes": [] + } + ], + "out_clusters": [] + }, + "41": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_SWITCH", + "id": 0 + }, + "in_clusters": [ + { + "cluster_id": "0x0012", + "endpoint_attribute": "multistate_input", + "attributes": [] + } + ], + "out_clusters": [] + }, + "242": { + "profile_id": 41440, + "device_type": { + "name": "PROXY_BASIC", + "id": 97 + }, + "in_clusters": [], + "out_clusters": [ + { + "cluster_id": "0x0021", + "endpoint_attribute": "green_power", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "LUMI", + "model": "lumi.switch.n0agl1", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4447, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0100", + "input_clusters": [ + "0x0000", + "0x0002", + "0x0003", + "0x0004", + "0x0005", + "0x0006", + "0x0009", + "0x000a", + "0x0702", + "0x0b04", + "0xfcc0" + ], + "output_clusters": [ + "0x0019" + ] + }, + "21": { + "profile_id": "0x0104", + "device_type": "0x0100", + "input_clusters": [ + "0x000c" + ], + "output_clusters": [] + }, + "31": { + "profile_id": "0x0104", + "device_type": "0x0100", + "input_clusters": [ + "0x000c" + ], + "output_clusters": [] + }, + "41": { + "profile_id": "0x0104", + "device_type": "0x0100", + "input_clusters": [ + "0x0012" + ], + "output_clusters": [] + }, + "242": { + "profile_id": "0xa1e0", + "device_type": "0x0061", + "input_clusters": [], + "output_clusters": [ + "0x0021" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e9:c7:8a:67-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e9:c7:8a:67", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e9:c7:8a:67-1-6-StartUpOnOff", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "StartupOnOffSelectEntity", + "translation_key": "start_up_on_off", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e9:c7:8a:67", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "StartUpOnOff", + "options": [ + "Off", + "On", + "Toggle", + "PreviousValue" + ] + }, + "state": { + "class_name": "StartupOnOffSelectEntity", + "available": true, + "state": "PreviousValue" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e9:c7:8a:67-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e9:c7:8a:67", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 255 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e9:c7:8a:67-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e9:c7:8a:67", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -64 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e9:c7:8a:67-1-1794-summation_delivered", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "SmartEnergySummation", + "translation_key": "summation_delivered", + "translation_placeholders": null, + "device_class": "energy", + "state_class": "total_increasing", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e9:c7:8a:67", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 3, + "unit": "kWh" + }, + "state": { + "class_name": "SmartEnergySummation", + "available": true, + "state": 41.15, + "device_type": "Electric Metering", + "status": "NO_ALARMS", + "zcl_unit_of_measurement": 0 + }, + "extra_state_attributes": [ + "device_type", + "status", + "zcl_unit_of_measurement" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e9:c7:8a:67-1-2", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "DeviceTemperature", + "translation_key": "device_temperature", + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e9:c7:8a:67", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "DeviceTemperature", + "available": true, + "state": 0.18 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e9:c7:8a:67-1-2820", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ElectricalMeasurementActivePower", + "translation_key": null, + "translation_placeholders": null, + "device_class": "power", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e9:c7:8a:67", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 1, + "unit": "W" + }, + "state": { + "class_name": "ElectricalMeasurementActivePower", + "available": true, + "state": 0.0, + "measurement_type": "PHASE_A_MEASUREMENT" + }, + "extra_state_attributes": [ + "active_power_max", + "measurement_type" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e9:c7:8a:67-1-2820-rms_voltage", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ElectricalMeasurementRMSVoltage", + "translation_key": null, + "translation_placeholders": null, + "device_class": "voltage", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e9:c7:8a:67", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 1, + "unit": "V" + }, + "state": { + "class_name": "ElectricalMeasurementRMSVoltage", + "available": true, + "state": 229.0, + "measurement_type": "PHASE_A_MEASUREMENT" + }, + "extra_state_attributes": [ + "measurement_type", + "rms_voltage_max" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e9:c7:8a:67-1-2820-total_active_power", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ElectricalMeasurementTotalActivePower", + "translation_key": "total_active_power", + "translation_placeholders": null, + "device_class": "power", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e9:c7:8a:67", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 1, + "unit": "W" + }, + "state": { + "class_name": "ElectricalMeasurementTotalActivePower", + "available": true, + "state": 4238.0, + "measurement_type": "PHASE_A_MEASUREMENT" + }, + "extra_state_attributes": [ + "active_power_max", + "measurement_type" + ] + } + ], + "switch": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e9:c7:8a:67-1-6", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "Switch", + "translation_key": "switch", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:e9:c7:8a:67", + "endpoint_id": 1, + "available": true, + "group_id": null + }, + "state": { + "class_name": "Switch", + "state": 0, + "available": true + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e9:c7:8a:67-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e9:c7:8a:67", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": null, + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/philips-rwl020-0x420045b6.json b/tests/data/devices/philips-rwl020-0x420045b6.json new file mode 100644 index 000000000..82ce3d3c1 --- /dev/null +++ b/tests/data/devices/philips-rwl020-0x420045b6.json @@ -0,0 +1,432 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:5f:d6:d5:c6", + "nwk": "0xFB08", + "manufacturer": "Philips", + "model": "RWL020", + "friendly_manufacturer": "Philips", + "friendly_model": "RWL020", + "name": "Philips RWL020", + "quirk_applied": true, + "quirk_class": "zhaquirks.philips.rwlfirstgen.PhilipsRWLFirstGen", + "exposes_features": [], + "manufacturer_code": 4107, + "power_source": "Battery or Unknown", + "lqi": 148, + "rssi": -74, + "last_seen": "2026-02-05T20:50:53.872613+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 71, + "maximum_incoming_transfer_size": 45, + "server_mask": 0, + "maximum_outgoing_transfer_size": 45, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 49246, + "device_type": { + "name": "SCENE_CONTROLLER", + "id": 2096 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "Philips" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "RWL020" + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [] + } + ] + }, + "2": { + "profile_id": 260, + "device_type": { + "name": "SIMPLE_SENSOR", + "id": 12 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0031", + "name": "philips", + "zcl_type": "map16", + "value": 11 + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 89 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 25 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x000f", + "endpoint_attribute": "binary_input", + "attributes": [ + { + "id": "0x001c", + "name": "description", + "zcl_type": "string", + "unsupported": true + }, + { + "id": "0x0055", + "name": "present_value", + "zcl_type": "bool", + "unsupported": true + } + ] + }, + { + "cluster_id": "0xfc00", + "endpoint_attribute": "philips_remote_cluster", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 1107314102 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "Philips", + "model": "RWL020", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 71, + "maximum_incoming_transfer_size": 45, + "server_mask": 0, + "maximum_outgoing_transfer_size": 45, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0xc05e", + "device_type": "0x0830", + "input_clusters": [ + "0x0000" + ], + "output_clusters": [ + "0x0000", + "0x0003", + "0x0004", + "0x0006", + "0x0008", + "0x0005" + ] + }, + "2": { + "profile_id": "0x0104", + "device_type": "0x000c", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x000f", + "0xfc00" + ], + "output_clusters": [ + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:5f:d6:d5:c6-2-15", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "BinaryInput", + "translation_key": "binary_input", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:5f:d6:d5:c6", + "endpoint_id": 2, + "available": true, + "group_id": null, + "attribute_name": "present_value" + }, + "state": { + "class_name": "BinaryInput", + "available": true, + "state": false + } + } + ], + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:5f:d6:d5:c6-2-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:5f:d6:d5:c6", + "endpoint_id": 2, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:5f:d6:d5:c6-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:5f:d6:d5:c6", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 148 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:5f:d6:d5:c6-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:5f:d6:d5:c6", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -74 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:5f:d6:d5:c6-2-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:5f:d6:d5:c6", + "endpoint_id": 2, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 44.5, + "battery_voltage": 2.5 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:5f:d6:d5:c6-2-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:5f:d6:d5:c6", + "endpoint_id": 2, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x420045b6", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/philips-sml001-0x43007305.json b/tests/data/devices/philips-sml001-0x43007305.json new file mode 100644 index 000000000..fa39c26ba --- /dev/null +++ b/tests/data/devices/philips-sml001-0x43007305.json @@ -0,0 +1,615 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:1f:7f:df:14", + "nwk": "0x8B0B", + "manufacturer": "Philips", + "model": "SML001", + "friendly_manufacturer": "Philips", + "friendly_model": "SML001", + "name": "Philips SML001", + "quirk_applied": true, + "quirk_class": "zhaquirks.philips.motion.PhilipsMotion", + "exposes_features": [], + "manufacturer_code": 4107, + "power_source": "Battery or Unknown", + "lqi": null, + "rssi": null, + "last_seen": "2026-02-13T08:47:48.420219+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 89, + "maximum_incoming_transfer_size": 63, + "server_mask": 0, + "maximum_outgoing_transfer_size": 63, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 49246, + "device_type": { + "name": "ON_OFF_SENSOR", + "id": 2128 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [] + }, + { + "cluster_id": "0x0300", + "endpoint_attribute": "light_color", + "attributes": [] + } + ] + }, + "2": { + "profile_id": 260, + "device_type": { + "name": "OCCUPANCY_SENSOR", + "id": 263 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "Philips" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "SML001" + }, + { + "id": "0x0033", + "name": "trigger_indicator", + "zcl_type": "bool", + "value": 1 + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 29 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0400", + "endpoint_attribute": "illuminance", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "uint16", + "value": 10992 + } + ] + }, + { + "cluster_id": "0x0402", + "endpoint_attribute": "temperature", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "int16", + "value": 2475 + } + ] + }, + { + "cluster_id": "0x0406", + "endpoint_attribute": "occupancy", + "attributes": [ + { + "id": "0x0000", + "name": "occupancy", + "zcl_type": "map8", + "value": 1 + }, + { + "id": "0x0030", + "name": "sensitivity", + "zcl_type": "uint8", + "value": 0 + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 1124102917 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "Philips", + "model": "SML001", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 89, + "maximum_incoming_transfer_size": 63, + "server_mask": 0, + "maximum_outgoing_transfer_size": 63, + "descriptor_capability_field": 0 + }, + "endpoints": { + "2": { + "profile_id": "0x0104", + "device_type": "0x0107", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0406", + "0x0400", + "0x0402" + ], + "output_clusters": [ + "0x0019" + ] + }, + "1": { + "profile_id": "0xc05e", + "device_type": "0x0850", + "input_clusters": [ + "0x0000" + ], + "output_clusters": [ + "0x0000", + "0x0003", + "0x0004", + "0x0006", + "0x0008", + "0x0300", + "0x0005" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-1-6", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "PhilipsMotion", + "translation_key": null, + "translation_placeholders": null, + "device_class": "motion", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "on_off" + }, + "state": { + "class_name": "PhilipsMotion", + "available": true, + "state": false + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-1030", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "Occupancy", + "translation_key": null, + "translation_placeholders": null, + "device_class": "occupancy", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "attribute_name": "occupancy" + }, + "state": { + "class_name": "Occupancy", + "available": true, + "state": true + } + } + ], + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-1030-motion_sensitivity", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "HueV1MotionSensitivity", + "translation_key": "motion_sensitivity", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "enum": "HueV1MotionSensitivities", + "options": [ + "Low", + "Medium", + "High" + ] + }, + "state": { + "class_name": "HueV1MotionSensitivity", + "available": true, + "state": "Low" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_voltage": 2.9 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-1024", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Illuminance", + "translation_key": null, + "translation_placeholders": null, + "device_class": "illuminance", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "lx" + }, + "state": { + "class_name": "Illuminance", + "available": true, + "state": 13 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-1026", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Temperature", + "translation_key": null, + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "Temperature", + "available": true, + "state": 24.75 + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-0-trigger_indicator", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "HueMotionTriggerIndicatorSwitch", + "translation_key": "trigger_indicator", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "attribute_name": "trigger_indicator", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "HueMotionTriggerIndicatorSwitch", + "available": true, + "state": true, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x43007305", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/philips-sml001-0x43007401.json b/tests/data/devices/philips-sml001-0x43007401.json new file mode 100644 index 000000000..b945399ee --- /dev/null +++ b/tests/data/devices/philips-sml001-0x43007401.json @@ -0,0 +1,615 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:1f:7f:df:14", + "nwk": "0xE1BB", + "manufacturer": "Philips", + "model": "SML001", + "friendly_manufacturer": "Philips", + "friendly_model": "SML001", + "name": "Philips SML001", + "quirk_applied": true, + "quirk_class": "zhaquirks.philips.motion.PhilipsMotion", + "exposes_features": [], + "manufacturer_code": 4107, + "power_source": "Battery or Unknown", + "lqi": 120, + "rssi": -70, + "last_seen": "2026-03-06T04:00:32.519336+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 89, + "maximum_incoming_transfer_size": 63, + "server_mask": 0, + "maximum_outgoing_transfer_size": 63, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 49246, + "device_type": { + "name": "ON_OFF_SENSOR", + "id": 2128 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [] + }, + { + "cluster_id": "0x0300", + "endpoint_attribute": "light_color", + "attributes": [] + } + ] + }, + "2": { + "profile_id": 260, + "device_type": { + "name": "OCCUPANCY_SENSOR", + "id": 263 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "Philips" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "SML001" + }, + { + "id": "0x0033", + "name": "trigger_indicator", + "zcl_type": "bool", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 30 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0400", + "endpoint_attribute": "illuminance", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "uint16", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0402", + "endpoint_attribute": "temperature", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "int16", + "value": 2198 + } + ] + }, + { + "cluster_id": "0x0406", + "endpoint_attribute": "occupancy", + "attributes": [ + { + "id": "0x0000", + "name": "occupancy", + "zcl_type": "map8", + "value": 0 + }, + { + "id": "0x0030", + "name": "sensitivity", + "zcl_type": "uint8", + "value": 2 + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 1124103169 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "Philips", + "model": "SML001", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 89, + "maximum_incoming_transfer_size": 63, + "server_mask": 0, + "maximum_outgoing_transfer_size": 63, + "descriptor_capability_field": 0 + }, + "endpoints": { + "2": { + "profile_id": "0x0104", + "device_type": "0x0107", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0406", + "0x0400", + "0x0402" + ], + "output_clusters": [ + "0x0019" + ] + }, + "1": { + "profile_id": "0xc05e", + "device_type": "0x0850", + "input_clusters": [ + "0x0000" + ], + "output_clusters": [ + "0x0000", + "0x0003", + "0x0004", + "0x0006", + "0x0008", + "0x0300", + "0x0005" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-1-6", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "PhilipsMotion", + "translation_key": null, + "translation_placeholders": null, + "device_class": "motion", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "on_off" + }, + "state": { + "class_name": "PhilipsMotion", + "available": true, + "state": false + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-1030", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "Occupancy", + "translation_key": null, + "translation_placeholders": null, + "device_class": "occupancy", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "attribute_name": "occupancy" + }, + "state": { + "class_name": "Occupancy", + "available": true, + "state": false + } + } + ], + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-1030-motion_sensitivity", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "HueV1MotionSensitivity", + "translation_key": "motion_sensitivity", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "enum": "HueV1MotionSensitivities", + "options": [ + "Low", + "Medium", + "High" + ] + }, + "state": { + "class_name": "HueV1MotionSensitivity", + "available": true, + "state": "High" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 120 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -70 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_voltage": 3.0 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-1024", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Illuminance", + "translation_key": null, + "translation_placeholders": null, + "device_class": "illuminance", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "lx" + }, + "state": { + "class_name": "Illuminance", + "available": true, + "state": 0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-1026", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Temperature", + "translation_key": null, + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "Temperature", + "available": true, + "state": 21.98 + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-0-trigger_indicator", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "HueMotionTriggerIndicatorSwitch", + "translation_key": "trigger_indicator", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "attribute_name": "trigger_indicator", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "HueMotionTriggerIndicatorSwitch", + "available": true, + "state": false, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1f:7f:df:14-2-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1f:7f:df:14", + "endpoint_id": 2, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x43007401", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/signify-netherlands-b-v-rdm002-0x02003b13.json b/tests/data/devices/signify-netherlands-b-v-rdm002-0x02003b13.json new file mode 100644 index 000000000..eb99c6359 --- /dev/null +++ b/tests/data/devices/signify-netherlands-b-v-rdm002-0x02003b13.json @@ -0,0 +1,370 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:05:d9:30:d2", + "nwk": "0xC0C5", + "manufacturer": "Signify Netherlands B.V.", + "model": "RDM002", + "friendly_manufacturer": "Signify Netherlands B.V.", + "friendly_model": "RDM002", + "name": "Signify Netherlands B.V. RDM002", + "quirk_applied": true, + "quirk_class": "zhaquirks.philips.rdm002.PhilipsRDM002", + "exposes_features": [], + "manufacturer_code": 4107, + "power_source": "Battery or Unknown", + "lqi": 141, + "rssi": null, + "last_seen": "2026-02-08T23:34:48.150482+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 128, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 128, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "NON_COLOR_CONTROLLER", + "id": 2080 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "Signify Netherlands B.V." + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "RDM002" + }, + { + "id": "0x0031", + "name": "philips", + "zcl_type": "map16", + "value": 11 + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 28 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x1000", + "endpoint_attribute": "lightlink", + "attributes": [] + }, + { + "cluster_id": "0xfc00", + "endpoint_attribute": "philips_remote_cluster", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 33569555 + } + ] + }, + { + "cluster_id": "0x1000", + "endpoint_attribute": "lightlink", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "Signify Netherlands B.V.", + "model": "RDM002", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 128, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 128, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0830", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0xfc00", + "0x1000" + ], + "output_clusters": [ + "0x0019", + "0x0000", + "0x0003", + "0x0004", + "0x0006", + "0x0008", + "0x0005", + "0x1000" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:05:d9:30:d2-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:05:d9:30:d2", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:05:d9:30:d2-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:05:d9:30:d2", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 141 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:05:d9:30:d2-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:05:d9:30:d2", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:05:d9:30:d2-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:05:d9:30:d2", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_voltage": 2.8 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:05:d9:30:d2-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:05:d9:30:d2", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x02003b13", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/signify-netherlands-b-v-rdm004-0x02004d23.json b/tests/data/devices/signify-netherlands-b-v-rdm004-0x02004d23.json new file mode 100644 index 000000000..348089a88 --- /dev/null +++ b/tests/data/devices/signify-netherlands-b-v-rdm004-0x02004d23.json @@ -0,0 +1,365 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:84:06:58:23", + "nwk": "0xEB94", + "manufacturer": "Signify Netherlands B.V.", + "model": "RDM004", + "friendly_manufacturer": "Signify Netherlands B.V.", + "friendly_model": "RDM004", + "name": "Signify Netherlands B.V. RDM004", + "quirk_applied": true, + "quirk_class": "zhaquirks.philips.wall_switch.PhilipsWallSwitchNewFirmware", + "exposes_features": [], + "manufacturer_code": 4107, + "power_source": "Battery or Unknown", + "lqi": 124, + "rssi": -69, + "last_seen": "2026-06-09T08:29:09.769972+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 128, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 128, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "NON_COLOR_SCENE_CONTROLLER", + "id": 2096 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "Signify Netherlands B.V." + }, + { + "id": "0x0034", + "name": "mode", + "zcl_type": "enum8", + "value": 3 + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "RDM004" + }, + { + "id": "0x0031", + "name": "philips", + "zcl_type": "map16", + "value": 11 + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 255 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0xfc00", + "endpoint_attribute": "philips_remote_cluster", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 1 + } + ] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 33574179 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "Signify Netherlands B.V.", + "model": "RDM004", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 128, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 128, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0830", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0xfc00" + ], + "output_clusters": [ + "0x0019", + "0x0000", + "0x0003", + "0x0004", + "0x0006", + "0x0008" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:84:06:58:23-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:84:06:58:23", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:84:06:58:23-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:84:06:58:23", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 124 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:84:06:58:23-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:84:06:58:23", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -69 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:84:06:58:23-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:84:06:58:23", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_voltage": 25.5 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:84:06:58:23-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:84:06:58:23", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x02004d23", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/signify-netherlands-b-v-rwl022-0x02004d27.json b/tests/data/devices/signify-netherlands-b-v-rwl022-0x02004d27.json new file mode 100644 index 000000000..62424d918 --- /dev/null +++ b/tests/data/devices/signify-netherlands-b-v-rwl022-0x02004d27.json @@ -0,0 +1,365 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:e5:92:c2:0e", + "nwk": "0x4C2D", + "manufacturer": "Signify Netherlands B.V.", + "model": "RWL022", + "friendly_manufacturer": "Signify Netherlands B.V.", + "friendly_model": "RWL022", + "name": "Signify Netherlands B.V. RWL022", + "quirk_applied": true, + "quirk_class": "zhaquirks.philips.rwl022.PhilipsRWL022", + "exposes_features": [], + "manufacturer_code": 4107, + "power_source": "Battery or Unknown", + "lqi": 184, + "rssi": -54, + "last_seen": "2026-02-11T17:11:49.715112+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 128, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 128, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "NON_COLOR_SCENE_CONTROLLER", + "id": 2096 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0031", + "name": "philips", + "zcl_type": "map16", + "value": 11 + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 30 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x1000", + "endpoint_attribute": "lightlink", + "attributes": [] + }, + { + "cluster_id": "0xfc00", + "endpoint_attribute": "philips_remote_cluster", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 1 + } + ] + }, + { + "cluster_id": "0x0008", + "endpoint_attribute": "level", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 33574183 + } + ] + }, + { + "cluster_id": "0x1000", + "endpoint_attribute": "lightlink", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "Signify Netherlands B.V.", + "model": "RWL022", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4107, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 128, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 128, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0830", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0xfc00", + "0x1000" + ], + "output_clusters": [ + "0x0019", + "0x0000", + "0x0003", + "0x0004", + "0x0006", + "0x0008", + "0x0005", + "0x1000" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e5:92:c2:0e-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e5:92:c2:0e", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e5:92:c2:0e-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e5:92:c2:0e", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 184 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e5:92:c2:0e-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e5:92:c2:0e", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -54 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e5:92:c2:0e-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e5:92:c2:0e", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_voltage": 3.0 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:e5:92:c2:0e-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:e5:92:c2:0e", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x02004d27", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/sonoff-swv-0x00001003.json b/tests/data/devices/sonoff-swv-0x00001003.json new file mode 100644 index 000000000..1478923b0 --- /dev/null +++ b/tests/data/devices/sonoff-swv-0x00001003.json @@ -0,0 +1,498 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:8c:25:a4:7c", + "nwk": "0x179C", + "manufacturer": "SONOFF", + "model": "SWV", + "friendly_manufacturer": "SONOFF", + "friendly_model": "SWV", + "name": "SONOFF SWV", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4742, + "power_source": "Battery or Unknown", + "lqi": 144, + "rssi": null, + "last_seen": "2025-07-06T18:23:04.817176+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4742, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 255, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 255, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_OUTPUT", + "id": 2 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "SONOFF" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "SWV" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 62 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [] + }, + { + "cluster_id": "0x0020", + "endpoint_attribute": "poll_control", + "attributes": [ + { + "id": "0x0000", + "name": "checkin_interval", + "zcl_type": "uint32", + "value": 13200 + } + ] + }, + { + "cluster_id": "0x0404", + "endpoint_attribute": "flow", + "attributes": [] + }, + { + "cluster_id": "0x0b05", + "endpoint_attribute": "diagnostic", + "attributes": [] + }, + { + "cluster_id": "0xfc11", + "endpoint_attribute": null, + "attributes": [ + { + "id": "0x500c", + "name": "water_valve_state", + "zcl_type": "enum8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0xfc57", + "endpoint_attribute": "works_with_all_hubs", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 4099 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "SONOFF", + "model": "SWV", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4742, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 255, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 255, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0002", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0006", + "0x0020", + "0x0404", + "0x0b05", + "0xfc11", + "0xfc57" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": "Water leak", + "unique_id": "ab:cd:ef:12:8c:25:a4:7c-1-water_leak_status", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "BinarySensor", + "translation_key": "water_leak", + "translation_placeholders": null, + "device_class": "moisture", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:25:a4:7c", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "water_valve_state" + }, + "state": { + "class_name": "BinarySensor", + "available": true, + "state": false + } + }, + { + "info_object": { + "fallback_name": "Water supply", + "unique_id": "ab:cd:ef:12:8c:25:a4:7c-1-water_supply_status", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "BinarySensor", + "translation_key": "water_supply", + "translation_placeholders": null, + "device_class": "problem", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:25:a4:7c", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "water_valve_state" + }, + "state": { + "class_name": "BinarySensor", + "available": true, + "state": false + } + } + ], + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:25:a4:7c-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:25:a4:7c", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:25:a4:7c-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:25:a4:7c", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 144 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:25:a4:7c-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:25:a4:7c", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:25:a4:7c-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:25:a4:7c", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_voltage": 6.2 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:25:a4:7c-1-1028", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Flow", + "translation_key": null, + "translation_placeholders": null, + "device_class": "volume_flow_rate", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:25:a4:7c", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "m\u00b3/h" + }, + "state": { + "class_name": "Flow", + "available": true, + "state": null + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:25:a4:7c-1-6", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "Switch", + "translation_key": "switch", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:8c:25:a4:7c", + "endpoint_id": 1, + "available": true, + "group_id": null + }, + "state": { + "class_name": "Switch", + "state": false, + "available": true + } + }, + { + "info_object": { + "fallback_name": "Water shortage auto-close", + "unique_id": "ab:cd:ef:12:8c:25:a4:7c-1-auto_close_water_shortage", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "water_shortage_auto_close", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:25:a4:7c", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "auto_close_water_shortage", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 30 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:8c:25:a4:7c-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:8c:25:a4:7c", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00001003", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/sonoff-trvzb-0x00001400.json b/tests/data/devices/sonoff-trvzb-0x00001400.json new file mode 100644 index 000000000..6915b6aab --- /dev/null +++ b/tests/data/devices/sonoff-trvzb-0x00001400.json @@ -0,0 +1,1224 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:4d:04:9a:8f", + "nwk": "0xE362", + "manufacturer": "SONOFF", + "model": "TRVZB", + "friendly_manufacturer": "SONOFF", + "friendly_model": "TRVZB", + "name": "SONOFF TRVZB", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4742, + "power_source": "Battery or Unknown", + "lqi": 60, + "rssi": null, + "last_seen": "2025-11-22T10:27:47.582709+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4742, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 255, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 255, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "THERMOSTAT", + "id": 769 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "SONOFF" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TRVZB" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 174 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0020", + "endpoint_attribute": "poll_control", + "attributes": [ + { + "id": "0x0000", + "name": "checkin_interval", + "zcl_type": "uint32", + "value": 13200 + }, + { + "id": "0x0003", + "name": "fast_poll_timeout", + "zcl_type": "uint16", + "value": 120 + } + ] + }, + { + "cluster_id": "0x0201", + "endpoint_attribute": "thermostat", + "attributes": [ + { + "id": "0x0006", + "name": "abs_max_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0004", + "name": "abs_max_heat_setpoint_limit", + "zcl_type": "int16", + "value": 3500 + }, + { + "id": "0x0005", + "name": "abs_min_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0003", + "name": "abs_min_heat_setpoint_limit", + "zcl_type": "int16", + "value": 400 + }, + { + "id": "0x001b", + "name": "ctrl_sequence_of_oper", + "zcl_type": "enum8", + "value": 2 + }, + { + "id": "0x0000", + "name": "local_temperature", + "zcl_type": "int16", + "value": 1800 + }, + { + "id": "0x0010", + "name": "local_temperature_calibration", + "zcl_type": "int8", + "value": 0 + }, + { + "id": "0x0018", + "name": "max_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0016", + "name": "max_heat_setpoint_limit", + "zcl_type": "int16", + "value": 3500 + }, + { + "id": "0x0017", + "name": "min_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0015", + "name": "min_heat_setpoint_limit", + "zcl_type": "int16", + "value": 400 + }, + { + "id": "0x0002", + "name": "occupancy", + "zcl_type": "map8", + "value": 1 + }, + { + "id": "0x0011", + "name": "occupied_cooling_setpoint", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0012", + "name": "occupied_heating_setpoint", + "zcl_type": "int16", + "value": 2300 + }, + { + "id": "0x0007", + "name": "pi_cooling_demand", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0008", + "name": "pi_heating_demand", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x001e", + "name": "running_mode", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x0029", + "name": "running_state", + "zcl_type": "map16", + "value": 0 + }, + { + "id": "0x0030", + "name": "setpoint_change_source", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x001c", + "name": "system_mode", + "zcl_type": "enum8", + "value": 4 + }, + { + "id": "0x0013", + "name": "unoccupied_cooling_setpoint", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0014", + "name": "unoccupied_heating_setpoint", + "zcl_type": "int16", + "unsupported": true + } + ] + }, + { + "cluster_id": "0xfc11", + "endpoint_attribute": null, + "attributes": [ + { + "id": "0x0000", + "name": "child_lock", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x6004", + "name": "closing_steps", + "zcl_type": "uint16", + "value": 503 + }, + { + "id": "0x600e", + "name": "external_temperature_sensor_enable", + "zcl_type": "uint8", + "value": 0 + }, + { + "id": "0x600d", + "name": "external_temperature_sensor_value", + "zcl_type": "int16", + "value": 1990 + }, + { + "id": "0x6002", + "name": "frost_protection_temperature", + "zcl_type": "int16", + "value": 700 + }, + { + "id": "0x6003", + "name": "idle_steps", + "zcl_type": "uint16", + "value": 264 + }, + { + "id": "0x6000", + "name": "open_window", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x6011", + "name": "temperature_control_accuracy", + "zcl_type": "int16", + "value": -100 + }, + { + "id": "0x600c", + "name": "valve_closing_degree", + "zcl_type": "uint8", + "value": 100 + }, + { + "id": "0x6006", + "name": "valve_closing_limit_voltage", + "zcl_type": "uint16", + "value": 3107 + }, + { + "id": "0x6007", + "name": "valve_motor_running_voltage", + "zcl_type": "uint16", + "value": 1501 + }, + { + "id": "0x600b", + "name": "valve_opening_degree", + "zcl_type": "uint8", + "value": 100 + }, + { + "id": "0x6005", + "name": "valve_opening_limit_voltage", + "zcl_type": "uint16", + "value": 1718 + } + ] + }, + { + "cluster_id": "0xfc57", + "endpoint_attribute": "works_with_all_hubs", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 5120 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "SONOFF", + "model": "TRVZB", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4742, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 255, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 255, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0301", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0006", + "0x0020", + "0x0201", + "0xfc11", + "0xfc57" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + }, + { + "info_object": { + "fallback_name": "Boost mode", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-boost_mode", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "WriteAttributeButton", + "translation_key": "boost_mode", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "temporary_mode", + "attribute_value": 0 + }, + "state": { + "class_name": "WriteAttributeButton", + "available": true + } + }, + { + "info_object": { + "fallback_name": "Timer mode", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-timer_mode", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "WriteAttributeButton", + "translation_key": "timer_mode", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "temporary_mode", + "attribute_value": 1 + }, + "state": { + "class_name": "WriteAttributeButton", + "available": true + } + } + ], + "climate": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1", + "migrate_unique_ids": [], + "platform": "climate", + "class_name": "Thermostat", + "translation_key": "thermostat", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "max_temp": 35.0, + "min_temp": 4.0, + "supported_features": 385, + "fan_modes": null, + "preset_modes": [], + "hvac_modes": [ + "off", + "heat" + ] + }, + "state": { + "class_name": "Thermostat", + "available": true, + "current_temperature": 18.0, + "outdoor_temperature": null, + "target_temperature": 23.0, + "target_temperature_high": null, + "target_temperature_low": null, + "hvac_action": "idle", + "hvac_mode": "heat", + "preset_mode": "none", + "fan_mode": "auto", + "system_mode": "[4]/heat", + "occupancy": 1, + "occupied_cooling_setpoint": null, + "occupied_heating_setpoint": 2300, + "pi_heating_demand": null, + "pi_cooling_demand": null, + "unoccupied_cooling_setpoint": null, + "unoccupied_heating_setpoint": null + }, + "extra_state_attributes": [ + "occupancy", + "occupied_cooling_setpoint", + "occupied_heating_setpoint", + "pi_cooling_demand", + "pi_heating_demand", + "system_mode", + "unoccupied_cooling_setpoint", + "unoccupied_heating_setpoint" + ] + } + ], + "number": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-513-local_temperature_calibration", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "SonoffThermostatLocalTempCalibration", + "translation_key": "local_temperature_calibration", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "box", + "native_max_value": 12.7, + "native_min_value": -12.8, + "native_step": 0.1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "SonoffThermostatLocalTempCalibration", + "available": true, + "state": 0.0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-513-max_heat_setpoint_limit", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "MaxHeatSetpointLimit", + "translation_key": "max_heat_setpoint_limit", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "box", + "native_max_value": 35.0, + "native_min_value": 4.0, + "native_step": 0.5, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "MaxHeatSetpointLimit", + "available": true, + "state": 35.0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-513-min_heat_setpoint_limit", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "MinHeatSetpointLimit", + "translation_key": "min_heat_setpoint_limit", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "box", + "native_max_value": 35.0, + "native_min_value": 4.0, + "native_step": 0.5, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "MinHeatSetpointLimit", + "available": true, + "state": 4.0 + } + }, + { + "info_object": { + "fallback_name": "External temperature sensor value", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-external_temperature_sensor_value", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "external_temperature_sensor_value", + "translation_placeholders": null, + "device_class": "temperature", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 99.9, + "native_min_value": 0.0, + "native_step": 0.1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 19.900000000000002 + } + }, + { + "info_object": { + "fallback_name": "Frost protection temperature", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-frost_protection_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "frost_protection_temperature", + "translation_placeholders": null, + "device_class": "temperature", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 35.0, + "native_min_value": 4.0, + "native_step": 0.5, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 7.0 + } + }, + { + "info_object": { + "fallback_name": "Temperature control accuracy", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-temperature_control_accuracy", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "temperature_control_accuracy", + "translation_placeholders": null, + "device_class": "temperature_delta", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": -0.2, + "native_min_value": -1.0, + "native_step": 0.2, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": -1.0 + } + }, + { + "info_object": { + "fallback_name": "Temporary mode duration", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-temporary_mode_duration", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "temporary_mode_duration", + "translation_placeholders": null, + "device_class": "duration", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 1440, + "native_min_value": 0, + "native_step": 1, + "native_unit_of_measurement": "min" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": "Timer mode target temperature", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-timer_mode_target_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "timer_mode_target_temperature", + "translation_placeholders": null, + "device_class": "temperature", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 35.0, + "native_min_value": 4.0, + "native_step": 0.5, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": "Valve closing degree", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-valve_closing_degree", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "valve_closing_degree", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 100.0, + "native_min_value": 0.0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 100 + } + }, + { + "info_object": { + "fallback_name": "Valve opening degree", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-valve_opening_degree", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "valve_opening_degree", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 100.0, + "native_min_value": 0.0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 100 + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 60 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 87.0 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-513-hvac_action", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ThermostatHVACAction", + "translation_key": "hvac_action", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "ThermostatHVACAction", + "available": true, + "state": "idle" + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-513-setpoint_change_source_timestamp", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "SetpointChangeSourceTimestamp", + "translation_key": "setpoint_change_source_timestamp", + "translation_placeholders": null, + "device_class": "timestamp", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "SetpointChangeSourceTimestamp", + "available": true, + "state": null + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-6", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "Switch", + "translation_key": "switch", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null + }, + "state": { + "class_name": "Switch", + "state": 0, + "available": true + } + }, + { + "info_object": { + "fallback_name": "Child lock", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-child_lock", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "child_lock", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "child_lock", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + }, + { + "info_object": { + "fallback_name": "External temperature sensor", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-external_temperature_sensor_enable", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "external_temperature_sensor", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "external_temperature_sensor_enable", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + }, + { + "info_object": { + "fallback_name": "Open window", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-open_window", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "open_window", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "open_window", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + }, + { + "info_object": { + "fallback_name": "Adaptive mode", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-smart_temperature_control", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "adaptive_mode", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "smart_temperature_control", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 2 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00001400", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/sonoff-trvzb-0x00001401.json b/tests/data/devices/sonoff-trvzb-0x00001401.json new file mode 100644 index 000000000..6d107fdba --- /dev/null +++ b/tests/data/devices/sonoff-trvzb-0x00001401.json @@ -0,0 +1,1218 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:4d:04:9a:8f", + "nwk": "0x7A92", + "manufacturer": "SONOFF", + "model": "TRVZB", + "friendly_manufacturer": "SONOFF", + "friendly_model": "TRVZB", + "name": "SONOFF TRVZB", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4742, + "power_source": "Battery or Unknown", + "lqi": 108, + "rssi": -73, + "last_seen": "2026-01-14T08:39:51.493829+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4742, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 255, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 255, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "THERMOSTAT", + "id": 769 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "SONOFF" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TRVZB" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 1 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0020", + "endpoint_attribute": "poll_control", + "attributes": [ + { + "id": "0x0003", + "name": "fast_poll_timeout", + "zcl_type": "uint16", + "value": 120 + } + ] + }, + { + "cluster_id": "0x0201", + "endpoint_attribute": "thermostat", + "attributes": [ + { + "id": "0x0006", + "name": "abs_max_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0004", + "name": "abs_max_heat_setpoint_limit", + "zcl_type": "int16", + "value": 3500 + }, + { + "id": "0x0005", + "name": "abs_min_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0003", + "name": "abs_min_heat_setpoint_limit", + "zcl_type": "int16", + "value": 400 + }, + { + "id": "0x001b", + "name": "ctrl_sequence_of_oper", + "zcl_type": "enum8", + "value": 2 + }, + { + "id": "0x0000", + "name": "local_temperature", + "zcl_type": "int16", + "value": 3240 + }, + { + "id": "0x0010", + "name": "local_temperature_calibration", + "zcl_type": "int8", + "value": 126 + }, + { + "id": "0x0018", + "name": "max_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0016", + "name": "max_heat_setpoint_limit", + "zcl_type": "int16", + "value": 3500 + }, + { + "id": "0x0017", + "name": "min_cool_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0015", + "name": "min_heat_setpoint_limit", + "zcl_type": "int16", + "value": 400 + }, + { + "id": "0x0002", + "name": "occupancy", + "zcl_type": "map8", + "value": 1 + }, + { + "id": "0x0011", + "name": "occupied_cooling_setpoint", + "zcl_type": "int16", + "value": 2600 + }, + { + "id": "0x0012", + "name": "occupied_heating_setpoint", + "zcl_type": "int16", + "value": 1550 + }, + { + "id": "0x0007", + "name": "pi_cooling_demand", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0008", + "name": "pi_heating_demand", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x001e", + "name": "running_mode", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x0029", + "name": "running_state", + "zcl_type": "map16", + "value": 0 + }, + { + "id": "0x0030", + "name": "setpoint_change_source", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x001c", + "name": "system_mode", + "zcl_type": "enum8", + "value": 4 + }, + { + "id": "0x0013", + "name": "unoccupied_cooling_setpoint", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0014", + "name": "unoccupied_heating_setpoint", + "zcl_type": "int16", + "unsupported": true + } + ] + }, + { + "cluster_id": "0xfc11", + "endpoint_attribute": null, + "attributes": [ + { + "id": "0x0000", + "name": "child_lock", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x6004", + "name": "closing_steps", + "zcl_type": "uint16", + "value": 317 + }, + { + "id": "0x600e", + "name": "external_temperature_sensor_enable", + "zcl_type": "uint8", + "value": 0 + }, + { + "id": "0x600d", + "name": "external_temperature_sensor_value", + "zcl_type": "int16", + "value": 3470 + }, + { + "id": "0x6002", + "name": "frost_protection_temperature", + "zcl_type": "int16", + "value": 700 + }, + { + "id": "0x6003", + "name": "idle_steps", + "zcl_type": "uint16", + "value": 202 + }, + { + "id": "0x6000", + "name": "open_window", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x6011", + "name": "temperature_control_accuracy", + "zcl_type": "int16", + "value": -100 + }, + { + "id": "0x600c", + "name": "valve_closing_degree", + "zcl_type": "uint8", + "value": 100 + }, + { + "id": "0x6006", + "name": "valve_closing_limit_voltage", + "zcl_type": "uint16", + "value": 2564 + }, + { + "id": "0x6007", + "name": "valve_motor_running_voltage", + "zcl_type": "uint16", + "value": 1403 + }, + { + "id": "0x600b", + "name": "valve_opening_degree", + "zcl_type": "uint8", + "value": 0 + }, + { + "id": "0x6005", + "name": "valve_opening_limit_voltage", + "zcl_type": "uint16", + "value": 1577 + } + ] + }, + { + "cluster_id": "0xfc57", + "endpoint_attribute": "works_with_all_hubs", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 5121 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "SONOFF", + "model": "TRVZB", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4742, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 255, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 255, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0301", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0003", + "0x0006", + "0x0020", + "0x0201", + "0xfc11", + "0xfc57" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + }, + { + "info_object": { + "fallback_name": "Boost mode", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-boost_mode", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "WriteAttributeButton", + "translation_key": "boost_mode", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "temporary_mode", + "attribute_value": 0 + }, + "state": { + "class_name": "WriteAttributeButton", + "available": true + } + }, + { + "info_object": { + "fallback_name": "Timer mode", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-timer_mode", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "WriteAttributeButton", + "translation_key": "timer_mode", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "temporary_mode", + "attribute_value": 1 + }, + "state": { + "class_name": "WriteAttributeButton", + "available": true + } + } + ], + "climate": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1", + "migrate_unique_ids": [], + "platform": "climate", + "class_name": "Thermostat", + "translation_key": "thermostat", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "max_temp": 35.0, + "min_temp": 4.0, + "supported_features": 385, + "fan_modes": null, + "preset_modes": [], + "hvac_modes": [ + "off", + "heat" + ] + }, + "state": { + "class_name": "Thermostat", + "available": true, + "current_temperature": 32.4, + "outdoor_temperature": null, + "target_temperature": 15.5, + "target_temperature_high": null, + "target_temperature_low": null, + "hvac_action": "idle", + "hvac_mode": "heat", + "preset_mode": "none", + "fan_mode": "auto", + "system_mode": "[4]/heat", + "occupancy": 1, + "occupied_cooling_setpoint": 2600, + "occupied_heating_setpoint": 1550, + "pi_heating_demand": null, + "pi_cooling_demand": null, + "unoccupied_cooling_setpoint": null, + "unoccupied_heating_setpoint": null + }, + "extra_state_attributes": [ + "occupancy", + "occupied_cooling_setpoint", + "occupied_heating_setpoint", + "pi_cooling_demand", + "pi_heating_demand", + "system_mode", + "unoccupied_cooling_setpoint", + "unoccupied_heating_setpoint" + ] + } + ], + "number": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-513-local_temperature_calibration", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "SonoffThermostatLocalTempCalibration", + "translation_key": "local_temperature_calibration", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "box", + "native_max_value": 12.7, + "native_min_value": -12.8, + "native_step": 0.1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "SonoffThermostatLocalTempCalibration", + "available": true, + "state": 12.600000000000001 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-513-max_heat_setpoint_limit", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "MaxHeatSetpointLimit", + "translation_key": "max_heat_setpoint_limit", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "box", + "native_max_value": 35.0, + "native_min_value": 4.0, + "native_step": 0.5, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "MaxHeatSetpointLimit", + "available": true, + "state": 35.0 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-513-min_heat_setpoint_limit", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "MinHeatSetpointLimit", + "translation_key": "min_heat_setpoint_limit", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "box", + "native_max_value": 35.0, + "native_min_value": 4.0, + "native_step": 0.5, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "MinHeatSetpointLimit", + "available": true, + "state": 4.0 + } + }, + { + "info_object": { + "fallback_name": "External temperature sensor value", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-external_temperature_sensor_value", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "external_temperature_sensor_value", + "translation_placeholders": null, + "device_class": "temperature", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 99.9, + "native_min_value": 0.0, + "native_step": 0.1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 34.7 + } + }, + { + "info_object": { + "fallback_name": "Frost protection temperature", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-frost_protection_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "frost_protection_temperature", + "translation_placeholders": null, + "device_class": "temperature", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 35.0, + "native_min_value": 4.0, + "native_step": 0.5, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 7.0 + } + }, + { + "info_object": { + "fallback_name": "Temperature control accuracy", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-temperature_control_accuracy", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "temperature_control_accuracy", + "translation_placeholders": null, + "device_class": "temperature_delta", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": -0.2, + "native_min_value": -1.0, + "native_step": 0.2, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": -1.0 + } + }, + { + "info_object": { + "fallback_name": "Temporary mode duration", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-temporary_mode_duration", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "temporary_mode_duration", + "translation_placeholders": null, + "device_class": "duration", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 1440, + "native_min_value": 0, + "native_step": 1, + "native_unit_of_measurement": "min" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": "Timer mode target temperature", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-timer_mode_target_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "timer_mode_target_temperature", + "translation_placeholders": null, + "device_class": "temperature", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 35.0, + "native_min_value": 4.0, + "native_step": 0.5, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": "Valve closing degree", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-valve_closing_degree", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "valve_closing_degree", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 100.0, + "native_min_value": 0.0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 100 + } + }, + { + "info_object": { + "fallback_name": "Valve opening degree", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-valve_opening_degree", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "valve_opening_degree", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 100.0, + "native_min_value": 0.0, + "native_step": 1.0, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 0 + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 108 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -73 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-513-hvac_action", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ThermostatHVACAction", + "translation_key": "hvac_action", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "ThermostatHVACAction", + "available": true, + "state": "idle" + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-513-setpoint_change_source_timestamp", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "SetpointChangeSourceTimestamp", + "translation_key": "setpoint_change_source_timestamp", + "translation_placeholders": null, + "device_class": "timestamp", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "SetpointChangeSourceTimestamp", + "available": true, + "state": null + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-6", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "Switch", + "translation_key": "switch", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null + }, + "state": { + "class_name": "Switch", + "state": 1, + "available": true + } + }, + { + "info_object": { + "fallback_name": "Child lock", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-child_lock", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "child_lock", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "child_lock", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + }, + { + "info_object": { + "fallback_name": "External temperature sensor", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-external_temperature_sensor_enable", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "external_temperature_sensor", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "external_temperature_sensor_enable", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + }, + { + "info_object": { + "fallback_name": "Open window", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-open_window", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "open_window", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "open_window", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + }, + { + "info_object": { + "fallback_name": "Adaptive mode", + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-smart_temperature_control", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "adaptive_mode", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "smart_temperature_control", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 2 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:4d:04:9a:8f-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:4d:04:9a:8f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00001401", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/third-reality-inc-3rws18bz-0x00000049.json b/tests/data/devices/third-reality-inc-3rws18bz-0x00000049.json new file mode 100644 index 000000000..8978848fa --- /dev/null +++ b/tests/data/devices/third-reality-inc-3rws18bz-0x00000049.json @@ -0,0 +1,497 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:6a:84:87:99", + "nwk": "0xACF1", + "manufacturer": "Third Reality, Inc", + "model": "3RWS18BZ", + "friendly_manufacturer": "Third Reality, Inc", + "friendly_model": "3RWS18BZ", + "name": "Third Reality, Inc 3RWS18BZ", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4659, + "power_source": "Battery or Unknown", + "lqi": 60, + "rssi": null, + "last_seen": "2026-03-27T02:03:57.714312+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4659, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "IAS_ZONE", + "id": 1026 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0008", + "name": "generic_device_class", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x0010", + "name": "location_desc", + "zcl_type": "string", + "value": "undefined" + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "Third Reality, Inc" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "3RWS18BZ" + }, + { + "id": "0x4000", + "name": "sw_build_id", + "zcl_type": "string", + "value": "v1.00.73" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 156 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 28 + } + ] + }, + { + "cluster_id": "0x0500", + "endpoint_attribute": "ias_zone", + "attributes": [ + { + "id": "0x0010", + "name": "cie_addr", + "zcl_type": "EUI64", + "value": [ + 50, + 79, + 50, + 2, + 0, + 141, + 21, + 0 + ] + }, + { + "id": "0x0000", + "name": "zone_state", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x0002", + "name": "zone_status", + "zcl_type": "map16", + "value": 0 + }, + { + "id": "0x0001", + "name": "zone_type", + "zcl_type": "enum16", + "value": 42 + } + ] + }, + { + "cluster_id": "0xff00", + "endpoint_attribute": "manufacturer_specific", + "attributes": [] + }, + { + "cluster_id": "0xff01", + "endpoint_attribute": null, + "attributes": [ + { + "id": "0x0010", + "name": "enable_siren", + "zcl_type": "uint8", + "value": 1 + }, + { + "id": "0x0011", + "name": "siren_time", + "zcl_type": "uint8", + "value": 0 + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 73 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "Third Reality, Inc", + "model": "3RWS18BZ", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4659, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0402", + "input_clusters": [ + "0x0000", + "0xff01", + "0xff00", + "0x0001", + "0x0500" + ], + "output_clusters": [ + "0x0019", + "0x0006" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6a:84:87:99-1-1280", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "IASZone", + "translation_key": null, + "translation_placeholders": null, + "device_class": "moisture", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:6a:84:87:99", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "zone_status" + }, + "state": { + "class_name": "IASZone", + "available": true, + "state": false + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6a:84:87:99-1-6", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "Opening", + "translation_key": null, + "translation_placeholders": null, + "device_class": "opening", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:84:87:99", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "on_off" + }, + "state": { + "class_name": "Opening", + "available": true, + "state": false + } + } + ], + "number": [ + { + "info_object": { + "fallback_name": "Siren time", + "unique_id": "ab:cd:ef:12:6a:84:87:99-1-siren_time", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "siren_time", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:84:87:99", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 255, + "native_min_value": 0, + "native_step": 1.0, + "native_unit_of_measurement": "min" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 0 + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6a:84:87:99-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:84:87:99", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 60 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6a:84:87:99-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:84:87:99", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6a:84:87:99-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:84:87:99", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 78.0, + "battery_voltage": 2.8 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + } + ], + "switch": [ + { + "info_object": { + "fallback_name": "Enable siren", + "unique_id": "ab:cd:ef:12:6a:84:87:99-1-enable_siren", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "enable_siren", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:84:87:99", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "enable_siren", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": true, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:6a:84:87:99-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:6a:84:87:99", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00000049", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tz3000-09gto2zn-ts0013-0x00000050.json b/tests/data/devices/tz3000-09gto2zn-ts0013-0x00000050.json new file mode 100644 index 000000000..c0e2bba7a --- /dev/null +++ b/tests/data/devices/tz3000-09gto2zn-ts0013-0x00000050.json @@ -0,0 +1,769 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:34:aa:29:f4", + "nwk": "0x28A1", + "manufacturer": "_TZ3000_09gto2zn", + "model": "TS0013", + "friendly_manufacturer": "_TZ3000_09gto2zn", + "friendly_model": "TS0013", + "name": "_TZ3000_09gto2zn TS0013", + "quirk_applied": true, + "quirk_class": "zhaquirks.tuya.ts001x.TuyaTripleNoNeutralSwitch_2", + "exposes_features": [], + "manufacturer_code": 4417, + "power_source": "Battery or Unknown", + "lqi": 188, + "rssi": -53, + "last_seen": "2025-09-06T15:53:42.950149+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_LIGHT", + "id": 256 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0001", + "name": "app_version", + "zcl_type": "uint8", + "value": 80 + }, + { + "id": "0x0006", + "name": "date_code", + "zcl_type": "string", + "value": "" + }, + { + "id": "0x0012", + "name": "device_enabled", + "zcl_type": "bool", + "unsupported": true + }, + { + "id": "0x0014", + "name": "disable_local_config", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0003", + "name": "hw_version", + "zcl_type": "uint8", + "value": 1 + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZ3000_09gto2zn" + }, + { + "id": "0x000c", + "name": "manufacturer_version_details", + "zcl_type": "string", + "unsupported": true + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS0013" + }, + { + "id": "0x0007", + "name": "power_source", + "zcl_type": "enum8", + "value": 3 + }, + { + "id": "0x000e", + "name": "product_label", + "zcl_type": "string", + "unsupported": true + }, + { + "id": "0x000b", + "name": "product_url", + "zcl_type": "string", + "unsupported": true + }, + { + "id": "0xfffe", + "name": "reporting_status", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x0000", + "name": "zcl_version", + "zcl_type": "uint8", + "value": 3 + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [ + { + "id": "0xfffd", + "name": "cluster_revision", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0000", + "name": "identify_time", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0xfffe", + "name": "reporting_status", + "zcl_type": "enum8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [ + { + "id": "0xfffe", + "name": "reporting_status", + "zcl_type": "enum8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [ + { + "id": "0x0000", + "name": "count", + "zcl_type": "uint8", + "value": 0 + }, + { + "id": "0x0005", + "name": "last_configured_by", + "zcl_type": "EUI64", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x8001", + "name": "backlight_mode", + "zcl_type": "enum8", + "value": 1 + }, + { + "id": "0x8000", + "name": "child_lock", + "zcl_type": "bool", + "unsupported": true + }, + { + "id": "0xfffd", + "name": "cluster_revision", + "zcl_type": "uint16", + "value": 2 + }, + { + "id": "0x4000", + "name": "global_scene_control", + "zcl_type": "bool", + "unsupported": true + }, + { + "id": "0x4002", + "name": "off_wait_time", + "zcl_type": "uint16", + "value": 0 + }, + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x4001", + "name": "on_time", + "zcl_type": "uint16", + "value": 0 + }, + { + "id": "0x8002", + "name": "power_on_state", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x8004", + "name": "switch_mode", + "zcl_type": "enum8", + "unsupported": true + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 80 + } + ] + } + ] + }, + "2": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_LIGHT", + "id": 256 + }, + "in_clusters": [ + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [ + { + "id": "0x0004", + "name": "name_support", + "zcl_type": "map8", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x8001", + "name": "backlight_mode", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x8000", + "name": "child_lock", + "zcl_type": "bool", + "unsupported": true + }, + { + "id": "0xfffd", + "name": "cluster_revision", + "zcl_type": "uint16", + "value": 2 + }, + { + "id": "0x4002", + "name": "off_wait_time", + "zcl_type": "uint16", + "value": 0 + }, + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x4001", + "name": "on_time", + "zcl_type": "uint16", + "value": 0 + }, + { + "id": "0x8002", + "name": "power_on_state", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0xfffe", + "name": "reporting_status", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x8004", + "name": "switch_mode", + "zcl_type": "enum8", + "unsupported": true + } + ] + } + ], + "out_clusters": [] + }, + "3": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_LIGHT", + "id": 256 + }, + "in_clusters": [ + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x8000", + "name": "child_lock", + "zcl_type": "bool", + "unsupported": true + }, + { + "id": "0x4000", + "name": "global_scene_control", + "zcl_type": "bool", + "unsupported": true + }, + { + "id": "0x4002", + "name": "off_wait_time", + "zcl_type": "uint16", + "value": 0 + }, + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0x4001", + "name": "on_time", + "zcl_type": "uint16", + "value": 0 + }, + { + "id": "0xfffe", + "name": "reporting_status", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x8004", + "name": "switch_mode", + "zcl_type": "enum8", + "unsupported": true + } + ] + } + ], + "out_clusters": [] + } + }, + "original_signature": { + "manufacturer": "_TZ3000_09gto2zn", + "model": "TS0013", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0100", + "input_clusters": [ + "0x0000", + "0x0003", + "0x0004", + "0x0005", + "0x0006" + ], + "output_clusters": [ + "0x0019", + "0x000a" + ] + }, + "2": { + "profile_id": "0x0104", + "device_type": "0x0100", + "input_clusters": [ + "0x0004", + "0x0005", + "0x0006" + ], + "output_clusters": [] + }, + "3": { + "profile_id": "0x0104", + "device_type": "0x0100", + "input_clusters": [ + "0x0004", + "0x0005", + "0x0006" + ], + "output_clusters": [] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:34:aa:29:f4-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:34:aa:29:f4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "light": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:34:aa:29:f4-1", + "migrate_unique_ids": [], + "platform": "light", + "class_name": "Light", + "translation_key": "light", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:34:aa:29:f4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "effect_list": [ + "off" + ], + "supported_features": 8, + "min_mireds": 153, + "max_mireds": 500 + }, + "state": { + "class_name": "Light", + "available": true, + "on": false, + "brightness": null, + "xy_color": null, + "color_temp": null, + "effect_list": [ + "off" + ], + "effect": "off", + "supported_features": 8, + "color_mode": "onoff", + "supported_color_modes": [ + "onoff" + ], + "off_with_transition": false, + "off_brightness": null + }, + "extra_state_attributes": [ + "off_brightness", + "off_with_transition" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:34:aa:29:f4-2", + "migrate_unique_ids": [], + "platform": "light", + "class_name": "Light", + "translation_key": "light", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:34:aa:29:f4", + "endpoint_id": 2, + "available": true, + "group_id": null, + "effect_list": [ + "off" + ], + "supported_features": 8, + "min_mireds": 153, + "max_mireds": 500 + }, + "state": { + "class_name": "Light", + "available": true, + "on": false, + "brightness": null, + "xy_color": null, + "color_temp": null, + "effect_list": [ + "off" + ], + "effect": "off", + "supported_features": 8, + "color_mode": "onoff", + "supported_color_modes": [ + "onoff" + ], + "off_with_transition": false, + "off_brightness": null + }, + "extra_state_attributes": [ + "off_brightness", + "off_with_transition" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:34:aa:29:f4-3", + "migrate_unique_ids": [], + "platform": "light", + "class_name": "Light", + "translation_key": "light", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:34:aa:29:f4", + "endpoint_id": 3, + "available": true, + "group_id": null, + "effect_list": [ + "off" + ], + "supported_features": 8, + "min_mireds": 153, + "max_mireds": 500 + }, + "state": { + "class_name": "Light", + "available": true, + "on": false, + "brightness": null, + "xy_color": null, + "color_temp": null, + "effect_list": [ + "off" + ], + "effect": "off", + "supported_features": 8, + "color_mode": "onoff", + "supported_color_modes": [ + "onoff" + ], + "off_with_transition": false, + "off_brightness": null + }, + "extra_state_attributes": [ + "off_brightness", + "off_with_transition" + ] + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:34:aa:29:f4-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:34:aa:29:f4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 188 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:34:aa:29:f4-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:34:aa:29:f4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -53 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:34:aa:29:f4-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:34:aa:29:f4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00000050", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tz3000-1dd0d5yi-ts130f.json b/tests/data/devices/tz3000-1dd0d5yi-ts130f.json new file mode 100644 index 000000000..b5189faa9 --- /dev/null +++ b/tests/data/devices/tz3000-1dd0d5yi-ts130f.json @@ -0,0 +1,521 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:15:80:89:33", + "nwk": "0xB0E7", + "manufacturer": "_TZ3000_1dd0d5yi", + "model": "TS130F", + "friendly_manufacturer": "_TZ3000_1dd0d5yi", + "friendly_model": "TS130F", + "name": "_TZ3000_1dd0d5yi TS130F", + "quirk_applied": true, + "quirk_class": "zhaquirks.tuya.ts130f.TuyaTS130FTI2", + "exposes_features": [], + "manufacturer_code": 4098, + "power_source": "Mains", + "lqi": 255, + "rssi": -73, + "last_seen": "2025-07-08T17:00:04.111016+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4098, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "WINDOW_COVERING_CONTROLLER", + "id": 515 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0013", + "name": "alarm_mask", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0001", + "name": "app_version", + "zcl_type": "uint8", + "value": 71 + }, + { + "id": "0xfffd", + "name": "cluster_revision", + "zcl_type": "uint16", + "value": 2 + }, + { + "id": "0x0006", + "name": "date_code", + "zcl_type": "string", + "value": "" + }, + { + "id": "0x0012", + "name": "device_enabled", + "zcl_type": "bool", + "unsupported": true + }, + { + "id": "0x0014", + "name": "disable_local_config", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0008", + "name": "generic_device_class", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0009", + "name": "generic_device_type", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0003", + "name": "hw_version", + "zcl_type": "uint8", + "value": 1 + }, + { + "id": "0x0010", + "name": "location_desc", + "zcl_type": "string", + "unsupported": true + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZ3000_1dd0d5yi" + }, + { + "id": "0x000c", + "name": "manufacturer_version_details", + "zcl_type": "string", + "unsupported": true + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS130F" + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [ + { + "id": "0x0004", + "name": "name_support", + "zcl_type": "map8", + "value": 0 + }, + { + "id": "0x0003", + "name": "scene_valid", + "zcl_type": "bool", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x8001", + "name": "backlight_mode", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "unsupported": true + }, + { + "id": "0xfffe", + "name": "reporting_status", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0102", + "endpoint_attribute": "window_covering", + "attributes": [ + { + "id": "0x0015", + "name": "acceleration_time_lift", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0xf001", + "name": "calibration", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0xf003", + "name": "calibration_time", + "zcl_type": "uint16", + "value": 300 + }, + { + "id": "0x0007", + "name": "config_status", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0003", + "name": "current_position_lift", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0008", + "name": "current_position_lift_percentage", + "zcl_type": "uint8", + "value": 100 + }, + { + "id": "0x0009", + "name": "current_position_tilt_percentage", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0011", + "name": "installed_closed_limit_lift", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0013", + "name": "installed_closed_limit_tilt", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0010", + "name": "installed_open_limit_lift", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x0012", + "name": "installed_open_limit_tilt", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x8000", + "name": "motor_mode", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0xf002", + "name": "motor_reversal", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0x0005", + "name": "number_of_actuations_lift", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0xf000", + "name": "tuya_moving_state", + "zcl_type": "enum8", + "value": 1 + }, + { + "id": "0x0017", + "name": "window_covering_mode", + "zcl_type": "map8", + "unsupported": true + }, + { + "id": "0x0000", + "name": "window_covering_type", + "zcl_type": "enum8", + "unsupported": true + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [ + { + "id": "0xfffd", + "name": "cluster_revision", + "zcl_type": "uint16", + "value": 1 + }, + { + "id": "0x0007", + "name": "local_time", + "zcl_type": "uint32", + "unsupported": true + }, + { + "id": "0x0002", + "name": "time_zone", + "zcl_type": "int32", + "unsupported": true + } + ] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "unsupported": true + }, + { + "id": "0x0004", + "name": "downloaded_file_version", + "zcl_type": "uint32", + "unsupported": true + }, + { + "id": "0x0005", + "name": "downloaded_zigbee_stack_version", + "zcl_type": "uint16", + "unsupported": true + }, + { + "id": "0x000a", + "name": "image_stamp", + "zcl_type": "uint32", + "unsupported": true + }, + { + "id": "0x0007", + "name": "manufacturer_id", + "zcl_type": "uint16", + "unsupported": true + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZ3000_1dd0d5yi", + "model": "TS130F", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4098, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0203", + "input_clusters": [ + "0x0000", + "0x0004", + "0x0005", + "0x0006", + "0x0102" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "cover": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:15:80:89:33-1-258", + "migrate_unique_ids": [], + "platform": "cover", + "class_name": "Cover", + "translation_key": "cover", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:15:80:89:33", + "endpoint_id": 1, + "available": true, + "group_id": null + }, + "state": { + "class_name": "Cover", + "available": true, + "current_position": 0, + "current_tilt_position": null, + "state": "closed", + "is_opening": false, + "is_closing": false, + "is_closed": true, + "supported_features": 15 + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:15:80:89:33-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:15:80:89:33", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 255 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:15:80:89:33-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:15:80:89:33", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -73 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:15:80:89:33-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:15:80:89:33", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": null, + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tz3210-3ulg9kpo-ts0021-0x00000042.json b/tests/data/devices/tz3210-3ulg9kpo-ts0021-0x00000042.json new file mode 100644 index 000000000..d888e3665 --- /dev/null +++ b/tests/data/devices/tz3210-3ulg9kpo-ts0021-0x00000042.json @@ -0,0 +1,340 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:97:dd:c8:ba", + "nwk": "0x918A", + "manufacturer": "_TZ3210_3ulg9kpo", + "model": "TS0021", + "friendly_manufacturer": "_TZ3210_3ulg9kpo", + "friendly_model": "TS0021", + "name": "_TZ3210_3ulg9kpo TS0021", + "quirk_applied": true, + "quirk_class": "zhaquirks.tuya.ts0021.TS0021", + "exposes_features": [], + "manufacturer_code": 4417, + "power_source": "Battery or Unknown", + "lqi": 116, + "rssi": -71, + "last_seen": "2026-02-14T14:54:11.527860+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "IAS_ZONE", + "id": 1026 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 0 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0020", + "name": "battery_voltage", + "zcl_type": "uint8", + "value": 0 + } + ] + }, + { + "cluster_id": "0x0500", + "endpoint_attribute": "ias_zone", + "attributes": [ + { + "id": "0x0010", + "name": "cie_addr", + "zcl_type": "EUI64", + "value": [ + 50, + 79, + 50, + 2, + 0, + 141, + 21, + 0 + ] + }, + { + "id": "0x0000", + "name": "zone_state", + "zcl_type": "enum8", + "value": 1 + }, + { + "id": "0x0002", + "name": "zone_status", + "zcl_type": "map16", + "value": 0 + }, + { + "id": "0x0001", + "name": "zone_type", + "zcl_type": "enum16", + "value": 40 + } + ] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": "tuya_manufacturer", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 66 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZ3210_3ulg9kpo", + "model": "TS0021", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0402", + "input_clusters": [ + "0x0001", + "0x0500", + "0xef00", + "0x0000" + ], + "output_clusters": [ + "0x0019", + "0x000a" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:97:dd:c8:ba-1-1280", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "IASZone", + "translation_key": null, + "translation_placeholders": null, + "device_class": "smoke", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:97:dd:c8:ba", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "zone_status" + }, + "state": { + "class_name": "IASZone", + "available": true, + "state": false + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:97:dd:c8:ba-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:97:dd:c8:ba", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 116 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:97:dd:c8:ba-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:97:dd:c8:ba", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -71 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:97:dd:c8:ba-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:97:dd:c8:ba", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 0.0, + "battery_voltage": 0.0 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:97:dd:c8:ba-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:97:dd:c8:ba", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00000042", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tz3290-7v1k4vufotpowp9z-ts1201-0x00000043.json b/tests/data/devices/tz3290-7v1k4vufotpowp9z-ts1201-0x00000043.json new file mode 100644 index 000000000..6c4d1642c --- /dev/null +++ b/tests/data/devices/tz3290-7v1k4vufotpowp9z-ts1201-0x00000043.json @@ -0,0 +1,345 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:3e:18:f5:53", + "nwk": "0x7420", + "manufacturer": "_TZ3290_7v1k4vufotpowp9z", + "model": "TS1201", + "friendly_manufacturer": "_TZ3290_7v1k4vufotpowp9z", + "friendly_model": "TS1201", + "name": "_TZ3290_7v1k4vufotpowp9z TS1201", + "quirk_applied": true, + "quirk_class": "zhaquirks.tuya.ts1201.ZosungIRBlaster_ZS06", + "exposes_features": [], + "manufacturer_code": 4098, + "power_source": "Mains", + "lqi": 232, + "rssi": -42, + "last_seen": "2025-10-05T15:34:41.193436+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4098, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "undefined_0xf000", + "id": 61440 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZ3290_7v1k4vufotpowp9z" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS1201" + } + ] + }, + { + "cluster_id": "0x0003", + "endpoint_attribute": "identify", + "attributes": [] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": 1 + }, + { + "id": "0x4003", + "name": "start_up_on_off", + "zcl_type": "enum8", + "unsupported": true + } + ] + }, + { + "cluster_id": "0xe004", + "endpoint_attribute": "zosung_ircontrol", + "attributes": [] + }, + { + "cluster_id": "0xed00", + "endpoint_attribute": "zosung_irtransmit", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 67 + } + ] + } + ] + }, + "242": { + "profile_id": 41440, + "device_type": { + "name": "PROXY_BASIC", + "id": 97 + }, + "in_clusters": [], + "out_clusters": [ + { + "cluster_id": "0x0021", + "endpoint_attribute": "green_power", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZ3290_7v1k4vufotpowp9z", + "model": "TS1201", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4098, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0xf000", + "input_clusters": [ + "0x0000", + "0xed00", + "0xe004", + "0x0004", + "0x0003", + "0x0006", + "0x0005" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + }, + "242": { + "profile_id": "0xa1e0", + "device_type": "0x0061", + "input_clusters": [], + "output_clusters": [ + "0x0021" + ] + } + } + }, + "zha_lib_entities": { + "button": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3e:18:f5:53-1-3", + "migrate_unique_ids": [], + "platform": "button", + "class_name": "IdentifyButton", + "translation_key": null, + "translation_placeholders": null, + "device_class": "identify", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3e:18:f5:53", + "endpoint_id": 1, + "available": true, + "group_id": null, + "command": "identify", + "args": [ + 5 + ], + "kwargs": {} + }, + "state": { + "class_name": "IdentifyButton", + "available": true + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3e:18:f5:53-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3e:18:f5:53", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 232 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3e:18:f5:53-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3e:18:f5:53", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -42 + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3e:18:f5:53-1-6", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "Switch", + "translation_key": "switch", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:3e:18:f5:53", + "endpoint_id": 1, + "available": true, + "group_id": null + }, + "state": { + "class_name": "Switch", + "state": 1, + "available": true + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3e:18:f5:53-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3e:18:f5:53", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00000043", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tze200-4vobcgd3-ts0601-0x00000053.json b/tests/data/devices/tze200-4vobcgd3-ts0601-0x00000053.json new file mode 100644 index 000000000..253c5d46c --- /dev/null +++ b/tests/data/devices/tze200-4vobcgd3-ts0601-0x00000053.json @@ -0,0 +1,231 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:ae:51:f6:e4", + "nwk": "0xDAD2", + "manufacturer": "_TZE200_4vobcgd3", + "model": "TS0601", + "friendly_manufacturer": "_TZE200_4vobcgd3", + "friendly_model": "TS0601", + "name": "_TZE200_4vobcgd3 TS0601", + "quirk_applied": false, + "quirk_class": "zigpy.device.Device", + "exposes_features": [], + "manufacturer_code": 4098, + "power_source": "Mains", + "lqi": 132, + "rssi": -67, + "last_seen": "2026-06-03T16:10:58.710439+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4098, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "SMART_PLUG", + "id": 81 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZE200_4vobcgd3" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS0601" + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": null, + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 83 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZE200_4vobcgd3", + "model": "TS0601", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4098, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0051", + "input_clusters": [ + "0x0000", + "0x0004", + "0x0005", + "0xef00" + ], + "output_clusters": [ + "0x0019", + "0x000a" + ] + } + } + }, + "zha_lib_entities": { + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:51:f6:e4-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:51:f6:e4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 132 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:51:f6:e4-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:51:f6:e4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -67 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:ae:51:f6:e4-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:ae:51:f6:e4", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00000053", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tze200-a7sghmms-ts0601.json b/tests/data/devices/tze200-a7sghmms-ts0601.json new file mode 100644 index 000000000..84db4a880 --- /dev/null +++ b/tests/data/devices/tze200-a7sghmms-ts0601.json @@ -0,0 +1,630 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "nwk": "0xABD5", + "manufacturer": "_TZE200_a7sghmms", + "model": "TS0601", + "friendly_manufacturer": "_TZE200_a7sghmms", + "friendly_model": "TS0601", + "name": "_TZE200_a7sghmms TS0601", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4417, + "power_source": "Battery or Unknown", + "lqi": 183, + "rssi": null, + "last_seen": "2025-08-13T14:43:05.969342+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "SMART_PLUG", + "id": 81 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZE200_a7sghmms" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS0601" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 4 + }, + { + "id": "0x0034", + "name": "battery_rated_voltage", + "zcl_type": "uint8", + "value": 15 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 3 + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0006", + "endpoint_attribute": "on_off", + "attributes": [ + { + "id": "0x0000", + "name": "on_off", + "zcl_type": "bool", + "value": false + } + ] + }, + { + "cluster_id": "0x0702", + "endpoint_attribute": "smartenergy_metering", + "attributes": [ + { + "id": "0x0400", + "name": "instantaneous_demand", + "zcl_type": "int24", + "unsupported": true + }, + { + "id": "0x0306", + "name": "metering_device_type", + "zcl_type": "map8", + "value": 2 + }, + { + "id": "0x0300", + "name": "unit_of_measure", + "zcl_type": "enum8", + "value": 7 + } + ] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": "tuya_manufacturer", + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZE200_a7sghmms", + "model": "TS0601", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0051", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0004", + "0x0005", + "0x0006", + "0x0702", + "0xef00" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "number": [ + { + "info_object": { + "fallback_name": "Irrigation cycles", + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-irrigation_cycles", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "irrigation_cycles", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 100, + "native_min_value": 0, + "native_step": 1, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": "Irrigation interval", + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-irrigation_interval", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "irrigation_interval", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 43200, + "native_min_value": 0, + "native_step": 1, + "native_unit_of_measurement": "s" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": "Irrigation target", + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-irrigation_target", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "irrigation_target", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 43200, + "native_min_value": 0, + "native_step": 1, + "native_unit_of_measurement": null + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": null + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": "Irrigation mode", + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-irrigation_mode", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "irrigation_mode", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "GiexIrrigationMode", + "options": [ + "Duration", + "Capacity" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": "Weather delay", + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-weather_delay", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "weather_delay", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "GiexIrrigationWeatherDelay", + "options": [ + "NoDelay", + "TwentyFourHourDelay", + "FortyEightHourDelay", + "SeventyTwoHourDelay" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": null + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 183 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": null, + "battery_size": "AA", + "battery_quantity": 4 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-1794-summation_delivered", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "SmartEnergySummation", + "translation_key": "summation_delivered", + "translation_placeholders": null, + "device_class": "volume", + "state_class": "total_increasing", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 3, + "unit": "L" + }, + "state": { + "class_name": "SmartEnergySummation", + "available": true, + "state": null, + "device_type": "Water Metering", + "zcl_unit_of_measurement": 7 + }, + "extra_state_attributes": [ + "device_type", + "status", + "zcl_unit_of_measurement" + ] + }, + { + "info_object": { + "fallback_name": "Irrigation duration", + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-irrigation_duration", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Sensor", + "translation_key": "irrigation_duration", + "translation_placeholders": null, + "device_class": "duration", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "s" + }, + "state": { + "class_name": "Sensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": "Irrigation end time", + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-irrigation_end_time", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Sensor", + "translation_key": "irrigation_end_time", + "translation_placeholders": null, + "device_class": "timestamp", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "Sensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": "Irrigation start time", + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-irrigation_start_time", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Sensor", + "translation_key": "irrigation_start_time", + "translation_placeholders": null, + "device_class": "timestamp", + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "Sensor", + "available": true, + "state": null + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "Switch", + "translation_key": "switch", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null + }, + "state": { + "class_name": "Switch", + "state": false, + "available": true + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:b5:0f:0b:2f-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b5:0f:0b:2f", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": null, + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tze200-nklqjk62-ts0601-0x00000046.json b/tests/data/devices/tze200-nklqjk62-ts0601-0x00000046.json new file mode 100644 index 000000000..d339ce570 --- /dev/null +++ b/tests/data/devices/tze200-nklqjk62-ts0601-0x00000046.json @@ -0,0 +1,297 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:34:58:0b:f7", + "nwk": "0x8022", + "manufacturer": "_TZE200_nklqjk62", + "model": "TS0601", + "friendly_manufacturer": "_TZE200_nklqjk62", + "friendly_model": "TS0601", + "name": "_TZE200_nklqjk62 TS0601", + "quirk_applied": true, + "quirk_class": "zhaquirks.tuya.ts0601_garage.TuyaGarageSwitchTO", + "exposes_features": [], + "manufacturer_code": 4417, + "power_source": "Mains", + "lqi": 116, + "rssi": -82, + "last_seen": "2026-06-11T10:21:25.755876+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "ON_OFF_LIGHT", + "id": 256 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0001", + "name": "app_version", + "zcl_type": "uint8", + "value": 70 + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZE200_nklqjk62" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS0601" + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": "tuya_manufacturer_garage", + "attributes": [ + { + "id": "0xef0b", + "name": "dp_11", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0xef0c", + "name": "dp_12", + "zcl_type": "enum8", + "value": 2 + }, + { + "id": "0xef02", + "name": "dp_2", + "zcl_type": "uint32", + "value": 0 + }, + { + "id": "0xef04", + "name": "dp_4", + "zcl_type": "uint32", + "value": 10 + }, + { + "id": "0xef05", + "name": "dp_5", + "zcl_type": "uint32", + "value": 3600 + }, + { + "id": "0xef00", + "name": "mcu_version", + "zcl_type": "uint48", + "value": "1.0.0" + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 70 + } + ] + } + ] + }, + "242": { + "profile_id": 41440, + "device_type": { + "name": "PROXY_BASIC", + "id": 97 + }, + "in_clusters": [], + "out_clusters": [ + { + "cluster_id": "0x0021", + "endpoint_attribute": "green_power", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZE200_nklqjk62", + "model": "TS0601", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0051", + "input_clusters": [ + "0x0004", + "0x0005", + "0xef00", + "0x0000" + ], + "output_clusters": [ + "0x0019", + "0x000a" + ] + }, + "242": { + "profile_id": "0xa1e0", + "device_type": "0x0061", + "input_clusters": [], + "output_clusters": [ + "0x0021" + ] + } + } + }, + "zha_lib_entities": { + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:34:58:0b:f7-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:34:58:0b:f7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 116 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:34:58:0b:f7-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:34:58:0b:f7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -82 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:34:58:0b:f7-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:34:58:0b:f7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x00000046", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tze204-b8vxct9l-ts0601-0x0000004a.json b/tests/data/devices/tze204-b8vxct9l-ts0601-0x0000004a.json new file mode 100644 index 000000000..d77a380a6 --- /dev/null +++ b/tests/data/devices/tze204-b8vxct9l-ts0601-0x0000004a.json @@ -0,0 +1,266 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:af:fa:60:54", + "nwk": "0xD20F", + "manufacturer": "_TZE204_b8vxct9l", + "model": "TS0601", + "friendly_manufacturer": "_TZE204_b8vxct9l", + "friendly_model": "TS0601", + "name": "_TZE204_b8vxct9l TS0601", + "quirk_applied": false, + "quirk_class": "zigpy.device.Device", + "exposes_features": [], + "manufacturer_code": 4417, + "power_source": "Mains", + "lqi": 255, + "rssi": -52, + "last_seen": "2026-06-09T17:24:38.725043+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "SMART_PLUG", + "id": 81 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0001", + "name": "app_version", + "zcl_type": "uint8", + "value": 74 + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZE204_b8vxct9l" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS0601" + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": null, + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 74 + }, + { + "id": "0x0005", + "name": "downloaded_zigbee_stack_version", + "zcl_type": "uint16", + "value": 65535 + } + ] + } + ] + }, + "242": { + "profile_id": 41440, + "device_type": { + "name": "PROXY_BASIC", + "id": 97 + }, + "in_clusters": [], + "out_clusters": [ + { + "cluster_id": "0x0021", + "endpoint_attribute": "green_power", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZE204_b8vxct9l", + "model": "TS0601", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0051", + "input_clusters": [ + "0x0004", + "0x0005", + "0xef00", + "0x0000" + ], + "output_clusters": [ + "0x0019", + "0x000a" + ] + }, + "242": { + "profile_id": "0xa1e0", + "device_type": "0x0061", + "input_clusters": [], + "output_clusters": [ + "0x0021" + ] + } + } + }, + "zha_lib_entities": { + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:af:fa:60:54-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:af:fa:60:54", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 255 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:af:fa:60:54-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:af:fa:60:54", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -52 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:af:fa:60:54-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:af:fa:60:54", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x0000004a", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tze204-ltwbm23f-ts0601-0x0000004e.json b/tests/data/devices/tze204-ltwbm23f-ts0601-0x0000004e.json new file mode 100644 index 000000000..83a7b75bd --- /dev/null +++ b/tests/data/devices/tze204-ltwbm23f-ts0601-0x0000004e.json @@ -0,0 +1,1054 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:1b:1e:95:0a", + "nwk": "0x15E9", + "manufacturer": "_TZE204_ltwbm23f", + "model": "TS0601", + "friendly_manufacturer": "_TZE204_ltwbm23f", + "friendly_model": "TS0601", + "name": "_TZE204_ltwbm23f TS0601", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4417, + "power_source": "Battery or Unknown", + "lqi": 152, + "rssi": -62, + "last_seen": "2026-02-17T11:27:58.816885+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "SMART_PLUG", + "id": 81 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0001", + "name": "app_version", + "zcl_type": "uint8", + "value": 78 + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZE204_ltwbm23f" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS0601" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 200 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 2 + }, + { + "id": "0x0034", + "name": "battery_rated_voltage", + "zcl_type": "uint8", + "value": 15 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 3 + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0201", + "endpoint_attribute": "thermostat", + "attributes": [ + { + "id": "0x0004", + "name": "abs_max_heat_setpoint_limit", + "zcl_type": "int16", + "value": 3000 + }, + { + "id": "0x0003", + "name": "abs_min_heat_setpoint_limit", + "zcl_type": "int16", + "value": 500 + }, + { + "id": "0x001b", + "name": "ctrl_sequence_of_oper", + "zcl_type": "enum8", + "value": 2 + }, + { + "id": "0x0000", + "name": "local_temperature", + "zcl_type": "int16", + "value": 2220 + }, + { + "id": "0x0010", + "name": "local_temperature_calibration", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0016", + "name": "max_heat_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0015", + "name": "min_heat_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0012", + "name": "occupied_heating_setpoint", + "zcl_type": "int16", + "value": 2100 + }, + { + "id": "0x0008", + "name": "pi_heating_demand", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0029", + "name": "running_state", + "zcl_type": "map16", + "value": 0 + }, + { + "id": "0x0030", + "name": "setpoint_change_source", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0032", + "name": "setpoint_change_source_timestamp", + "zcl_type": "UTC", + "unsupported": true + }, + { + "id": "0x001c", + "name": "system_mode", + "zcl_type": "enum8", + "value": 4 + } + ] + }, + { + "cluster_id": "0xed00", + "endpoint_attribute": null, + "attributes": [] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": "tuya_manufacturer", + "attributes": [ + { + "id": "0xef07", + "name": "child_lock", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0xef77", + "name": "comfort_temperature", + "zcl_type": "uint16", + "value": 210 + }, + { + "id": "0xef6f", + "name": "display_brightness", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0xef71", + "name": "display_orientation", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0xef78", + "name": "eco_temperature", + "zcl_type": "uint16", + "value": 200 + }, + { + "id": "0xef79", + "name": "holiday_temperature", + "zcl_type": "uint16", + "value": 150 + }, + { + "id": "0xef7f", + "name": "hysteresis_mode", + "zcl_type": "enum8", + "value": 0 + }, + { + "id": "0xef2f", + "name": "local_temperature_calibration", + "zcl_type": "int32", + "value": -24 + }, + { + "id": "0xef09", + "name": "max_temperature", + "zcl_type": "uint16", + "value": 300 + }, + { + "id": "0xef00", + "name": "mcu_version", + "zcl_type": "uint48", + "value": "1.0.7" + }, + { + "id": "0xef0a", + "name": "min_temperature", + "zcl_type": "uint16", + "value": 50 + }, + { + "id": "0xef6e", + "name": "motor_thrust", + "zcl_type": "enum8", + "value": 2 + }, + { + "id": "0xef02", + "name": "preset_mode", + "zcl_type": "uint16", + "value": 3 + }, + { + "id": "0xef72", + "name": "valve_position", + "zcl_type": "int16", + "value": 0 + }, + { + "id": "0xef0e", + "name": "window_detection", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0xef0f", + "name": "window_open", + "zcl_type": "bool", + "value": 0 + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 78 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZE204_ltwbm23f", + "model": "TS0601", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0051", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0004", + "0x0005", + "0x0201", + "0xed00", + "0xef00" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": "Window open", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-window_open", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "BinarySensor", + "translation_key": null, + "translation_placeholders": null, + "device_class": "window", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "window_open" + }, + "state": { + "class_name": "BinarySensor", + "available": true, + "state": false + } + } + ], + "climate": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-513", + "migrate_unique_ids": [], + "platform": "climate", + "class_name": "Thermostat", + "translation_key": "thermostat", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "max_temp": 30.0, + "min_temp": 5.0, + "supported_features": 385, + "fan_modes": null, + "preset_modes": [], + "hvac_modes": [ + "off", + "heat" + ] + }, + "state": { + "class_name": "Thermostat", + "available": true, + "current_temperature": 22.2, + "outdoor_temperature": null, + "target_temperature": 21.0, + "target_temperature_high": null, + "target_temperature_low": null, + "hvac_action": "idle", + "hvac_mode": "heat", + "preset_mode": "none", + "fan_mode": "auto", + "system_mode": "[4]/heat", + "occupancy": null, + "occupied_cooling_setpoint": null, + "occupied_heating_setpoint": 2100, + "pi_heating_demand": null, + "pi_cooling_demand": null, + "unoccupied_cooling_setpoint": null, + "unoccupied_heating_setpoint": null + }, + "extra_state_attributes": [ + "occupancy", + "occupied_cooling_setpoint", + "occupied_heating_setpoint", + "pi_cooling_demand", + "pi_heating_demand", + "system_mode", + "unoccupied_cooling_setpoint", + "unoccupied_heating_setpoint" + ] + } + ], + "number": [ + { + "info_object": { + "fallback_name": "Comfort temperature", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-comfort_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "comfort_temperature", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 30, + "native_min_value": 5, + "native_step": 1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 21.0 + } + }, + { + "info_object": { + "fallback_name": "Eco temperature", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-eco_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "eco_temperature", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 30, + "native_min_value": 5, + "native_step": 1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 20.0 + } + }, + { + "info_object": { + "fallback_name": "Holiday temperature", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-holiday_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "holiday_temperature", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 30, + "native_min_value": 5, + "native_step": 1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 15.0 + } + }, + { + "info_object": { + "fallback_name": "Local temperature calibration", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-local_temperature_calibration", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "local_temperature_calibration", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 6, + "native_min_value": -6, + "native_step": 0.1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": -2.4000000000000004 + } + }, + { + "info_object": { + "fallback_name": "Max temperature", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-max_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "max_temperature", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 35, + "native_min_value": 15, + "native_step": 1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 30.0 + } + }, + { + "info_object": { + "fallback_name": "Min temperature", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-min_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "min_temperature", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 15, + "native_min_value": 1, + "native_step": 1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 5.0 + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": "Display brightness", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-display_brightness", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "display_brightness", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "TuyaDisplayBrightness", + "options": [ + "High", + "Medium", + "Low" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": "High" + } + }, + { + "info_object": { + "fallback_name": "Display orientation", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-display_orientation", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "display_orientation", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "TuyaDisplayOrientation", + "options": [ + "Up", + "Down" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": "Up" + } + }, + { + "info_object": { + "fallback_name": "Hysteresis mode", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-hysteresis_mode", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "hysteresis_mode", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "TuyaHysteresis", + "options": [ + "Comfort", + "Eco" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": "Comfort" + } + }, + { + "info_object": { + "fallback_name": "Motor thrust", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-motor_thrust", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "motor_thrust", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "TuyaMotorThrust", + "options": [ + "Strong", + "Middle", + "Weak" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": "Weak" + } + }, + { + "info_object": { + "fallback_name": "Preset mode", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-preset_mode", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "preset_mode", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "TuyaPresetMode", + "options": [ + "Eco", + "Auto", + "Off", + "Heat" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": "Heat" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 152 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -62 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 100.0, + "battery_size": "AA", + "battery_quantity": 2 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-513-hvac_action", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ThermostatHVACAction", + "translation_key": "hvac_action", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "ThermostatHVACAction", + "available": true, + "state": "idle" + } + }, + { + "info_object": { + "fallback_name": "Valve position", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-valve_position", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Sensor", + "translation_key": "valve_position", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "%" + }, + "state": { + "class_name": "Sensor", + "available": true, + "state": 0.0 + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": "Child lock", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-child_lock", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "child_lock", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "child_lock", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + }, + { + "info_object": { + "fallback_name": "Open window detection", + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-window_detection", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "window_detection", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "window_detection", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:1b:1e:95:0a-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:1b:1e:95:0a", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x0000004e", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tze204-rtrmfadk-ts0601.json b/tests/data/devices/tze204-rtrmfadk-ts0601.json new file mode 100644 index 000000000..340e47c80 --- /dev/null +++ b/tests/data/devices/tze204-rtrmfadk-ts0601.json @@ -0,0 +1,777 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:9f:cb:25:01", + "nwk": "0x963E", + "manufacturer": "_TZE204_rtrmfadk", + "model": "TS0601", + "friendly_manufacturer": "_TZE204_rtrmfadk", + "friendly_model": "TS0601", + "name": "_TZE204_rtrmfadk TS0601", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4417, + "power_source": "Battery or Unknown", + "lqi": null, + "rssi": null, + "last_seen": "2026-04-05T10:27:05.841550+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "SMART_PLUG", + "id": 81 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0001", + "name": "app_version", + "zcl_type": "uint8", + "value": 73 + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZE204_rtrmfadk" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS0601" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 194 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 2 + }, + { + "id": "0x0034", + "name": "battery_rated_voltage", + "zcl_type": "uint8", + "value": 15 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 3 + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0201", + "endpoint_attribute": "thermostat", + "attributes": [ + { + "id": "0x0004", + "name": "abs_max_heat_setpoint_limit", + "zcl_type": "int16", + "value": 3000 + }, + { + "id": "0x0003", + "name": "abs_min_heat_setpoint_limit", + "zcl_type": "int16", + "value": 500 + }, + { + "id": "0x001b", + "name": "ctrl_sequence_of_oper", + "zcl_type": "enum8", + "value": 2 + }, + { + "id": "0x0000", + "name": "local_temperature", + "zcl_type": "int16", + "value": 1680 + }, + { + "id": "0x0010", + "name": "local_temperature_calibration", + "zcl_type": "int8", + "unsupported": true + }, + { + "id": "0x0016", + "name": "max_heat_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0015", + "name": "min_heat_setpoint_limit", + "zcl_type": "int16", + "unsupported": true + }, + { + "id": "0x0012", + "name": "occupied_heating_setpoint", + "zcl_type": "int16", + "value": 1200 + }, + { + "id": "0x0008", + "name": "pi_heating_demand", + "zcl_type": "uint8", + "unsupported": true + }, + { + "id": "0x0029", + "name": "running_state", + "zcl_type": "map16", + "value": 0 + }, + { + "id": "0x0030", + "name": "setpoint_change_source", + "zcl_type": "enum8", + "unsupported": true + }, + { + "id": "0x0032", + "name": "setpoint_change_source_timestamp", + "zcl_type": "UTC", + "unsupported": true + }, + { + "id": "0x001c", + "name": "system_mode", + "zcl_type": "enum8", + "value": 4 + } + ] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": "tuya_manufacturer", + "attributes": [ + { + "id": "0xef0c", + "name": "child_lock", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0xef72", + "name": "eco_mode", + "zcl_type": "enum8", + "value": 1 + }, + { + "id": "0xef0e", + "name": "error_or_battery_low", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0xef65", + "name": "local_temperature_calibration", + "zcl_type": "int32", + "value": -10 + }, + { + "id": "0xef10", + "name": "max_temperature", + "zcl_type": "uint16", + "value": 300 + }, + { + "id": "0xef00", + "name": "mcu_version", + "zcl_type": "uint48", + "value": "1.0.3" + }, + { + "id": "0xef0f", + "name": "min_temperature", + "zcl_type": "uint16", + "value": 50 + }, + { + "id": "0xef08", + "name": "window_detection", + "zcl_type": "bool", + "value": 0 + }, + { + "id": "0xef07", + "name": "window_open", + "zcl_type": "bool", + "value": 0 + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZE204_rtrmfadk", + "model": "TS0601", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0051", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0004", + "0x0005", + "0x0201", + "0xef00" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "binary_sensor": [ + { + "info_object": { + "fallback_name": "Error or battery low", + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-error_or_battery_low", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "BinarySensor", + "translation_key": "error_or_battery_low", + "translation_placeholders": null, + "device_class": "problem", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "error_or_battery_low" + }, + "state": { + "class_name": "BinarySensor", + "available": true, + "state": false + } + }, + { + "info_object": { + "fallback_name": "Window open", + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-window_open", + "migrate_unique_ids": [], + "platform": "binary_sensor", + "class_name": "BinarySensor", + "translation_key": null, + "translation_placeholders": null, + "device_class": "window", + "state_class": null, + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "window_open" + }, + "state": { + "class_name": "BinarySensor", + "available": true, + "state": false + } + } + ], + "climate": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-513", + "migrate_unique_ids": [], + "platform": "climate", + "class_name": "Thermostat", + "translation_key": "thermostat", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": true, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "max_temp": 30.0, + "min_temp": 5.0, + "supported_features": 385, + "fan_modes": null, + "preset_modes": [], + "hvac_modes": [ + "off", + "heat" + ] + }, + "state": { + "class_name": "Thermostat", + "available": true, + "current_temperature": 16.8, + "outdoor_temperature": null, + "target_temperature": 12.0, + "target_temperature_high": null, + "target_temperature_low": null, + "hvac_action": "idle", + "hvac_mode": "heat", + "preset_mode": "none", + "fan_mode": "auto", + "system_mode": "[4]/heat", + "occupancy": null, + "occupied_cooling_setpoint": null, + "occupied_heating_setpoint": 1200, + "pi_heating_demand": null, + "pi_cooling_demand": null, + "unoccupied_cooling_setpoint": null, + "unoccupied_heating_setpoint": null + }, + "extra_state_attributes": [ + "occupancy", + "occupied_cooling_setpoint", + "occupied_heating_setpoint", + "pi_cooling_demand", + "pi_heating_demand", + "system_mode", + "unoccupied_cooling_setpoint", + "unoccupied_heating_setpoint" + ] + } + ], + "number": [ + { + "info_object": { + "fallback_name": "Local temperature calibration", + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-local_temperature_calibration", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "local_temperature_calibration", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 6, + "native_min_value": -6, + "native_step": 1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": -10 + } + }, + { + "info_object": { + "fallback_name": "Max temperature", + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-max_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "max_temperature", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 35, + "native_min_value": 15, + "native_step": 1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 30.0 + } + }, + { + "info_object": { + "fallback_name": "Min temperature", + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-min_temperature", + "migrate_unique_ids": [], + "platform": "number", + "class_name": "NumberConfigurationEntity", + "translation_key": "min_temperature", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "mode": "auto", + "native_max_value": 15, + "native_min_value": 1, + "native_step": 1, + "native_unit_of_measurement": "\u00b0C" + }, + "state": { + "class_name": "NumberConfigurationEntity", + "available": true, + "state": 5.0 + } + } + ], + "select": [ + { + "info_object": { + "fallback_name": "Eco mode", + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-eco_mode", + "migrate_unique_ids": [], + "platform": "select", + "class_name": "ZCLEnumSelectEntity", + "translation_key": "eco_mode", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "enum": "TuyaThermostatEcoMode", + "options": [ + "Comfort", + "Eco" + ] + }, + "state": { + "class_name": "ZCLEnumSelectEntity", + "available": true, + "state": "Eco" + } + } + ], + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": null + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 97.0, + "battery_size": "AA", + "battery_quantity": 2 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-513-hvac_action", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "ThermostatHVACAction", + "translation_key": "hvac_action", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "ThermostatHVACAction", + "available": true, + "state": "idle" + } + } + ], + "switch": [ + { + "info_object": { + "fallback_name": "Child lock", + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-child_lock", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "child_lock", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "child_lock", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + }, + { + "info_object": { + "fallback_name": "Open window detection", + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-window_detection", + "migrate_unique_ids": [], + "platform": "switch", + "class_name": "ConfigurableAttributeSwitch", + "translation_key": "window_detection", + "translation_placeholders": null, + "device_class": null, + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "attribute_name": "window_detection", + "invert_attribute_name": null, + "force_inverted": false, + "off_value": 0, + "on_value": 1 + }, + "state": { + "class_name": "ConfigurableAttributeSwitch", + "available": true, + "state": false, + "inverted": false + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:9f:cb:25:01-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:9f:cb:25:01", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": null, + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tze284-432zhuwe-ts0601.json b/tests/data/devices/tze284-432zhuwe-ts0601.json new file mode 100644 index 000000000..3911c7364 --- /dev/null +++ b/tests/data/devices/tze284-432zhuwe-ts0601.json @@ -0,0 +1,237 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:b2:e7:24:a7", + "nwk": "0x9550", + "manufacturer": "_TZE284_432zhuwe", + "model": "TS0601", + "friendly_manufacturer": "_TZE284_432zhuwe", + "friendly_model": "TS0601", + "name": "_TZE284_432zhuwe TS0601", + "quirk_applied": false, + "quirk_class": "zigpy.device.Device", + "exposes_features": [], + "manufacturer_code": 4098, + "power_source": "Mains", + "lqi": 136, + "rssi": -77, + "last_seen": "2026-06-04T17:53:27.141838+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4098, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "SMART_PLUG", + "id": 81 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZE284_432zhuwe" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS0601" + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0xed00", + "endpoint_attribute": null, + "attributes": [] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": null, + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "unsupported": true + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZE284_432zhuwe", + "model": "TS0601", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4098, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0051", + "input_clusters": [ + "0x0000", + "0x0004", + "0x0005", + "0xef00", + "0xed00" + ], + "output_clusters": [ + "0x0019", + "0x000a" + ] + } + } + }, + "zha_lib_entities": { + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:b2:e7:24:a7-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b2:e7:24:a7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 136 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:b2:e7:24:a7-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b2:e7:24:a7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -77 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:b2:e7:24:a7-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:b2:e7:24:a7", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": null, + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tze284-6uyu20xu-ts0601.json b/tests/data/devices/tze284-6uyu20xu-ts0601.json new file mode 100644 index 000000000..7d2b3366f --- /dev/null +++ b/tests/data/devices/tze284-6uyu20xu-ts0601.json @@ -0,0 +1,243 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:3d:91:16:91", + "nwk": "0xD934", + "manufacturer": "_TZE284_6uyu20xu", + "model": "TS0601", + "friendly_manufacturer": "_TZE284_6uyu20xu", + "friendly_model": "TS0601", + "name": "_TZE284_6uyu20xu TS0601", + "quirk_applied": false, + "quirk_class": "zigpy.device.Device", + "exposes_features": [], + "manufacturer_code": 4098, + "power_source": "Mains", + "lqi": 196, + "rssi": -51, + "last_seen": "2026-05-27T07:50:49.568409+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4098, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "SMART_PLUG", + "id": 81 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0001", + "name": "app_version", + "zcl_type": "uint8", + "value": 74 + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZE284_6uyu20xu" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS0601" + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0xed00", + "endpoint_attribute": null, + "attributes": [] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": null, + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "unsupported": true + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZE284_6uyu20xu", + "model": "TS0601", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4098, + "maximum_buffer_size": 82, + "maximum_incoming_transfer_size": 82, + "server_mask": 11264, + "maximum_outgoing_transfer_size": 82, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0051", + "input_clusters": [ + "0x0000", + "0x0004", + "0x0005", + "0xef00", + "0xed00" + ], + "output_clusters": [ + "0x0019", + "0x000a" + ] + } + } + }, + "zha_lib_entities": { + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3d:91:16:91-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3d:91:16:91", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 196 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3d:91:16:91-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3d:91:16:91", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -51 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:3d:91:16:91-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:3d:91:16:91", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": null, + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tze284-aao3yzhs-ts0601-0x0000004d.json b/tests/data/devices/tze284-aao3yzhs-ts0601-0x0000004d.json new file mode 100644 index 000000000..d1ef1400c --- /dev/null +++ b/tests/data/devices/tze284-aao3yzhs-ts0601-0x0000004d.json @@ -0,0 +1,398 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:53:b5:37:5e", + "nwk": "0xF715", + "manufacturer": "_TZE284_aao3yzhs", + "model": "TS0601", + "friendly_manufacturer": "_TZE284_aao3yzhs", + "friendly_model": "TS0601", + "name": "_TZE284_aao3yzhs TS0601", + "quirk_applied": true, + "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "exposes_features": [], + "manufacturer_code": 4417, + "power_source": "Battery or Unknown", + "lqi": 220, + "rssi": -45, + "last_seen": "2025-11-25T09:44:15.636790+00:00", + "available": true, + "device_type": "EndDevice", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "EndDevice", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "SMART_PLUG", + "id": 81 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0001", + "name": "app_version", + "zcl_type": "uint8", + "value": 77 + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZE284_aao3yzhs" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS0601" + } + ] + }, + { + "cluster_id": "0x0001", + "endpoint_attribute": "power", + "attributes": [ + { + "id": "0x0021", + "name": "battery_percentage_remaining", + "zcl_type": "uint8", + "value": 0 + }, + { + "id": "0x0033", + "name": "battery_quantity", + "zcl_type": "uint8", + "value": 2 + }, + { + "id": "0x0034", + "name": "battery_rated_voltage", + "zcl_type": "uint8", + "value": 15 + }, + { + "id": "0x0031", + "name": "battery_size", + "zcl_type": "enum8", + "value": 3 + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0x0402", + "endpoint_attribute": "temperature", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "int16", + "value": 820 + } + ] + }, + { + "cluster_id": "0x0408", + "endpoint_attribute": "soil_moisture", + "attributes": [ + { + "id": "0x0000", + "name": "measured_value", + "zcl_type": "uint16", + "value": 10000 + } + ] + }, + { + "cluster_id": "0xed00", + "endpoint_attribute": null, + "attributes": [] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": "tuya_manufacturer", + "attributes": [ + { + "id": "0xef00", + "name": "mcu_version", + "zcl_type": "uint48", + "value": "1.3.6" + } + ] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 77 + } + ] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZE284_aao3yzhs", + "model": "TS0601", + "node_desc": { + "logical_type": 2, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 128, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0051", + "input_clusters": [ + "0x0000", + "0x0001", + "0x0004", + "0x0005", + "0x0402", + "0x0408", + "0xed00", + "0xef00" + ], + "output_clusters": [ + "0x000a", + "0x0019" + ] + } + } + }, + "zha_lib_entities": { + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:53:b5:37:5e-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:53:b5:37:5e", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 220 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:53:b5:37:5e-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:53:b5:37:5e", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -45 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:53:b5:37:5e-1-1", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Battery", + "translation_key": null, + "translation_placeholders": null, + "device_class": "battery", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:53:b5:37:5e", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": 0, + "unit": "%" + }, + "state": { + "class_name": "Battery", + "available": true, + "state": 0.0, + "battery_size": "AA", + "battery_quantity": 2 + }, + "extra_state_attributes": [ + "battery_quantity", + "battery_size", + "battery_voltage" + ] + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:53:b5:37:5e-1-1026", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "Temperature", + "translation_key": null, + "translation_placeholders": null, + "device_class": "temperature", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:53:b5:37:5e", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "\u00b0C" + }, + "state": { + "class_name": "Temperature", + "available": true, + "state": 8.2 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:53:b5:37:5e-1-1032", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "SoilMoisture", + "translation_key": "soil_moisture", + "translation_placeholders": null, + "device_class": "moisture", + "state_class": "measurement", + "entity_category": null, + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:53:b5:37:5e", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "%" + }, + "state": { + "class_name": "SoilMoisture", + "available": true, + "state": 100.0 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:53:b5:37:5e-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:53:b5:37:5e", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x0000004d", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file diff --git a/tests/data/devices/tze284-cf4b5ktf-ts0601-0x0000004e.json b/tests/data/devices/tze284-cf4b5ktf-ts0601-0x0000004e.json new file mode 100644 index 000000000..396ff04ce --- /dev/null +++ b/tests/data/devices/tze284-cf4b5ktf-ts0601-0x0000004e.json @@ -0,0 +1,266 @@ +{ + "version": 2, + "ieee": "ab:cd:ef:12:2e:63:a1:c0", + "nwk": "0xA413", + "manufacturer": "_TZE284_cf4b5ktf", + "model": "TS0601", + "friendly_manufacturer": "_TZE284_cf4b5ktf", + "friendly_model": "TS0601", + "name": "_TZE284_cf4b5ktf TS0601", + "quirk_applied": false, + "quirk_class": "zigpy.device.Device", + "exposes_features": [], + "manufacturer_code": 4417, + "power_source": "Mains", + "lqi": 132, + "rssi": -67, + "last_seen": "2026-06-23T17:38:39.625589+00:00", + "available": true, + "device_type": "Router", + "active_coordinator": false, + "node_descriptor": { + "logical_type": "Router", + "complex_descriptor_available": false, + "user_descriptor_available": false, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": 260, + "device_type": { + "name": "SMART_PLUG", + "id": 81 + }, + "in_clusters": [ + { + "cluster_id": "0x0000", + "endpoint_attribute": "basic", + "attributes": [ + { + "id": "0x0001", + "name": "app_version", + "zcl_type": "uint8", + "value": 78 + }, + { + "id": "0x0004", + "name": "manufacturer", + "zcl_type": "string", + "value": "_TZE284_cf4b5ktf" + }, + { + "id": "0x0005", + "name": "model", + "zcl_type": "string", + "value": "TS0601" + } + ] + }, + { + "cluster_id": "0x0004", + "endpoint_attribute": "groups", + "attributes": [] + }, + { + "cluster_id": "0x0005", + "endpoint_attribute": "scenes", + "attributes": [] + }, + { + "cluster_id": "0xed00", + "endpoint_attribute": null, + "attributes": [] + }, + { + "cluster_id": "0xef00", + "endpoint_attribute": null, + "attributes": [] + } + ], + "out_clusters": [ + { + "cluster_id": "0x000a", + "endpoint_attribute": "time", + "attributes": [] + }, + { + "cluster_id": "0x0019", + "endpoint_attribute": "ota", + "attributes": [ + { + "id": "0x0002", + "name": "current_file_version", + "zcl_type": "uint32", + "value": 78 + } + ] + } + ] + }, + "242": { + "profile_id": 41440, + "device_type": { + "name": "PROXY_BASIC", + "id": 97 + }, + "in_clusters": [], + "out_clusters": [ + { + "cluster_id": "0x0021", + "endpoint_attribute": "green_power", + "attributes": [] + } + ] + } + }, + "original_signature": { + "manufacturer": "_TZE284_cf4b5ktf", + "model": "TS0601", + "node_desc": { + "logical_type": 1, + "complex_descriptor_available": 0, + "user_descriptor_available": 0, + "reserved": 0, + "aps_flags": 0, + "frequency_band": 8, + "mac_capability_flags": 142, + "manufacturer_code": 4417, + "maximum_buffer_size": 66, + "maximum_incoming_transfer_size": 66, + "server_mask": 10752, + "maximum_outgoing_transfer_size": 66, + "descriptor_capability_field": 0 + }, + "endpoints": { + "1": { + "profile_id": "0x0104", + "device_type": "0x0051", + "input_clusters": [ + "0x0004", + "0x0005", + "0xef00", + "0x0000", + "0xed00" + ], + "output_clusters": [ + "0x0019", + "0x000a" + ] + }, + "242": { + "profile_id": "0xa1e0", + "device_type": "0x0061", + "input_clusters": [], + "output_clusters": [ + "0x0021" + ] + } + } + }, + "zha_lib_entities": { + "sensor": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:2e:63:a1:c0-1-0-lqi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "LQISensor", + "translation_key": "lqi", + "translation_placeholders": null, + "device_class": null, + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:2e:63:a1:c0", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": null + }, + "state": { + "class_name": "LQISensor", + "available": true, + "state": 132 + } + }, + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:2e:63:a1:c0-1-0-rssi", + "migrate_unique_ids": [], + "platform": "sensor", + "class_name": "RSSISensor", + "translation_key": "rssi", + "translation_placeholders": null, + "device_class": "signal_strength", + "state_class": "measurement", + "entity_category": "diagnostic", + "entity_registry_enabled_default": false, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:2e:63:a1:c0", + "endpoint_id": 1, + "available": true, + "group_id": null, + "suggested_display_precision": null, + "unit": "dBm" + }, + "state": { + "class_name": "RSSISensor", + "available": true, + "state": -67 + } + } + ], + "update": [ + { + "info_object": { + "fallback_name": null, + "unique_id": "ab:cd:ef:12:2e:63:a1:c0-1-25-firmware_update", + "migrate_unique_ids": [], + "platform": "update", + "class_name": "FirmwareUpdateEntity", + "translation_key": null, + "translation_placeholders": null, + "device_class": "firmware", + "state_class": null, + "entity_category": "config", + "entity_registry_enabled_default": true, + "enabled": true, + "primary": false, + "device_ieee": "ab:cd:ef:12:2e:63:a1:c0", + "endpoint_id": 1, + "available": true, + "group_id": null, + "supported_features": 7 + }, + "state": { + "class_name": "FirmwareUpdateEntity", + "available": true, + "installed_version": "0x0000004e", + "in_progress": false, + "update_percentage": null, + "latest_version": null, + "release_summary": null, + "release_notes": null, + "release_url": null + } + } + ] + }, + "neighbors": [], + "routes": [] +} \ No newline at end of file From cc23e3b3be043dcb17a4a3cc0f20307ec6bfe6cc Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:21:45 -0400 Subject: [PATCH 06/13] Regenerate diagnostics after merge --- tests/data/devices/bosch-rbsh-trv0-zb-eu-0x38011514.json | 2 +- tests/data/devices/centralite-3326-l-0x1c005310.json | 2 +- tests/data/devices/ewelink-snzb-01p-0x00002200.json | 2 +- tests/data/devices/frient-a-s-kepzb-110-0x0001060a.json | 2 +- tests/data/devices/frient-a-s-smszb-120-0x00040008.json | 2 +- tests/data/devices/gledopto-gl-c-009p-0x17013001.json | 4 ++-- tests/data/devices/gledopto-gl-c-009p-0x25013001.json | 2 +- .../data/devices/ikea-of-sweden-rodret-dimmer-0x01000057.json | 2 +- tests/data/devices/inovelli-vzm30-sn-0x01100100.json | 2 +- .../devices/legrand-light-switch-with-neutral-0x001c4203.json | 2 +- tests/data/devices/lumi-lumi-curtain-acn002-0x00000f20.json | 2 +- tests/data/devices/lumi-lumi-plug-maeu01-0x0000002d.json | 2 +- tests/data/devices/lumi-lumi-remote-cagl02-0x0000001c.json | 2 +- tests/data/devices/lumi-lumi-switch-n0agl1-0x0000001e.json | 2 +- tests/data/devices/philips-rwl020-0x420045b6.json | 2 +- tests/data/devices/philips-sml001-0x43007305.json | 2 +- tests/data/devices/philips-sml001-0x43007401.json | 2 +- .../devices/signify-netherlands-b-v-rdm002-0x02003b13.json | 2 +- .../devices/signify-netherlands-b-v-rdm004-0x02004d23.json | 2 +- .../devices/signify-netherlands-b-v-rwl022-0x02004d27.json | 2 +- tests/data/devices/sonoff-swv-0x00001003.json | 2 +- tests/data/devices/sonoff-trvzb-0x00001400.json | 2 +- tests/data/devices/sonoff-trvzb-0x00001401.json | 2 +- tests/data/devices/third-reality-inc-3rws18bz-0x00000049.json | 2 +- tests/data/devices/tz3000-09gto2zn-ts0013-0x00000050.json | 2 +- tests/data/devices/tz3000-1dd0d5yi-ts130f-0x00000047.json | 2 +- tests/data/devices/tz3210-3ulg9kpo-ts0021-0x00000042.json | 2 +- .../devices/tz3290-7v1k4vufotpowp9z-ts1201-0x00000043.json | 2 +- tests/data/devices/tze200-a7sghmms-ts0601-0x00000048.json | 2 +- tests/data/devices/tze200-nklqjk62-ts0601-0x00000046.json | 2 +- tests/data/devices/tze204-ltwbm23f-ts0601-0x0000004e.json | 2 +- tests/data/devices/tze204-rtrmfadk-ts0601-0x00000049.json | 2 +- tests/data/devices/tze284-aao3yzhs-ts0601-0x0000004d.json | 2 +- 33 files changed, 34 insertions(+), 34 deletions(-) diff --git a/tests/data/devices/bosch-rbsh-trv0-zb-eu-0x38011514.json b/tests/data/devices/bosch-rbsh-trv0-zb-eu-0x38011514.json index a58fc40d4..56eaf445e 100644 --- a/tests/data/devices/bosch-rbsh-trv0-zb-eu-0x38011514.json +++ b/tests/data/devices/bosch-rbsh-trv0-zb-eu-0x38011514.json @@ -8,7 +8,7 @@ "friendly_model": "RBSH-TRV0-ZB-EU", "name": "BOSCH RBSH-TRV0-ZB-EU", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.bosch.rbsh_trv0_zb_eu:(BOSCH / RBSH-TRV0-ZB-EU)", "exposes_features": [], "manufacturer_code": 4617, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/centralite-3326-l-0x1c005310.json b/tests/data/devices/centralite-3326-l-0x1c005310.json index f10883784..8de456146 100644 --- a/tests/data/devices/centralite-3326-l-0x1c005310.json +++ b/tests/data/devices/centralite-3326-l-0x1c005310.json @@ -8,7 +8,7 @@ "friendly_model": "3326-L", "name": "CentraLite 3326-L", "quirk_applied": true, - "quirk_class": "zhaquirks.centralite.motion.CentraLiteMotionSensor", + "quirk_class": "zhaquirks.centralite.motion:CentraLiteMotionSensor", "exposes_features": [], "manufacturer_code": 49887, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/ewelink-snzb-01p-0x00002200.json b/tests/data/devices/ewelink-snzb-01p-0x00002200.json index 2263490ec..e2e88652d 100644 --- a/tests/data/devices/ewelink-snzb-01p-0x00002200.json +++ b/tests/data/devices/ewelink-snzb-01p-0x00002200.json @@ -8,7 +8,7 @@ "friendly_model": "SNZB-01P", "name": "eWeLink SNZB-01P", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.sonoff.button:(eWeLink / WB01)", "exposes_features": [], "manufacturer_code": 4742, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/frient-a-s-kepzb-110-0x0001060a.json b/tests/data/devices/frient-a-s-kepzb-110-0x0001060a.json index 2a80640b4..76904592a 100644 --- a/tests/data/devices/frient-a-s-kepzb-110-0x0001060a.json +++ b/tests/data/devices/frient-a-s-kepzb-110-0x0001060a.json @@ -8,7 +8,7 @@ "friendly_model": "KEPZB-110", "name": "frient A/S KEPZB-110", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.develco.intelligent_keypad:(frient A/S / KEPZB-110)", "exposes_features": [], "manufacturer_code": 4117, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/frient-a-s-smszb-120-0x00040008.json b/tests/data/devices/frient-a-s-smszb-120-0x00040008.json index e1890ccdf..3f407c905 100644 --- a/tests/data/devices/frient-a-s-smszb-120-0x00040008.json +++ b/tests/data/devices/frient-a-s-smszb-120-0x00040008.json @@ -8,7 +8,7 @@ "friendly_model": "SMSZB-120", "name": "frient A/S SMSZB-120", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.develco.smoke_alarm:(frient A/S / SMSZB-120)", "exposes_features": [ "siren_basic" ], diff --git a/tests/data/devices/gledopto-gl-c-009p-0x17013001.json b/tests/data/devices/gledopto-gl-c-009p-0x17013001.json index 8c5301bbd..67000a6cb 100644 --- a/tests/data/devices/gledopto-gl-c-009p-0x17013001.json +++ b/tests/data/devices/gledopto-gl-c-009p-0x17013001.json @@ -7,8 +7,8 @@ "friendly_manufacturer": "GLEDOPTO", "friendly_model": "GL-C-009P", "name": "GLEDOPTO GL-C-009P", - "quirk_applied": false, - "quirk_class": "zigpy.device.Device", + "quirk_applied": true, + "quirk_class": "zhaquirks.gledopto.glc009p:(GLEDOPTO / GL-C-009P)", "exposes_features": [], "manufacturer_code": 4687, "power_source": "Mains", diff --git a/tests/data/devices/gledopto-gl-c-009p-0x25013001.json b/tests/data/devices/gledopto-gl-c-009p-0x25013001.json index 4f4d1faae..30012337a 100644 --- a/tests/data/devices/gledopto-gl-c-009p-0x25013001.json +++ b/tests/data/devices/gledopto-gl-c-009p-0x25013001.json @@ -8,7 +8,7 @@ "friendly_model": "GL-C-009P", "name": "GLEDOPTO GL-C-009P", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.gledopto.glc009p:(GLEDOPTO / GL-C-009P)", "exposes_features": [], "manufacturer_code": 4687, "power_source": "Mains", diff --git a/tests/data/devices/ikea-of-sweden-rodret-dimmer-0x01000057.json b/tests/data/devices/ikea-of-sweden-rodret-dimmer-0x01000057.json index 75cf5d873..ed24009cd 100644 --- a/tests/data/devices/ikea-of-sweden-rodret-dimmer-0x01000057.json +++ b/tests/data/devices/ikea-of-sweden-rodret-dimmer-0x01000057.json @@ -8,7 +8,7 @@ "friendly_model": "RODRET Dimmer", "name": "IKEA of Sweden RODRET Dimmer", "quirk_applied": true, - "quirk_class": "zhaquirks.ikea.twobtnremote.IkeaRodretRemote2BtnNew", + "quirk_class": "zhaquirks.ikea.twobtnremote:IkeaRodretRemote2BtnNew", "exposes_features": [], "manufacturer_code": 4476, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/inovelli-vzm30-sn-0x01100100.json b/tests/data/devices/inovelli-vzm30-sn-0x01100100.json index a6ab18b82..caa7ceec6 100644 --- a/tests/data/devices/inovelli-vzm30-sn-0x01100100.json +++ b/tests/data/devices/inovelli-vzm30-sn-0x01100100.json @@ -8,7 +8,7 @@ "friendly_model": "VZM30-SN", "name": "Inovelli VZM30-SN", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.inovelli.VZM30SN:(Inovelli / VZM30-SN)", "exposes_features": [], "manufacturer_code": 4655, "power_source": "Mains", diff --git a/tests/data/devices/legrand-light-switch-with-neutral-0x001c4203.json b/tests/data/devices/legrand-light-switch-with-neutral-0x001c4203.json index 060ce5d46..4a90c7089 100644 --- a/tests/data/devices/legrand-light-switch-with-neutral-0x001c4203.json +++ b/tests/data/devices/legrand-light-switch-with-neutral-0x001c4203.json @@ -8,7 +8,7 @@ "friendly_model": " Light switch with neutral", "name": " Legrand Light switch with neutral", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.legrand.switch:( Legrand / Light switch with neutral)", "exposes_features": [], "manufacturer_code": 4129, "power_source": "Mains", diff --git a/tests/data/devices/lumi-lumi-curtain-acn002-0x00000f20.json b/tests/data/devices/lumi-lumi-curtain-acn002-0x00000f20.json index d5b608e70..927a26b66 100644 --- a/tests/data/devices/lumi-lumi-curtain-acn002-0x00000f20.json +++ b/tests/data/devices/lumi-lumi-curtain-acn002-0x00000f20.json @@ -8,7 +8,7 @@ "friendly_model": "lumi.curtain.acn002", "name": "LUMI lumi.curtain.acn002", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.xiaomi.aqara.roller_curtain_e1:(LUMI / lumi.curtain.acn002)", "exposes_features": [], "manufacturer_code": 4447, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/lumi-lumi-plug-maeu01-0x0000002d.json b/tests/data/devices/lumi-lumi-plug-maeu01-0x0000002d.json index e4008d991..138268826 100644 --- a/tests/data/devices/lumi-lumi-plug-maeu01-0x0000002d.json +++ b/tests/data/devices/lumi-lumi-plug-maeu01-0x0000002d.json @@ -8,7 +8,7 @@ "friendly_model": "lumi.plug.maeu01", "name": "LUMI lumi.plug.maeu01", "quirk_applied": true, - "quirk_class": "zhaquirks.xiaomi.aqara.plug_eu.PlugMAEU01", + "quirk_class": "zhaquirks.xiaomi.aqara.plug_eu:PlugMAEU01", "exposes_features": [], "manufacturer_code": 4447, "power_source": "Mains", diff --git a/tests/data/devices/lumi-lumi-remote-cagl02-0x0000001c.json b/tests/data/devices/lumi-lumi-remote-cagl02-0x0000001c.json index 404c2cb60..82c933a5d 100644 --- a/tests/data/devices/lumi-lumi-remote-cagl02-0x0000001c.json +++ b/tests/data/devices/lumi-lumi-remote-cagl02-0x0000001c.json @@ -8,7 +8,7 @@ "friendly_model": "lumi.remote.cagl02", "name": "LUMI lumi.remote.cagl02", "quirk_applied": true, - "quirk_class": "zhaquirks.xiaomi.aqara.cube_aqgl01.CubeCAGL02", + "quirk_class": "zhaquirks.xiaomi.aqara.cube_aqgl01:CubeCAGL02", "exposes_features": [], "manufacturer_code": 4447, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/lumi-lumi-switch-n0agl1-0x0000001e.json b/tests/data/devices/lumi-lumi-switch-n0agl1-0x0000001e.json index 8778f930f..dc13b9a23 100644 --- a/tests/data/devices/lumi-lumi-switch-n0agl1-0x0000001e.json +++ b/tests/data/devices/lumi-lumi-switch-n0agl1-0x0000001e.json @@ -8,7 +8,7 @@ "friendly_model": "lumi.switch.n0agl1", "name": "LUMI lumi.switch.n0agl1", "quirk_applied": true, - "quirk_class": "zhaquirks.xiaomi.aqara.switch_t1.SwitchT1Alt3", + "quirk_class": "zhaquirks.xiaomi.aqara.switch_t1:SwitchT1Alt3", "exposes_features": [], "manufacturer_code": 4447, "power_source": "Mains", diff --git a/tests/data/devices/philips-rwl020-0x420045b6.json b/tests/data/devices/philips-rwl020-0x420045b6.json index 82ce3d3c1..2ea543792 100644 --- a/tests/data/devices/philips-rwl020-0x420045b6.json +++ b/tests/data/devices/philips-rwl020-0x420045b6.json @@ -8,7 +8,7 @@ "friendly_model": "RWL020", "name": "Philips RWL020", "quirk_applied": true, - "quirk_class": "zhaquirks.philips.rwlfirstgen.PhilipsRWLFirstGen", + "quirk_class": "zhaquirks.philips.rwlfirstgen:PhilipsRWLFirstGen", "exposes_features": [], "manufacturer_code": 4107, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/philips-sml001-0x43007305.json b/tests/data/devices/philips-sml001-0x43007305.json index fa39c26ba..623829f30 100644 --- a/tests/data/devices/philips-sml001-0x43007305.json +++ b/tests/data/devices/philips-sml001-0x43007305.json @@ -8,7 +8,7 @@ "friendly_model": "SML001", "name": "Philips SML001", "quirk_applied": true, - "quirk_class": "zhaquirks.philips.motion.PhilipsMotion", + "quirk_class": "zhaquirks.philips.motion:PhilipsMotion", "exposes_features": [], "manufacturer_code": 4107, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/philips-sml001-0x43007401.json b/tests/data/devices/philips-sml001-0x43007401.json index b945399ee..b37b2d3be 100644 --- a/tests/data/devices/philips-sml001-0x43007401.json +++ b/tests/data/devices/philips-sml001-0x43007401.json @@ -8,7 +8,7 @@ "friendly_model": "SML001", "name": "Philips SML001", "quirk_applied": true, - "quirk_class": "zhaquirks.philips.motion.PhilipsMotion", + "quirk_class": "zhaquirks.philips.motion:PhilipsMotion", "exposes_features": [], "manufacturer_code": 4107, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/signify-netherlands-b-v-rdm002-0x02003b13.json b/tests/data/devices/signify-netherlands-b-v-rdm002-0x02003b13.json index eb99c6359..1d0b92f47 100644 --- a/tests/data/devices/signify-netherlands-b-v-rdm002-0x02003b13.json +++ b/tests/data/devices/signify-netherlands-b-v-rdm002-0x02003b13.json @@ -8,7 +8,7 @@ "friendly_model": "RDM002", "name": "Signify Netherlands B.V. RDM002", "quirk_applied": true, - "quirk_class": "zhaquirks.philips.rdm002.PhilipsRDM002", + "quirk_class": "zhaquirks.philips.rdm002:PhilipsRDM002", "exposes_features": [], "manufacturer_code": 4107, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/signify-netherlands-b-v-rdm004-0x02004d23.json b/tests/data/devices/signify-netherlands-b-v-rdm004-0x02004d23.json index 348089a88..d2952f272 100644 --- a/tests/data/devices/signify-netherlands-b-v-rdm004-0x02004d23.json +++ b/tests/data/devices/signify-netherlands-b-v-rdm004-0x02004d23.json @@ -8,7 +8,7 @@ "friendly_model": "RDM004", "name": "Signify Netherlands B.V. RDM004", "quirk_applied": true, - "quirk_class": "zhaquirks.philips.wall_switch.PhilipsWallSwitchNewFirmware", + "quirk_class": "zhaquirks.philips.wall_switch:PhilipsWallSwitchNewFirmware", "exposes_features": [], "manufacturer_code": 4107, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/signify-netherlands-b-v-rwl022-0x02004d27.json b/tests/data/devices/signify-netherlands-b-v-rwl022-0x02004d27.json index 62424d918..c530ccc21 100644 --- a/tests/data/devices/signify-netherlands-b-v-rwl022-0x02004d27.json +++ b/tests/data/devices/signify-netherlands-b-v-rwl022-0x02004d27.json @@ -8,7 +8,7 @@ "friendly_model": "RWL022", "name": "Signify Netherlands B.V. RWL022", "quirk_applied": true, - "quirk_class": "zhaquirks.philips.rwl022.PhilipsRWL022", + "quirk_class": "zhaquirks.philips.rwl022:PhilipsRWL022", "exposes_features": [], "manufacturer_code": 4107, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/sonoff-swv-0x00001003.json b/tests/data/devices/sonoff-swv-0x00001003.json index 1478923b0..624ff8f8d 100644 --- a/tests/data/devices/sonoff-swv-0x00001003.json +++ b/tests/data/devices/sonoff-swv-0x00001003.json @@ -8,7 +8,7 @@ "friendly_model": "SWV", "name": "SONOFF SWV", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.sonoff.swv:(SONOFF / SWV)", "exposes_features": [], "manufacturer_code": 4742, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/sonoff-trvzb-0x00001400.json b/tests/data/devices/sonoff-trvzb-0x00001400.json index 6915b6aab..3192c3aa7 100644 --- a/tests/data/devices/sonoff-trvzb-0x00001400.json +++ b/tests/data/devices/sonoff-trvzb-0x00001400.json @@ -8,7 +8,7 @@ "friendly_model": "TRVZB", "name": "SONOFF TRVZB", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.sonoff.trvzb:(SONOFF / TRVZB)", "exposes_features": [], "manufacturer_code": 4742, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/sonoff-trvzb-0x00001401.json b/tests/data/devices/sonoff-trvzb-0x00001401.json index 6d107fdba..ad8e1f688 100644 --- a/tests/data/devices/sonoff-trvzb-0x00001401.json +++ b/tests/data/devices/sonoff-trvzb-0x00001401.json @@ -8,7 +8,7 @@ "friendly_model": "TRVZB", "name": "SONOFF TRVZB", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.sonoff.trvzb:(SONOFF / TRVZB)", "exposes_features": [], "manufacturer_code": 4742, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/third-reality-inc-3rws18bz-0x00000049.json b/tests/data/devices/third-reality-inc-3rws18bz-0x00000049.json index 8978848fa..bfec202f7 100644 --- a/tests/data/devices/third-reality-inc-3rws18bz-0x00000049.json +++ b/tests/data/devices/third-reality-inc-3rws18bz-0x00000049.json @@ -8,7 +8,7 @@ "friendly_model": "3RWS18BZ", "name": "Third Reality, Inc 3RWS18BZ", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.thirdreality.water_leak_sensor:(Third Reality, Inc / 3RWS18BZ)", "exposes_features": [], "manufacturer_code": 4659, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/tz3000-09gto2zn-ts0013-0x00000050.json b/tests/data/devices/tz3000-09gto2zn-ts0013-0x00000050.json index c0e2bba7a..369fa9d0c 100644 --- a/tests/data/devices/tz3000-09gto2zn-ts0013-0x00000050.json +++ b/tests/data/devices/tz3000-09gto2zn-ts0013-0x00000050.json @@ -8,7 +8,7 @@ "friendly_model": "TS0013", "name": "_TZ3000_09gto2zn TS0013", "quirk_applied": true, - "quirk_class": "zhaquirks.tuya.ts001x.TuyaTripleNoNeutralSwitch_2", + "quirk_class": "zhaquirks.tuya.ts001x:TuyaTripleNoNeutralSwitch_2", "exposes_features": [], "manufacturer_code": 4417, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/tz3000-1dd0d5yi-ts130f-0x00000047.json b/tests/data/devices/tz3000-1dd0d5yi-ts130f-0x00000047.json index 3fc115b8c..76ebb6aff 100644 --- a/tests/data/devices/tz3000-1dd0d5yi-ts130f-0x00000047.json +++ b/tests/data/devices/tz3000-1dd0d5yi-ts130f-0x00000047.json @@ -8,7 +8,7 @@ "friendly_model": "TS130F", "name": "_TZ3000_1dd0d5yi TS130F", "quirk_applied": true, - "quirk_class": "zhaquirks.tuya.ts130f.TuyaTS130FTI2", + "quirk_class": "zhaquirks.tuya.ts130f:TuyaTS130FTI2", "exposes_features": [], "manufacturer_code": 4098, "power_source": "Mains", diff --git a/tests/data/devices/tz3210-3ulg9kpo-ts0021-0x00000042.json b/tests/data/devices/tz3210-3ulg9kpo-ts0021-0x00000042.json index d888e3665..8aaf4f31b 100644 --- a/tests/data/devices/tz3210-3ulg9kpo-ts0021-0x00000042.json +++ b/tests/data/devices/tz3210-3ulg9kpo-ts0021-0x00000042.json @@ -8,7 +8,7 @@ "friendly_model": "TS0021", "name": "_TZ3210_3ulg9kpo TS0021", "quirk_applied": true, - "quirk_class": "zhaquirks.tuya.ts0021.TS0021", + "quirk_class": "zhaquirks.tuya.ts0021:TS0021", "exposes_features": [], "manufacturer_code": 4417, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/tz3290-7v1k4vufotpowp9z-ts1201-0x00000043.json b/tests/data/devices/tz3290-7v1k4vufotpowp9z-ts1201-0x00000043.json index 6c4d1642c..2b9c868b9 100644 --- a/tests/data/devices/tz3290-7v1k4vufotpowp9z-ts1201-0x00000043.json +++ b/tests/data/devices/tz3290-7v1k4vufotpowp9z-ts1201-0x00000043.json @@ -8,7 +8,7 @@ "friendly_model": "TS1201", "name": "_TZ3290_7v1k4vufotpowp9z TS1201", "quirk_applied": true, - "quirk_class": "zhaquirks.tuya.ts1201.ZosungIRBlaster_ZS06", + "quirk_class": "zhaquirks.tuya.ts1201:ZosungIRBlaster_ZS06", "exposes_features": [], "manufacturer_code": 4098, "power_source": "Mains", diff --git a/tests/data/devices/tze200-a7sghmms-ts0601-0x00000048.json b/tests/data/devices/tze200-a7sghmms-ts0601-0x00000048.json index 0a80b4211..9333d4def 100644 --- a/tests/data/devices/tze200-a7sghmms-ts0601-0x00000048.json +++ b/tests/data/devices/tze200-a7sghmms-ts0601-0x00000048.json @@ -8,7 +8,7 @@ "friendly_model": "TS0601", "name": "_TZE200_a7sghmms TS0601", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.tuya.builder:(_TZE200_a7sghmms / TS0601)", "exposes_features": [], "manufacturer_code": 4417, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/tze200-nklqjk62-ts0601-0x00000046.json b/tests/data/devices/tze200-nklqjk62-ts0601-0x00000046.json index d339ce570..86b3fdfd4 100644 --- a/tests/data/devices/tze200-nklqjk62-ts0601-0x00000046.json +++ b/tests/data/devices/tze200-nklqjk62-ts0601-0x00000046.json @@ -8,7 +8,7 @@ "friendly_model": "TS0601", "name": "_TZE200_nklqjk62 TS0601", "quirk_applied": true, - "quirk_class": "zhaquirks.tuya.ts0601_garage.TuyaGarageSwitchTO", + "quirk_class": "zhaquirks.tuya.ts0601_garage:TuyaGarageSwitchTO", "exposes_features": [], "manufacturer_code": 4417, "power_source": "Mains", diff --git a/tests/data/devices/tze204-ltwbm23f-ts0601-0x0000004e.json b/tests/data/devices/tze204-ltwbm23f-ts0601-0x0000004e.json index 83a7b75bd..b8405dd5f 100644 --- a/tests/data/devices/tze204-ltwbm23f-ts0601-0x0000004e.json +++ b/tests/data/devices/tze204-ltwbm23f-ts0601-0x0000004e.json @@ -8,7 +8,7 @@ "friendly_model": "TS0601", "name": "_TZE204_ltwbm23f TS0601", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.tuya.builder:(_TZE204_qyr2m29i / TS0601)", "exposes_features": [], "manufacturer_code": 4417, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/tze204-rtrmfadk-ts0601-0x00000049.json b/tests/data/devices/tze204-rtrmfadk-ts0601-0x00000049.json index 5d3e77419..e092f81ac 100644 --- a/tests/data/devices/tze204-rtrmfadk-ts0601-0x00000049.json +++ b/tests/data/devices/tze204-rtrmfadk-ts0601-0x00000049.json @@ -8,7 +8,7 @@ "friendly_model": "TS0601", "name": "_TZE204_rtrmfadk TS0601", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.tuya.builder:(_TZE204_rtrmfadk / TS0601)", "exposes_features": [], "manufacturer_code": 4417, "power_source": "Battery or Unknown", diff --git a/tests/data/devices/tze284-aao3yzhs-ts0601-0x0000004d.json b/tests/data/devices/tze284-aao3yzhs-ts0601-0x0000004d.json index d1ef1400c..aff0fe946 100644 --- a/tests/data/devices/tze284-aao3yzhs-ts0601-0x0000004d.json +++ b/tests/data/devices/tze284-aao3yzhs-ts0601-0x0000004d.json @@ -8,7 +8,7 @@ "friendly_model": "TS0601", "name": "_TZE284_aao3yzhs TS0601", "quirk_applied": true, - "quirk_class": "zigpy.quirks.v2.CustomDeviceV2", + "quirk_class": "zhaquirks.tuya.builder:(_TZE284_aao3yzhs / TS0601)", "exposes_features": [], "manufacturer_code": 4417, "power_source": "Battery or Unknown", From 556501faa7eb95d68195facf040cf4ae374085e2 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:37:15 -0400 Subject: [PATCH 07/13] Fix discovery test filenames --- tests/test_discover.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/test_discover.py b/tests/test_discover.py index 4bb89f653..edd36fb19 100644 --- a/tests/test_discover.py +++ b/tests/test_discover.py @@ -107,7 +107,10 @@ async def test_device_override( async def test_device_override_entities(zha_gateway: Gateway) -> None: """Test device discovery entity changes.""" device_data_text = await asyncio.get_running_loop().run_in_executor( - None, pathlib.Path("tests/data/devices/tz3000-tqlv4ug4-ts0001.json").read_text + None, + pathlib.Path( + "tests/data/devices/tz3000-tqlv4ug4-ts0001-0x00000048.json" + ).read_text, ) device_data = json.loads(device_data_text) @@ -153,7 +156,7 @@ async def test_device_override_picks_highest_priority( # entity should be created, not duplicates from collecting all priority levels. zigpy_device = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/philips-lct014.json", + "tests/data/devices/philips-lct014-0x01001a02.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_device) @@ -915,7 +918,7 @@ async def test_get_diagnostics_json_repeated_calls(zha_gateway: Gateway) -> None """Test that calling get_diagnostics_json twice produces the same result.""" zigpy_device = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/jasco-products-45856.json", + "tests/data/devices/jasco-products-45856-0x00000006.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_device) @@ -932,7 +935,7 @@ async def test_diagnostics_includes_ota_last_query_cmd(zha_gateway: Gateway) -> """Test that diagnostics includes last_query_cmd for OTA clusters.""" zigpy_device = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", ) ota_cluster = zigpy_device.endpoints[1].out_clusters[Ota.cluster_id] @@ -964,7 +967,7 @@ async def test_diagnostics_omits_ota_last_query_cmd_when_none( """Test that diagnostics omits last_query_cmd when it is None.""" zigpy_device = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_device) @@ -983,7 +986,7 @@ async def test_entityless_cluster_binds_via_virtual_entity( """Manufacturer clusters that don't produce entities are still bound.""" zigpy_device = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/signify-netherlands-b-v-rwl022.json", + "tests/data/devices/signify-netherlands-b-v-rwl022-0x02004d27.json", ) # The Philips remote cluster (0xFC00) has no HA entity but `PhilipsRemoteBind` From cd8de55181f8e6a99a5faa3dd707e10540c2cf4a Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:46:51 -0400 Subject: [PATCH 08/13] Fix remaining tests --- tests/test_alarm_control_panel.py | 2 +- tests/test_device.py | 50 +++++++++++++++---------------- tests/test_gateway.py | 6 ++-- tests/test_select.py | 4 +-- tests/test_sensor.py | 10 +++---- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/tests/test_alarm_control_panel.py b/tests/test_alarm_control_panel.py index 4443ffc3c..5192d4460 100644 --- a/tests/test_alarm_control_panel.py +++ b/tests/test_alarm_control_panel.py @@ -29,7 +29,7 @@ async def test_alarm_control_panel( """Test zhaws alarm control panel platform.""" zigpy_device: ZigpyDevice = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/frient-a-s-kepzb-110.json", + "tests/data/devices/frient-a-s-kepzb-110-0x00020005.json", ) zha_device: Device = await join_zigpy_device(zha_gateway, zigpy_device) cluster: security.IasAce = zigpy_device.endpoints[44].out_clusters[ diff --git a/tests/test_device.py b/tests/test_device.py index 9946d978d..8c9703555 100644 --- a/tests/test_device.py +++ b/tests/test_device.py @@ -795,7 +795,7 @@ async def test_device_firmware_version_syncing(zha_gateway: Gateway) -> None: """Test device firmware version syncing.""" zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/philips-sml001.json", + "tests/data/devices/philips-sml001-0x42006bb7.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -846,7 +846,7 @@ async def test_quirks_v2_device_renaming(zha_gateway: Gateway) -> None: zigpy_dev = registry.resolve( await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/centralite-3405-l.json", + "tests/data/devices/centralite-3405-l-0x10025310.json", ) ) @@ -861,7 +861,7 @@ async def test_quirks_v2_device_alerts(zha_gateway: Gateway) -> None: # Normal device, no alerts zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-opal-1000lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-opal-1000lm-0x23094631.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) assert not zha_device.device_alerts @@ -878,7 +878,7 @@ async def test_quirks_v2_device_alerts(zha_gateway: Gateway) -> None: zigpy_dev = registry.resolve( await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/centralite-3405-l.json", + "tests/data/devices/centralite-3405-l-0x10025310.json", ) ) @@ -893,13 +893,13 @@ async def test_quirks_v2_device_alerts(zha_gateway: Gateway) -> None: [ # Light bulb ( - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", Platform.LIGHT, Light, ), # Night light with a bulb and a motion sensor ( - "tests/data/devices/third-reality-inc-3rsnl02043z.json", + "tests/data/devices/third-reality-inc-3rsnl02043z-0x0000003c.json", Platform.LIGHT, Light, ), @@ -911,7 +911,7 @@ async def test_quirks_v2_device_alerts(zha_gateway: Gateway) -> None: ), # Smart plug with energy monitoring ( - "tests/data/devices/innr-sp-234.json", + "tests/data/devices/innr-sp-234-0x31016610.json", Platform.SWITCH, Switch, ), @@ -967,7 +967,7 @@ async def test_quirks_v2_primary_entity(zha_gateway: Gateway) -> None: zigpy_dev = registry.resolve( await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/centralite-3405-l.json", + "tests/data/devices/centralite-3405-l-0x10025310.json", ) ) @@ -996,7 +996,7 @@ async def test_quirks_v2_prevent_default_entities(zha_gateway: Gateway) -> None: zigpy_dev = registry.resolve( await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/centralite-3405-l.json", + "tests/data/devices/centralite-3405-l-0x10025310.json", ) ) @@ -1068,7 +1068,7 @@ def filter_func(entity) -> bool: zigpy_dev = registry.resolve( await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/centralite-3405-l.json", + "tests/data/devices/centralite-3405-l-0x10025310.json", ) ) @@ -1123,7 +1123,7 @@ async def test_quirks_v2_translation_placeholders(zha_gateway: Gateway) -> None: zigpy_dev = registry.resolve( await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/centralite-3405-l.json", + "tests/data/devices/centralite-3405-l-0x10025310.json", ) ) @@ -1154,7 +1154,7 @@ async def test_quirks_v2_exposed_features(zha_gateway: Gateway) -> None: zigpy_dev = registry.resolve( await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/centralite-3405-l.json", + "tests/data/devices/centralite-3405-l-0x10025310.json", ) ) @@ -1262,7 +1262,7 @@ async def test_unquirked_client_cluster_events(zha_gateway: Gateway) -> None: zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/innr-rc-250.json", + "tests/data/devices/innr-rc-250-0x21086500.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1392,7 +1392,7 @@ async def test_somrig_events(zha_gateway: Gateway) -> None: zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-somrig-shortcut-button.json", + "tests/data/devices/ikea-of-sweden-somrig-shortcut-button-0x01000021.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1439,7 +1439,7 @@ async def test_symfonisk_events( zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-symfonisk-sound-remote-gen2.json", + "tests/data/devices/ikea-of-sweden-symfonisk-sound-remote-gen2-0x00010012.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1486,7 +1486,7 @@ async def test_device_on_remove_callback_failure( """Test that device.on_remove continues when callback fails.""" zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/philips-sml001.json", + "tests/data/devices/philips-sml001-0x43007401.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1507,7 +1507,7 @@ async def test_device_on_remove_platform_entity_failure( """Test that device.on_remove continues when platform entity removal fails.""" zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/philips-sml001.json", + "tests/data/devices/philips-sml001-0x43007401.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1528,7 +1528,7 @@ async def test_device_on_remove_pending_entity_failure( """Test that device.on_remove continues when pending entity removal fails.""" zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/philips-sml001.json", + "tests/data/devices/philips-sml001-0x43007401.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1552,7 +1552,7 @@ async def test_initial_entity_discovery_does_not_emit_events( """Test that first device initialization does not emit entity events.""" zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1577,7 +1577,7 @@ async def test_reinitialize_emits_events_for_new_entities( """Test that re-initializing a device emits events for new entities.""" zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1604,7 +1604,7 @@ async def test_reinitialize_after_on_remove_emits_events( """Test that re-init after on_remove (all entities cleared) still emits events.""" zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) entity_count = len(zha_device.platform_entities) @@ -1626,7 +1626,7 @@ async def test_remove_entity_no_event(zha_gateway: Gateway) -> None: """Test that _remove_entity with emit_event=False does not emit.""" zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1643,7 +1643,7 @@ async def test_entity_recomputation(zha_gateway: Gateway) -> None: """Test entity recomputation.""" zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1704,7 +1704,7 @@ async def test_add_entity_duplicate(zha_gateway: Gateway) -> None: """Test that adding a duplicate entity raises an error.""" zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1718,7 +1718,7 @@ async def test_remove_entity_nonexistent(zha_gateway: Gateway) -> None: """Test that removing a nonexistent entity raises an error.""" zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) diff --git a/tests/test_gateway.py b/tests/test_gateway.py index c86b73448..17792ba40 100644 --- a/tests/test_gateway.py +++ b/tests/test_gateway.py @@ -1232,7 +1232,7 @@ async def test_gateway_shutdown_group_on_remove_failure( """Test that gateway shutdown continues when group.on_remove fails.""" zigpy_dev_1 = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", ) zha_device_1 = await join_zigpy_device(zha_gateway, zigpy_dev_1) @@ -1259,11 +1259,11 @@ async def test_group_on_remove_entity_failure( """Test that group.on_remove continues when group entity removal fails.""" zigpy_dev_1 = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-gu10-ws-400lm-0x23095631.json", ) zigpy_dev_2 = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-opal-1000lm.json", + "tests/data/devices/ikea-of-sweden-tradfri-bulb-e26-opal-1000lm-0x23094631.json", ) zha_device_1 = await join_zigpy_device(zha_gateway, zigpy_dev_1) zha_device_2 = await join_zigpy_device(zha_gateway, zigpy_dev_2) diff --git a/tests/test_select.py b/tests/test_select.py index e141f50b3..9e732f244 100644 --- a/tests/test_select.py +++ b/tests/test_select.py @@ -285,7 +285,7 @@ async def test_bega_color_temperature_channel_select(zha_gateway: Gateway) -> No """Test BEGA color temperature channel select entity.""" zigpy_device = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/bega-gantenbrink-leuchten-kg-smart-dimmable-light.json", + "tests/data/devices/bega-gantenbrink-leuchten-kg-smart-dimmable-light-0x00990be9.json", ) cluster = zigpy_device.endpoints[1].in_clusters[general.LevelControl.cluster_id] @@ -351,7 +351,7 @@ async def test_bega_color_temperature_channel_select_unsupported( """Test BEGA select entity is not created when a color temp is 0xFFFF.""" zigpy_device = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/bega-gantenbrink-leuchten-kg-smart-dimmable-light.json", + "tests/data/devices/bega-gantenbrink-leuchten-kg-smart-dimmable-light-0x00990be9.json", ) cluster = zigpy_device.endpoints[1].in_clusters[general.LevelControl.cluster_id] diff --git a/tests/test_sensor.py b/tests/test_sensor.py index 892c74d87..1759f2edd 100644 --- a/tests/test_sensor.py +++ b/tests/test_sensor.py @@ -1937,7 +1937,7 @@ async def test_ignore_non_value(zha_gateway: Gateway) -> None: zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/third-reality-inc-3rsm0147z.json", + "tests/data/devices/third-reality-inc-3rsm0147z-0x0000001f.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -1968,7 +1968,7 @@ async def test_ignore_non_value_quirks_v2(zha_gateway: Gateway) -> None: zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/frient-a-s-aqszb-110.json", + "tests/data/devices/frient-a-s-aqszb-110-0x00040001.json", ) assert isinstance(zigpy_dev, CustomZigpyDevice) @@ -1990,7 +1990,7 @@ async def test_ignore_nan_value(zha_gateway: Gateway) -> None: zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/frient-a-s-scazb-141.json", + "tests/data/devices/frient-a-s-scazb-141-0x00010803.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) @@ -2074,7 +2074,7 @@ async def test_enum_sensor(zha_gateway: Gateway) -> None: registry = DeviceRegistry() zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/centralite-3405-l.json", + "tests/data/devices/centralite-3405-l-0x10025310.json", ) zigpy_dev.endpoints[1].power.update_attribute( @@ -2119,7 +2119,7 @@ async def test_em_poller_runs_independently_of_entity_enabled_state( zigpy_dev = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/ubisys-s1-5501.json", + "tests/data/devices/ubisys-s1-5501-0x02600460.json", ) zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) From 556230a694c97c4eec1e4fa32fe0cf467b666a10 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:51:30 -0400 Subject: [PATCH 09/13] Fix mis-named Espressif device --- tests/test_switch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_switch.py b/tests/test_switch.py index 9c746eb60..a468c2015 100644 --- a/tests/test_switch.py +++ b/tests/test_switch.py @@ -853,7 +853,7 @@ async def test_binary_output_cluster(zha_gateway: Gateway) -> None: zigpy_device = await zigpy_device_from_json( zha_gateway.application_controller, - "tests/data/devices/espressif-zigbeebinaryoutputdevice.json", + "tests/data/devices/espressif-zigbeebinaryanalogdevice.json", ) cluster = zigpy_device.endpoints[1].binary_output zha_device = await join_zigpy_device(zha_gateway, zigpy_device) From a970b32a47f0588ac880ea86607993bdee087bc0 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 15:32:05 -0400 Subject: [PATCH 10/13] Remove accidentally-committed Inovelli test --- tests/test_inovelli.py.bak | 164 ------------------------------------- 1 file changed, 164 deletions(-) delete mode 100644 tests/test_inovelli.py.bak diff --git a/tests/test_inovelli.py.bak b/tests/test_inovelli.py.bak deleted file mode 100644 index 2e8399ffc..000000000 --- a/tests/test_inovelli.py.bak +++ /dev/null @@ -1,164 +0,0 @@ -"""Test Inovelli cluster handler.""" - -from unittest.mock import AsyncMock, patch - -import pytest -from zhaquirks.inovelli.types import AllLEDEffectType - -from tests.common import join_zigpy_device, zigpy_device_from_json -from zha.application.gateway import Gateway -from zha.zigbee.cluster_handlers.const import CLUSTER_HANDLER_INOVELLI - - -async def test_inovelli_all_led_effect_with_string_effect_type( - zha_gateway: Gateway, -) -> None: - """Test that issue_all_led_effect accepts string effect types. - - Regression test for https://github.com/home-assistant/core/issues/159053 - """ - zigpy_dev = await zigpy_device_from_json( - zha_gateway.application_controller, - "tests/data/devices/inovelli-vzm31-sn.json", - ) - zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) - - # Get the Inovelli cluster handler - inovelli_cluster_handler = None - for endpoint in zha_device.endpoints.values(): - for ch in endpoint.all_cluster_handlers.values(): - if ch.name == CLUSTER_HANDLER_INOVELLI: - inovelli_cluster_handler = ch - break - - assert inovelli_cluster_handler is not None - - # Mock at the endpoint level to capture the serialized frame - with patch.object( - inovelli_cluster_handler.cluster.endpoint, - "request", - new_callable=AsyncMock, - ) as mock_request: - # Pass effect_type as a string (like the UI does) - # This should NOT raise ValueError - await inovelli_cluster_handler.issue_all_led_effect( - effect_type="Fast_Falling", - color=200, - level=100, - duration=3, - ) - - # Verify the request was made - assert len(mock_request.mock_calls) == 1 - - # The serialized frame data should contain the correct byte value - # Frame format: [frame_control, mfr_code_lo, mfr_code_hi, seq, cmd_id, effect, color, level, duration] - frame_data = mock_request.mock_calls[0].kwargs["data"] - assert frame_data[5] == 0x0B # Fast_Falling = 11 - assert frame_data[6] == 200 # color - assert frame_data[7] == 100 # level - assert frame_data[8] == 3 # duration - - -async def test_inovelli_individual_led_effect_with_string_effect_type( - zha_gateway: Gateway, -) -> None: - """Test that issue_individual_led_effect accepts string effect types. - - Regression test for https://github.com/home-assistant/core/issues/159053 - """ - zigpy_dev = await zigpy_device_from_json( - zha_gateway.application_controller, - "tests/data/devices/inovelli-vzm31-sn.json", - ) - zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) - - # Get the Inovelli cluster handler - inovelli_cluster_handler = None - for endpoint in zha_device.endpoints.values(): - for ch in endpoint.all_cluster_handlers.values(): - if ch.name == CLUSTER_HANDLER_INOVELLI: - inovelli_cluster_handler = ch - break - - assert inovelli_cluster_handler is not None - - # Mock at the endpoint level to capture the serialized frame - with patch.object( - inovelli_cluster_handler.cluster.endpoint, - "request", - new_callable=AsyncMock, - ) as mock_request: - # Pass effect_type as a string (like the UI does) - # This should NOT raise ValueError - await inovelli_cluster_handler.issue_individual_led_effect( - led_number=1, - effect_type="Solid", - color=200, - level=100, - duration=3, - ) - - # Verify the request was made - assert len(mock_request.mock_calls) == 1 - - # The serialized frame data should contain the correct byte values - # Frame format: [frame_control, mfr_code_lo, mfr_code_hi, seq, cmd_id, led_num, effect, color, level, duration] - frame_data = mock_request.mock_calls[0].kwargs["data"] - assert frame_data[5] == 1 # led_number - assert frame_data[6] == 0x01 # Solid = 1 - assert frame_data[7] == 200 # color - assert frame_data[8] == 100 # level - assert frame_data[9] == 3 # duration - - -@pytest.mark.parametrize( - ("effect_type", "expected_value"), - [ - (AllLEDEffectType.Fast_Falling, 11), # Enum value - (11, 11), # Integer value - ("Fast_Falling", 11), # String value - ], -) -async def test_inovelli_all_led_effect_accepts_various_types( - zha_gateway: Gateway, - effect_type: AllLEDEffectType | int | str, - expected_value: int, -) -> None: - """Test that issue_all_led_effect accepts enum, int, and string effect types.""" - zigpy_dev = await zigpy_device_from_json( - zha_gateway.application_controller, - "tests/data/devices/inovelli-vzm31-sn.json", - ) - zha_device = await join_zigpy_device(zha_gateway, zigpy_dev) - - # Get the Inovelli cluster handler - inovelli_cluster_handler = None - for endpoint in zha_device.endpoints.values(): - for ch in endpoint.all_cluster_handlers.values(): - if ch.name == CLUSTER_HANDLER_INOVELLI: - inovelli_cluster_handler = ch - break - - assert inovelli_cluster_handler is not None - - # Mock at the endpoint level to capture the serialized frame - with patch.object( - inovelli_cluster_handler.cluster.endpoint, - "request", - new_callable=AsyncMock, - ) as mock_request: - # Should not raise ValueError for any of these types - await inovelli_cluster_handler.issue_all_led_effect( - effect_type=effect_type, - color=200, - level=100, - duration=3, - ) - - # Verify the request was made - assert len(mock_request.mock_calls) == 1 - - # All types should result in the same byte value in the serialized frame - frame_data = mock_request.mock_calls[0].kwargs["data"] - assert frame_data[5] == expected_value From b410fcd92f9b4e90c0fb93a00a17ba8bbe765777 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 16:05:11 -0400 Subject: [PATCH 11/13] Log warnings when setting legacy values --- tools/import_diagnostics.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/import_diagnostics.py b/tools/import_diagnostics.py index 4f3a0a9d1..299aa59e0 100644 --- a/tools/import_diagnostics.py +++ b/tools/import_diagnostics.py @@ -224,6 +224,12 @@ def zigpy_device_from_legacy_diagnostics( # noqa: C901 if attr_id_int in real_cluster.attributes: real_cluster._attr_cache[attr_id_int] = parsed else: + _LOGGER.warning( + "Setting legacy value for unknown attribute %s on server cluster %s: %r", + attr_id, + cluster_id, + parsed, + ) real_cluster._attr_cache.set_legacy_value(attr_id_int, parsed) real_cluster.PLUGGED_ATTR_READS[attr_id_int] = parsed for unsupported_attr in cluster["unsupported_attributes"]: @@ -263,6 +269,12 @@ def zigpy_device_from_legacy_diagnostics( # noqa: C901 if attr_id_int in real_cluster.attributes: real_cluster._attr_cache[attr_id_int] = parsed else: + _LOGGER.warning( + "Setting legacy value for unknown attribute %s on client cluster %s: %r", + attr_id, + cluster_id, + parsed, + ) real_cluster._attr_cache.set_legacy_value(attr_id_int, parsed) real_cluster.PLUGGED_ATTR_READS[attr_id_int] = parsed for unsupported_attr in cluster["unsupported_attributes"]: From d5d4d7460f9c0af039d7d1f8c740fe49dabf6dbf Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 16:05:23 -0400 Subject: [PATCH 12/13] Whitespace --- tools/import_diagnostics.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/import_diagnostics.py b/tools/import_diagnostics.py index 299aa59e0..977da7b03 100644 --- a/tools/import_diagnostics.py +++ b/tools/import_diagnostics.py @@ -213,14 +213,17 @@ def zigpy_device_from_legacy_diagnostics( # noqa: C901 if patch_cluster: patch_cluster_for_testing(real_cluster) + for attr_id, attr in cluster["attributes"].items(): if ( attr.get("value") is None or attr_id in cluster["unsupported_attributes"] ): continue + attr_id_int = int(attr_id, 16) parsed = parse_legacy_value(attr["value"]) + if attr_id_int in real_cluster.attributes: real_cluster._attr_cache[attr_id_int] = parsed else: @@ -231,7 +234,9 @@ def zigpy_device_from_legacy_diagnostics( # noqa: C901 parsed, ) real_cluster._attr_cache.set_legacy_value(attr_id_int, parsed) + real_cluster.PLUGGED_ATTR_READS[attr_id_int] = parsed + for unsupported_attr in cluster["unsupported_attributes"]: if isinstance(unsupported_attr, str) and unsupported_attr.startswith( "0x" @@ -258,14 +263,17 @@ def zigpy_device_from_legacy_diagnostics( # noqa: C901 if patch_cluster: patch_cluster_for_testing(real_cluster) + for attr_id, attr in cluster["attributes"].items(): if ( attr.get("value") is None or attr_id in cluster["unsupported_attributes"] ): continue + attr_id_int = int(attr_id, 16) parsed = parse_legacy_value(attr["value"]) + if attr_id_int in real_cluster.attributes: real_cluster._attr_cache[attr_id_int] = parsed else: @@ -276,7 +284,9 @@ def zigpy_device_from_legacy_diagnostics( # noqa: C901 parsed, ) real_cluster._attr_cache.set_legacy_value(attr_id_int, parsed) + real_cluster.PLUGGED_ATTR_READS[attr_id_int] = parsed + for unsupported_attr in cluster["unsupported_attributes"]: if isinstance(unsupported_attr, str) and unsupported_attr.startswith( "0x" From 8bda80b70c4785e0703251e4faba145a7130408e Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 24 Jun 2026 16:05:37 -0400 Subject: [PATCH 13/13] Fail early instead of catching `Exception` --- tools/import_diagnostics.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/import_diagnostics.py b/tools/import_diagnostics.py index 977da7b03..a1197b990 100644 --- a/tools/import_diagnostics.py +++ b/tools/import_diagnostics.py @@ -362,16 +362,21 @@ async def main(paths: list[str]): _LOGGER.debug("Skipping, not valid JSON") continue - try: + if "version" in data and "node_descriptor" in data and "endpoints" in data: + # Directly parse the diagnostics JSON zigpy_device = zigpy_device_from_device_data( app=zha_gateway.application_controller, device_data=data, ) - except Exception: + else: + # Otherwise, try to import one of the many legacy ZHA formats if "home_assistant" not in data: _LOGGER.debug("Skipping, missing 'home_assistant' key") continue + # There is currently just one known "bad" device: a DIY device that + # copies the model and manufacturer strings from an unrelated device. We + # skip it. ha_data = data["home_assistant"].get("data", {}) if ( ha_data.get("last_seen") == "2026-03-04T18:21:39.038488+00:00"