zigpy / zha-device-handlers

ZHA device handlers bridge the functionality gap created when manufacturers deviate from the ZCL specification, handling deviations and exceptions by parsing custom messages to and from Zigbee devices.
Apache License 2.0
696 stars 641 forks source link

Heiman SmokeSensor-EM - yet another HS1SA (only drop wrongly reported IAS WD cluster) #2923

Closed masi closed 6 months ago

masi commented 6 months ago

Problem description

The device Heiman Smoke Sensor HS1SA reported as SmokeSensor-EM shows a IAS WD cluster, but it isn't an intruder alarm system.

The device works properly (smoke is detected and reported) but in the ZHA UI the (configuration) controls don't work.

Solution description

Drop the IAS WD cluster.

Debug Information

Device signature ```json "node_descriptor": "NodeDescriptor(logical_type=, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=, mac_capability_flags=, manufacturer_code=4619, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=0, maximum_outgoing_transfer_size=82, descriptor_capability_field=, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False)", "endpoints": { "1": { "profile_id": "0x0104", "device_type": "0x0402", "input_clusters": [ "0x0000", "0x0001", "0x0003", "0x0500", "0x0502" ], "output_clusters": [ "0x0019" ] } }, "manufacturer": "HEIMAN", "model": "SmokeSensor-EM", "class": "zigpy.device.Device" } ```
Diagnostic information ```json { "home_assistant": { "installation_type": "Home Assistant OS", "version": "2023.10.5", "dev": false, "hassio": true, "virtualenv": false, "python_version": "3.11.5", "docker": true, "arch": "aarch64", "timezone": "Europe/Vienna", "os_name": "Linux", "os_version": "6.1.21-v8", "supervisor": "2023.12.1", "host_os": "Home Assistant OS 11.1", "docker_version": "24.0.6", "chassis": "embedded", "run_as_root": true }, "custom_components": { "versatile_thermostat": { "version": "3.6.0", "requirements": [] }, "watchman": { "version": "0.5.1", "requirements": [ "prettytable==3.0.0" ] }, "alarmo": { "version": "v1.9.13", "requirements": [] }, "hacs": { "version": "1.33.0", "requirements": [ "aiogithubapi>=22.10.1" ] }, "battery_notes": { "version": "1.4.0", "requirements": [] } }, "integration_manifest": { "domain": "zha", "name": "Zigbee Home Automation", "after_dependencies": [ "onboarding", "usb" ], "codeowners": [ "@dmulcahey", "@adminiuga", "@puddly" ], "config_flow": true, "dependencies": [ "file_upload" ], "documentation": "https://www.home-assistant.io/integrations/zha", "iot_class": "local_polling", "loggers": [ "aiosqlite", "bellows", "crccheck", "pure_pcapy3", "zhaquirks", "zigpy", "zigpy_deconz", "zigpy_xbee", "zigpy_zigate", "zigpy_znp", "universal_silabs_flasher" ], "requirements": [ "bellows==0.36.5", "pyserial==3.5", "pyserial-asyncio==0.6", "zha-quirks==0.0.105", "zigpy-deconz==0.21.1", "zigpy==0.57.2", "zigpy-xbee==0.18.3", "zigpy-zigate==0.11.0", "zigpy-znp==0.11.6", "universal-silabs-flasher==0.0.14", "pyserial-asyncio-fast==0.11" ], "usb": [ { "vid": "10C4", "pid": "EA60", "description": "*2652*", "known_devices": [ "slae.sh cc2652rb stick" ] }, { "vid": "1A86", "pid": "55D4", "description": "*sonoff*plus*", "known_devices": [ "sonoff zigbee dongle plus v2" ] }, { "vid": "10C4", "pid": "EA60", "description": "*sonoff*plus*", "known_devices": [ "sonoff zigbee dongle plus" ] }, { "vid": "10C4", "pid": "EA60", "description": "*tubeszb*", "known_devices": [ "TubesZB Coordinator" ] }, { "vid": "1A86", "pid": "7523", "description": "*tubeszb*", "known_devices": [ "TubesZB Coordinator" ] }, { "vid": "1A86", "pid": "7523", "description": "*zigstar*", "known_devices": [ "ZigStar Coordinators" ] }, { "vid": "1CF1", "pid": "0030", "description": "*conbee*", "known_devices": [ "Conbee II" ] }, { "vid": "10C4", "pid": "8A2A", "description": "*zigbee*", "known_devices": [ "Nortek HUSBZB-1" ] }, { "vid": "0403", "pid": "6015", "description": "*zigate*", "known_devices": [ "ZiGate+" ] }, { "vid": "10C4", "pid": "EA60", "description": "*zigate*", "known_devices": [ "ZiGate" ] }, { "vid": "10C4", "pid": "8B34", "description": "*bv 2010/10*", "known_devices": [ "Bitron Video AV2010/10" ] } ], "zeroconf": [ { "type": "_esphomelib._tcp.local.", "name": "tube*" }, { "type": "_zigate-zigbee-gateway._tcp.local.", "name": "*zigate*" }, { "type": "_zigstar_gw._tcp.local.", "name": "*zigstar*" }, { "type": "_uzg-01._tcp.local.", "name": "uzg-01*" }, { "type": "_slzb-06._tcp.local.", "name": "slzb-06*" } ], "is_built_in": true }, "data": { "ieee": "**REDACTED**", "nwk": 3798, "manufacturer": "HEIMAN", "model": "SmokeSensor-EM", "name": "HEIMAN SmokeSensor-EM", "quirk_applied": false, "quirk_class": "zigpy.device.Device", "manufacturer_code": 4619, "power_source": "Battery or Unknown", "lqi": 124, "rssi": -69, "last_seen": "2024-01-19T21:26:46", "available": true, "device_type": "EndDevice", "signature": { "node_descriptor": "NodeDescriptor(logical_type=, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=, mac_capability_flags=, manufacturer_code=4619, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=0, maximum_outgoing_transfer_size=82, descriptor_capability_field=, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False)", "endpoints": { "1": { "profile_id": "0x0104", "device_type": "0x0402", "input_clusters": [ "0x0000", "0x0001", "0x0003", "0x0500", "0x0502" ], "output_clusters": [ "0x0019" ] } }, "manufacturer": "HEIMAN", "model": "SmokeSensor-EM" }, "active_coordinator": false, "entities": [ { "entity_id": "sensor.rauch_heiman_em_1_battery", "name": "HEIMAN SmokeSensor-EM" }, { "entity_id": "select.rauch_heiman_em_1_default_siren_level", "name": "HEIMAN SmokeSensor-EM" }, { "entity_id": "select.rauch_heiman_em_1_default_siren_tone", "name": "HEIMAN SmokeSensor-EM" }, { "entity_id": "select.rauch_heiman_em_1_default_strobe", "name": "HEIMAN SmokeSensor-EM" }, { "entity_id": "select.rauch_heiman_em_1_default_strobe_level", "name": "HEIMAN SmokeSensor-EM" }, { "entity_id": "button.rauch_heiman_em_1_identify", "name": "HEIMAN SmokeSensor-EM" }, { "entity_id": "siren.rauch_heiman_em_1_siren", "name": "HEIMAN SmokeSensor-EM" }, { "entity_id": "binary_sensor.rauch_heiman_em_1_smoke", "name": "HEIMAN SmokeSensor-EM" } ], "neighbors": [], "routes": [], "endpoint_names": [ { "name": "IAS_ZONE" } ], "user_given_name": "Rauch KG - Heiman EM (1)", "device_reg_id": "d42a62ec297058abac94e34b89fac322", "area_id": "keller", "cluster_details": { "1": { "device_type": { "name": "IAS_ZONE", "id": 1026 }, "profile_id": 260, "in_clusters": { "0x0000": { "endpoint_attribute": "basic", "attributes": { "0x0004": { "attribute_name": "manufacturer", "value": "HEIMAN" }, "0x0005": { "attribute_name": "model", "value": "SmokeSensor-EM" } }, "unsupported_attributes": {} }, "0x0001": { "endpoint_attribute": "power", "attributes": { "0x0021": { "attribute_name": "battery_percentage_remaining", "value": 200 }, "0x0020": { "attribute_name": "battery_voltage", "value": 32 } }, "unsupported_attributes": { "0x0031": { "attribute_name": "battery_size" }, "0x0033": { "attribute_name": "battery_quantity" } } }, "0x0003": { "endpoint_attribute": "identify", "attributes": {}, "unsupported_attributes": {} }, "0x0500": { "endpoint_attribute": "ias_zone", "attributes": { "0x0010": { "attribute_name": "cie_addr", "value": [ 184, 163, 90, 254, 255, 192, 130, 240 ] }, "0x0000": { "attribute_name": "zone_state", "value": 1 }, "0x0002": { "attribute_name": "zone_status", "value": 32 }, "0x0001": { "attribute_name": "zone_type", "value": 40 } }, "unsupported_attributes": {} }, "0x0502": { "endpoint_attribute": "ias_wd", "attributes": {}, "unsupported_attributes": {} } }, "out_clusters": { "0x0019": { "endpoint_attribute": "ota", "attributes": {}, "unsupported_attributes": {} } } } } } } ```

