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
737 stars 676 forks source link

ALAB CO2 sensor #2889

Closed frootblaster closed 2 months ago

frootblaster commented 9 months ago

Problem description

Alab CO2 sensor displays incorrect CO2 values @9zigen

Solution description

Display accurate CO2 values

Screenshots/Video

Screenshots/Video ![image](https://github.com/zigpy/zha-device-handlers/assets/127954137/72d4b161-972b-4430-b052-24d796c2b2a3)

Device signature

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=4660, maximum_buffer_size=108, maximum_incoming_transfer_size=1617, server_mask=11264, maximum_outgoing_transfer_size=1617, descriptor_capability_field=, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)", "endpoints": { "1": { "profile_id": "0x0104", "device_type": "0x0302", "input_clusters": [ "0x0000", "0x0001", "0x0003", "0x0402", "0x0405", "0x040d" ], "output_clusters": [] }, "242": { "profile_id": "0xa1e0", "device_type": "0x0061", "input_clusters": [], "output_clusters": [ "0x0021" ] } }, "manufacturer": "Alab", "model": "Alab-CO2-1.1", "class": "zigpy.device.Device" } ```

Diagnostic information

Diagnostic information ```json { "home_assistant": { "installation_type": "Home Assistant OS", "version": "2024.1.2", "dev": false, "hassio": true, "virtualenv": false, "python_version": "3.11.6", "docker": true, "arch": "x86_64", "timezone": "Europe/Stockholm", "os_name": "Linux", "os_version": "6.1.70-haos", "supervisor": "2023.12.0", "host_os": "Home Assistant OS 11.3", "docker_version": "24.0.7", "chassis": "embedded", "run_as_root": true }, "custom_components": { "ngenic": { "version": "2.0.0", "requirements": [ "ngenicpy==0.3.3" ] }, "hacs": { "version": "1.33.0", "requirements": [ "aiogithubapi>=22.10.1" ] }, "easee": { "version": "0.9.55", "requirements": [ "pyeasee==0.7.55" ] }, "nordpool": { "version": "0.0.14", "requirements": [ "nordpool>=0.2", "backoff" ] } }, "integration_manifest": { "domain": "zha", "name": "Zigbee Home Automation", "after_dependencies": [ "onboarding", "usb" ], "codeowners": [ "@dmulcahey", "@adminiuga", "@puddly", "@TheJulianJES" ], "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.37.6", "pyserial==3.5", "pyserial-asyncio==0.6", "zha-quirks==0.0.109", "zigpy-deconz==0.22.4", "zigpy==0.60.4", "zigpy-xbee==0.20.1", "zigpy-zigate==0.12.0", "zigpy-znp==0.12.1", "universal-silabs-flasher==0.0.15", "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": "0403", "pid": "6015", "description": "*conbee*", "known_devices": [ "Conbee III" ] }, { "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": 48996, "manufacturer": "Alab", "model": "Alab-CO2-1.1", "name": "Alab Alab-CO2-1.1", "quirk_applied": false, "quirk_class": "zigpy.device.Device", "quirk_id": null, "manufacturer_code": 4660, "power_source": "Mains", "lqi": 164, "rssi": -59, "last_seen": "2024-01-07T17:55:07", "available": true, "device_type": "Router", "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=4660, maximum_buffer_size=108, maximum_incoming_transfer_size=1617, server_mask=11264, maximum_outgoing_transfer_size=1617, descriptor_capability_field=, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)", "endpoints": { "1": { "profile_id": "0x0104", "device_type": "0x0302", "input_clusters": [ "0x0000", "0x0001", "0x0003", "0x0402", "0x0405", "0x040d" ], "output_clusters": [] }, "242": { "profile_id": "0xa1e0", "device_type": "0x0061", "input_clusters": [], "output_clusters": [ "0x0021" ] } }, "manufacturer": "Alab", "model": "Alab-CO2-1.1" }, "active_coordinator": false, "entities": [ { "entity_id": "button.alab_alab_co2_1_1_identify", "name": "Alab Alab-CO2-1.1" }, { "entity_id": "sensor.alab_alab_co2_1_1_temperature", "name": "Alab Alab-CO2-1.1" }, { "entity_id": "sensor.alab_alab_co2_1_1_carbon_dioxide_concentration", "name": "Alab Alab-CO2-1.1" }, { "entity_id": "sensor.alab_alab_co2_1_1_humidity", "name": "Alab Alab-CO2-1.1" } ], "neighbors": [ { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x14ED", "permit_joining": "NotAccepting", "depth": "1", "lqi": "40" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xBA8E", "permit_joining": "NotAccepting", "depth": "0", "lqi": "72" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x17B8", "permit_joining": "NotAccepting", "depth": "0", "lqi": "116" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xFBD0", "permit_joining": "NotAccepting", "depth": "0", "lqi": "124" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x4D4F", "permit_joining": "NotAccepting", "depth": "0", "lqi": "172" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x7152", "permit_joining": "NotAccepting", "depth": "0", "lqi": "92" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x6EC1", "permit_joining": "NotAccepting", "depth": "0", "lqi": "4" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x7C16", "permit_joining": "NotAccepting", "depth": "0", "lqi": "80" }, { "device_type": "Coordinator", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x0000", "permit_joining": "NotAccepting", "depth": "0", "lqi": "48" } ], "routes": [], "endpoint_names": [ { "name": "TEMPERATURE_SENSOR" }, { "name": "PROXY_BASIC" } ], "user_given_name": "CO2 Sensor (Alab)", "device_reg_id": "f781f738b5b5898ee2269f6ff5bc9421", "area_id": "bedroom", "cluster_details": { "1": { "device_type": { "name": "TEMPERATURE_SENSOR", "id": 770 }, "profile_id": 260, "in_clusters": { "0x0000": { "endpoint_attribute": "basic", "attributes": { "0x0004": { "attribute_name": "manufacturer", "value": "Alab" }, "0x0005": { "attribute_name": "model", "value": "Alab-CO2-1.1" } }, "unsupported_attributes": {} }, "0x0003": { "endpoint_attribute": "identify", "attributes": {}, "unsupported_attributes": {} }, "0x0402": { "endpoint_attribute": "temperature", "attributes": { "0x0000": { "attribute_name": "measured_value", "value": 2010 } }, "unsupported_attributes": {} }, "0x0405": { "endpoint_attribute": "humidity", "attributes": { "0x0000": { "attribute_name": "measured_value", "value": 3592 } }, "unsupported_attributes": {} }, "0x040d": { "endpoint_attribute": "carbon_dioxide_concentration", "attributes": { "0x0000": { "attribute_name": "measured_value", "value": 812.0 } }, "unsupported_attributes": {} }, "0x0001": { "endpoint_attribute": "power", "attributes": { "0x0021": { "attribute_name": "battery_percentage_remaining", "value": 255 }, "0x0020": { "attribute_name": "battery_voltage", "value": 255 } }, "unsupported_attributes": { "0x0031": { "attribute_name": "battery_size" }, "0x0033": { "attribute_name": "battery_quantity" } } } }, "out_clusters": {} }, "242": { "device_type": { "name": "PROXY_BASIC", "id": 97 }, "profile_id": 41440, "in_clusters": {}, "out_clusters": { "0x0021": { "endpoint_attribute": "green_power", "attributes": {}, "unsupported_attributes": {} } } } } } } ```