Custom Quirk (draft)

Custom quirk ```python class HeimanSmokeEM(CustomDevice): """SmokeEM quirk.""" # NodeDescriptor(logical_type=, complex_descriptor_available=0, user_descriptor_available=0, # reserved=0, aps_flags=0, frequency_band=, # mac_capability_flags=, manufacturer_code=4619, maximum_buffer_size=82, # maximum_incoming_transfer_size=82, server_mask=0, maximum_outgoing_transfer_size=82, # descriptor_capability_field=, *allocate_address=True, # *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, # *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False)", signature = { MODELS_INFO: [("HEIMAN", "SmokeSensor-EM")], ENDPOINTS: { # "profile_id": "0x0104", "device_type": "0x0402", # "input_clusters": ["0x0000", "0x0001", "0x0003", "0x0500", "0x0502"], # "output_clusters": ["0x0019"] 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.IAS_ZONE, INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, Identify.cluster_id, IasZone.cluster_id, IasWd.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, ], }, }, } replacement = { ENDPOINTS: { 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.IAS_ZONE, INPUT_CLUSTERS: [ Basic.cluster_id, PowerConfiguration.cluster_id, Identify.cluster_id, IasZone.cluster_id, ], OUTPUT_CLUSTERS: [ Ota.cluster_id, ], }, }, } ```
TheJulianJES commented 6 months ago

So also just removing the IasWd cluster (like for the other sensors). See:

masi commented 6 months ago

So also just removing the IasWd cluster (like for the other sensors).

That's the idea.

Do you want to create a PR for this or should I PR that change quickly?

I created my quirk by copying the quirk class HeimanSmokeEF30, but that's it. Shouldn't I test the quirk?

Ie copy the imports and my draft an put it there:


zha:
  custom_quirks_path: /config/custom_zha_quirks/
TheJulianJES commented 6 months ago

Ah, yeah. You should be able to copy the full py file with (all) Heiman quirks into that folder, restart HA, and see if it works.