Logs

Logs ```python [Paste the logs here] ```

Custom quirk

A z2m external converter has been made. https://gist.github.com/9zigen/34a27dd18dc4d4cd09c7b1a3efda8df4 ```python [Paste your custom quirk here] ```

Additional information

https://gist.github.com/9zigen/34a27dd18dc4d4cd09c7b1a3efda8df4

9zigen commented 9 months ago

Use this quirk https://gist.github.com/9zigen/3ec959af5b83722563f09826cef0021e

frootblaster commented 9 months ago

Quirk isn't being applied. Same values showing for CO2 as well.

9zigen commented 9 months ago

Should work. Here's an example. Check your folder path with zha quirks in configuration.yaml:

zha:
  enable_quirks: true
  custom_quirks_path: /config/zha_quirks
Screenshot 2024-01-08 at 18 56 01
frootblaster commented 9 months ago

image quirk_applied is still "false" despite settings: "data": { "ieee": "REDACTED", "nwk": 9857, "manufacturer": "Alab", "model": "Alab-CO2-1.1", "name": "Alab Alab-CO2-1.1", "quirk_applied": false, "quirk_class": "zigpy.device.Device", "quirk_id": null, "manufacturer_code": 4660, "power_source": "Mains", "lqi": 192, "rssi": -52, "last_seen": "2024-01-08T19:18:08", "available": true, "device_type": "Router", "signature": {

9zigen commented 9 months ago

Do you have the core version of home assistant?

Try specifying the absolute path to the folder. I think the problem is that the quirk is not loading.

if you start home assistant from console you should see in the log:

Screenshot 2024-01-08 at 21 13 50
github-actions[bot] commented 3 months ago

There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates. Please make sure to update to the latest version and check if that solves the issue. Let us know if that works for you by adding a comment 👍 This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.