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
739 stars 675 forks source link

[Device Support Request] Eglo Connect.z Smart Home E27 LED Filament Light Bulb #3404

Open goodlucknow opened 3 days ago

goodlucknow commented 3 days ago

Problem description

This bulb will pair but only partially works. It incorrectly appears as a colour bulb(always blue), and exposes a binary sensor that always shows as closed. Switching off the light entity only dims the bulb it to its lowest brightness, whereas issuing the zigbee command works correctly to switch it off. Also full brightness in the UI only reads as 254 via the levelcontrol attribute. My experiments thus far at creating a quirk are failing miserably.

Solution description

Custom quirk, or help with creating one!

Screenshots/Video

Screenshots/Video Screenshot 2024-10-07 at 17 13 32

Device signature

Device signature ```json { "node_descriptor": { "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": "0x0101", "input_clusters": [ "0x0000", "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x000a", "0x0300", "0x1000", "0xfc57" ], "output_clusters": [ "0x0006" ] }, "3": { "profile_id": "0x128f", "device_type": "0x0101", "input_clusters": [ "0x0004", "0xff50", "0xff51" ], "output_clusters": [ "0xff50", "0xff51" ] }, "242": { "profile_id": "0xa1e0", "device_type": "0x0061", "input_clusters": [], "output_clusters": [ "0x0021" ] } }, "manufacturer": "AwoX", "model": "ESMLFzm_w6_Dimm", "class": "zigpy.device.Device" } ```

Diagnostic information

Diagnostic information ```json { "home_assistant": { "installation_type": "Home Assistant OS", "version": "2024.10.1", "dev": false, "hassio": true, "virtualenv": false, "python_version": "3.12.4", "docker": true, "arch": "aarch64", "timezone": "Europe/Dublin", "os_name": "Linux", "os_version": "6.6.46-haos", "supervisor": "2024.09.1", "host_os": "Home Assistant OS 13.1", "docker_version": "26.1.4", "chassis": "embedded", "run_as_root": true }, "custom_components": { "average": { "documentation": "https://github.com/Limych/ha-average", "version": "2.3.4", "requirements": [] }, "feedparser": { "documentation": "https://github.com/custom-components/feedparser/blob/master/README.md", "version": "0.1.11", "requirements": [ "feedparser==6.0.10" ] }, "apparent_temperature": { "documentation": "https://github.com/Limych/ha-apparent-temperature", "version": "1.1.0", "requirements": [] }, "frigate": { "documentation": "https://github.com/blakeblackshear/frigate", "version": "5.4.0", "requirements": [ "pytz" ] }, "spotcast": { "documentation": "https://github.com/fondberg/spotcast", "version": "v3.8.2", "requirements": [] }, "hacs": { "documentation": "https://hacs.xyz/docs/configuration/start", "version": "2.0.1", "requirements": [ "aiogithubapi>=22.10.1" ] }, "mass": { "documentation": "https://music-assistant.io", "version": "2024.9.1", "requirements": [ "music-assistant==2.2.4" ] }, "cololight": { "documentation": "https://github.com/BazaJayGee66/homeassistant_cololight", "version": "v2.0.7", "requirements": [ "pycololight==2.1.0" ] }, "battery_notes": { "documentation": "https://andrew-codechimp.github.io/HA-Battery-Notes/", "version": "2.4.10", "requirements": [] }, "google_photos": { "documentation": "https://github.com/daanoz/ha-google-photos", "version": "v0.7.0", "requirements": [ "google-api-python-client>=2.71.0", "pillow" ] }, "scene_presets": { "documentation": "https://github.com/Hypfer/hass-scene_presets", "version": "2.2.1", "requirements": [] }, "adaptive_lighting": { "documentation": "https://github.com/basnijholt/adaptive-lighting#readme", "version": "1.22.0", "requirements": [ "ulid-transform" ] }, "temperature_feels_like": { "documentation": "https://github.com/Limych/ha-temperature-feeling", "version": "0.3.9", "requirements": [] }, "thermal_comfort": { "documentation": "https://github.com/dolezsa/thermal_comfort/blob/master/README.md", "version": "2.2.2", "requirements": [] } }, "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", "zha", "universal_silabs_flasher" ], "requirements": [ "universal-silabs-flasher==0.0.22", "zha==0.0.34" ], "usb": [ { "vid": "10C4", "pid": "EA60", "description": "*2652*", "known_devices": [ "slae.sh cc2652rb stick" ] }, { "vid": "10C4", "pid": "EA60", "description": "*slzb-07*", "known_devices": [ "smlight slzb-07" ] }, { "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*" }, { "type": "_xzg._tcp.local.", "name": "xzg*" }, { "type": "_czc._tcp.local.", "name": "czc*" } ], "is_built_in": true }, "setup_times": { "null": { "setup": 0.00022671895567327738 }, "63e7ca8badfbb2711b321aff78e35d98": { "wait_import_platforms": -0.051524004084058106, "wait_base_component": -0.0014281939947977662, "config_entry_setup": 22.306468680966645 } }, "data": { "ieee": "**REDACTED**", "nwk": 20977, "manufacturer": "AwoX", "model": "ESMLFzm_w6_Dimm", "name": "AwoX ESMLFzm_w6_Dimm", "quirk_applied": false, "quirk_class": "zigpy.device.Device", "quirk_id": null, "manufacturer_code": 4417, "power_source": "Mains", "lqi": 98, "rssi": null, "last_seen": "2024-10-07T17:07:49", "available": true, "device_type": "Router", "signature": { "node_descriptor": { "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": "0x0101", "input_clusters": [ "0x0000", "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x000a", "0x0300", "0x1000", "0xfc57" ], "output_clusters": [ "0x0006" ] }, "3": { "profile_id": "0x128f", "device_type": "0x0101", "input_clusters": [ "0x0004", "0xff50", "0xff51" ], "output_clusters": [ "0xff50", "0xff51" ] }, "242": { "profile_id": "0xa1e0", "device_type": "0x0061", "input_clusters": [], "output_clusters": [ "0x0021" ] } }, "manufacturer": "AwoX", "model": "ESMLFzm_w6_Dimm" }, "active_coordinator": false, "entities": [ { "entity_id": "binary_sensor.awox_esmlfzm_w6_dimm_opening", "name": "AwoX ESMLFzm_w6_Dimm" }, { "entity_id": "button.awox_esmlfzm_w6_dimm_identify", "name": "AwoX ESMLFzm_w6_Dimm" }, { "entity_id": "light.awox_esmlfzm_w6_dimm_light", "name": "AwoX ESMLFzm_w6_Dimm" }, { "entity_id": "number.awox_esmlfzm_w6_dimm_start_up_current_level", "name": "AwoX ESMLFzm_w6_Dimm" }, { "entity_id": "select.awox_esmlfzm_w6_dimm_start_up_behavior", "name": "AwoX ESMLFzm_w6_Dimm" } ], "neighbors": [], "routes": [], "endpoint_names": [ { "name": "DIMMABLE_LIGHT" }, { "name": "unknown 257 device_type of 0x128f profile id" }, { "name": "PROXY_BASIC" } ], "user_given_name": null, "device_reg_id": "300634645359e1ebd93633f214ed2324", "area_id": null, "cluster_details": { "1": { "device_type": { "name": "DIMMABLE_LIGHT", "id": 257 }, "profile_id": 260, "in_clusters": { "0x0000": { "endpoint_attribute": "basic", "attributes": { "0x0013": { "attribute": "ZCLAttributeDef(id=0x0013, name='alarm_mask', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0001": { "attribute": "ZCLAttributeDef(id=0x0001, name='app_version', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0xfffd": { "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0006": { "attribute": "ZCLAttributeDef(id=0x0006, name='date_code', type=.LimitedCharString'>, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0012": { "attribute": "ZCLAttributeDef(id=0x0012, name='device_enabled', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0014": { "attribute": "ZCLAttributeDef(id=0x0014, name='disable_local_config', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0008": { "attribute": "ZCLAttributeDef(id=0x0008, name='generic_device_class', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0009": { "attribute": "ZCLAttributeDef(id=0x0009, name='generic_device_type', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0003": { "attribute": "ZCLAttributeDef(id=0x0003, name='hw_version', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0010": { "attribute": "ZCLAttributeDef(id=0x0010, name='location_desc', type=.LimitedCharString'>, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0004": { "attribute": "ZCLAttributeDef(id=0x0004, name='manufacturer', type=.LimitedCharString'>, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": "AwoX" }, "0x000c": { "attribute": "ZCLAttributeDef(id=0x000C, name='manufacturer_version_details', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0005": { "attribute": "ZCLAttributeDef(id=0x0005, name='model', type=.LimitedCharString'>, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": "ESMLFzm_w6_Dimm" }, "0x0011": { "attribute": "ZCLAttributeDef(id=0x0011, name='physical_env', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0007": { "attribute": "ZCLAttributeDef(id=0x0007, name='power_source', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x000a": { "attribute": "ZCLAttributeDef(id=0x000A, name='product_code', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x000e": { "attribute": "ZCLAttributeDef(id=0x000E, name='product_label', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x000b": { "attribute": "ZCLAttributeDef(id=0x000B, name='product_url', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0xfffe": { "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x000d": { "attribute": "ZCLAttributeDef(id=0x000D, name='serial_number', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0002": { "attribute": "ZCLAttributeDef(id=0x0002, name='stack_version', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4000": { "attribute": "ZCLAttributeDef(id=0x4000, name='sw_build_id', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0000": { "attribute": "ZCLAttributeDef(id=0x0000, name='zcl_version', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null } }, "unsupported_attributes": [] }, "0x0003": { "endpoint_attribute": "identify", "attributes": { "0xfffd": { "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0000": { "attribute": "ZCLAttributeDef(id=0x0000, name='identify_time', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0xfffe": { "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null } }, "unsupported_attributes": [] }, "0x0004": { "endpoint_attribute": "groups", "attributes": { "0xfffd": { "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0000": { "attribute": "ZCLAttributeDef(id=0x0000, name='name_support', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0xfffe": { "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null } }, "unsupported_attributes": [] }, "0x0005": { "endpoint_attribute": "scenes", "attributes": { "0xfffd": { "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0000": { "attribute": "ZCLAttributeDef(id=0x0000, name='count', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0002": { "attribute": "ZCLAttributeDef(id=0x0002, name='current_group', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0001": { "attribute": "ZCLAttributeDef(id=0x0001, name='current_scene', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0005": { "attribute": "ZCLAttributeDef(id=0x0005, name='last_configured_by', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0004": { "attribute": "ZCLAttributeDef(id=0x0004, name='name_support', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0xfffe": { "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0003": { "attribute": "ZCLAttributeDef(id=0x0003, name='scene_valid', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null } }, "unsupported_attributes": [] }, "0x0006": { "endpoint_attribute": "on_off", "attributes": { "0xfffd": { "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x4000": { "attribute": "ZCLAttributeDef(id=0x4000, name='global_scene_control', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4002": { "attribute": "ZCLAttributeDef(id=0x4002, name='off_wait_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0000": { "attribute": "ZCLAttributeDef(id=0x0000, name='on_off', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": 1 }, "0x4001": { "attribute": "ZCLAttributeDef(id=0x4001, name='on_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0xfffe": { "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4003": { "attribute": "ZCLAttributeDef(id=0x4003, name='start_up_on_off', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": 1 } }, "unsupported_attributes": [] }, "0x0008": { "endpoint_attribute": "level", "attributes": { "0xfffd": { "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0004": { "attribute": "ZCLAttributeDef(id=0x0004, name='current_frequency', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0000": { "attribute": "ZCLAttributeDef(id=0x0000, name='current_level', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": 254 }, "0x0014": { "attribute": "ZCLAttributeDef(id=0x0014, name='default_move_rate', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0006": { "attribute": "ZCLAttributeDef(id=0x0006, name='max_frequency', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0003": { "attribute": "ZCLAttributeDef(id=0x0003, name='max_level', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0005": { "attribute": "ZCLAttributeDef(id=0x0005, name='min_frequency', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0002": { "attribute": "ZCLAttributeDef(id=0x0002, name='min_level', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0013": { "attribute": "ZCLAttributeDef(id=0x0013, name='off_transition_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0011": { "attribute": "ZCLAttributeDef(id=0x0011, name='on_level', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0010": { "attribute": "ZCLAttributeDef(id=0x0010, name='on_off_transition_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0012": { "attribute": "ZCLAttributeDef(id=0x0012, name='on_transition_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x000f": { "attribute": "ZCLAttributeDef(id=0x000F, name='options', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0001": { "attribute": "ZCLAttributeDef(id=0x0001, name='remaining_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0xfffe": { "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4000": { "attribute": "ZCLAttributeDef(id=0x4000, name='start_up_current_level', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": 255 } }, "unsupported_attributes": [ 3, 16, 17, 18, 19, 20, "default_move_rate", "max_level", "off_transition_time", "on_level", "on_off_transition_time", "on_transition_time" ] }, "0x0300": { "endpoint_attribute": "light_color", "attributes": { "0xfffd": { "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x400a": { "attribute": "ZCLAttributeDef(id=0x400A, name='color_capabilities', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x4002": { "attribute": "ZCLAttributeDef(id=0x4002, name='color_loop_active', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4003": { "attribute": "ZCLAttributeDef(id=0x4003, name='color_loop_direction', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4005": { "attribute": "ZCLAttributeDef(id=0x4005, name='color_loop_start_enhanced_hue', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4006": { "attribute": "ZCLAttributeDef(id=0x4006, name='color_loop_stored_enhanced_hue', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4004": { "attribute": "ZCLAttributeDef(id=0x4004, name='color_loop_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0008": { "attribute": "ZCLAttributeDef(id=0x0008, name='color_mode', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x003c": { "attribute": "ZCLAttributeDef(id=0x003C, name='color_point_b_intensity', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x003a": { "attribute": "ZCLAttributeDef(id=0x003A, name='color_point_b_x', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x003b": { "attribute": "ZCLAttributeDef(id=0x003B, name='color_point_b_y', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0038": { "attribute": "ZCLAttributeDef(id=0x0038, name='color_point_g_intensity', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0036": { "attribute": "ZCLAttributeDef(id=0x0036, name='color_point_g_x', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0037": { "attribute": "ZCLAttributeDef(id=0x0037, name='color_point_g_y', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0034": { "attribute": "ZCLAttributeDef(id=0x0034, name='color_point_r_intensity', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0032": { "attribute": "ZCLAttributeDef(id=0x0032, name='color_point_r_x', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0033": { "attribute": "ZCLAttributeDef(id=0x0033, name='color_point_r_y', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x400c": { "attribute": "ZCLAttributeDef(id=0x400C, name='color_temp_physical_max', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x400b": { "attribute": "ZCLAttributeDef(id=0x400B, name='color_temp_physical_min', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0007": { "attribute": "ZCLAttributeDef(id=0x0007, name='color_temperature', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0006": { "attribute": "ZCLAttributeDef(id=0x0006, name='compensation_text', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x400d": { "attribute": "ZCLAttributeDef(id=0x400D, name='couple_color_temp_to_level_min', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0000": { "attribute": "ZCLAttributeDef(id=0x0000, name='current_hue', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0001": { "attribute": "ZCLAttributeDef(id=0x0001, name='current_saturation', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0003": { "attribute": "ZCLAttributeDef(id=0x0003, name='current_x', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0004": { "attribute": "ZCLAttributeDef(id=0x0004, name='current_y', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0005": { "attribute": "ZCLAttributeDef(id=0x0005, name='drift_compensation', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4001": { "attribute": "ZCLAttributeDef(id=0x4001, name='enhanced_color_mode', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x4000": { "attribute": "ZCLAttributeDef(id=0x4000, name='enhanced_current_hue', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0010": { "attribute": "ZCLAttributeDef(id=0x0010, name='num_primaries', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x000f": { "attribute": "ZCLAttributeDef(id=0x000F, name='options', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0013": { "attribute": "ZCLAttributeDef(id=0x0013, name='primary1_intensity', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0011": { "attribute": "ZCLAttributeDef(id=0x0011, name='primary1_x', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0012": { "attribute": "ZCLAttributeDef(id=0x0012, name='primary1_y', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0017": { "attribute": "ZCLAttributeDef(id=0x0017, name='primary2_intensity', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0015": { "attribute": "ZCLAttributeDef(id=0x0015, name='primary2_x', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0016": { "attribute": "ZCLAttributeDef(id=0x0016, name='primary2_y', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x001b": { "attribute": "ZCLAttributeDef(id=0x001B, name='primary3_intensity', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0019": { "attribute": "ZCLAttributeDef(id=0x0019, name='primary3_x', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x001a": { "attribute": "ZCLAttributeDef(id=0x001A, name='primary3_y', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0022": { "attribute": "ZCLAttributeDef(id=0x0022, name='primary4_intensity', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0020": { "attribute": "ZCLAttributeDef(id=0x0020, name='primary4_x', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0021": { "attribute": "ZCLAttributeDef(id=0x0021, name='primary4_y', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0026": { "attribute": "ZCLAttributeDef(id=0x0026, name='primary5_intensity', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0024": { "attribute": "ZCLAttributeDef(id=0x0024, name='primary5_x', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0025": { "attribute": "ZCLAttributeDef(id=0x0025, name='primary5_y', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x002a": { "attribute": "ZCLAttributeDef(id=0x002A, name='primary6_intensity', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0028": { "attribute": "ZCLAttributeDef(id=0x0028, name='primary6_x', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0029": { "attribute": "ZCLAttributeDef(id=0x0029, name='primary6_y', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0002": { "attribute": "ZCLAttributeDef(id=0x0002, name='remaining_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0xfffe": { "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4010": { "attribute": "ZCLAttributeDef(id=0x4010, name='start_up_color_temperature', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0030": { "attribute": "ZCLAttributeDef(id=0x0030, name='white_point_x', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0031": { "attribute": "ZCLAttributeDef(id=0x0031, name='white_point_y', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null } }, "unsupported_attributes": [ 3, 4, 7, 8, 15, 16386, 16394, 16395, 16396, 16400, "color_capabilities", "color_loop_active", "color_mode", "color_temp_physical_max", "color_temp_physical_min", "color_temperature", "current_x", "current_y", "options", "start_up_color_temperature" ] }, "0x1000": { "endpoint_attribute": "lightlink", "attributes": {}, "unsupported_attributes": [] }, "0xfc57": { "endpoint_attribute": "manufacturer_specific", "attributes": {}, "unsupported_attributes": [] }, "0x000a": { "endpoint_attribute": "time", "attributes": { "0xfffd": { "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0004": { "attribute": "ZCLAttributeDef(id=0x0004, name='dst_end', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0005": { "attribute": "ZCLAttributeDef(id=0x0005, name='dst_shift', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0003": { "attribute": "ZCLAttributeDef(id=0x0003, name='dst_start', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0008": { "attribute": "ZCLAttributeDef(id=0x0008, name='last_set_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0007": { "attribute": "ZCLAttributeDef(id=0x0007, name='local_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0xfffe": { "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0006": { "attribute": "ZCLAttributeDef(id=0x0006, name='standard_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0000": { "attribute": "ZCLAttributeDef(id=0x0000, name='time', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0001": { "attribute": "ZCLAttributeDef(id=0x0001, name='time_status', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0002": { "attribute": "ZCLAttributeDef(id=0x0002, name='time_zone', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0009": { "attribute": "ZCLAttributeDef(id=0x0009, name='valid_until_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null } }, "unsupported_attributes": [] } }, "out_clusters": { "0x0006": { "endpoint_attribute": "on_off", "attributes": { "0xfffd": { "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x4000": { "attribute": "ZCLAttributeDef(id=0x4000, name='global_scene_control', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4002": { "attribute": "ZCLAttributeDef(id=0x4002, name='off_wait_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0000": { "attribute": "ZCLAttributeDef(id=0x0000, name='on_off', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x4001": { "attribute": "ZCLAttributeDef(id=0x4001, name='on_time', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0xfffe": { "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x4003": { "attribute": "ZCLAttributeDef(id=0x4003, name='start_up_on_off', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null } }, "unsupported_attributes": [] } } }, "3": { "device_type": { "name": "unknown", "id": 257 }, "profile_id": 4751, "in_clusters": { "0xff50": { "endpoint_attribute": "manufacturer_specific", "attributes": {}, "unsupported_attributes": [] }, "0xff51": { "endpoint_attribute": "manufacturer_specific", "attributes": {}, "unsupported_attributes": [] }, "0x0004": { "endpoint_attribute": "groups", "attributes": { "0xfffd": { "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0000": { "attribute": "ZCLAttributeDef(id=0x0000, name='name_support', type=, zcl_type=, access=, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0xfffe": { "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=, zcl_type=, access=, mandatory=False, is_manufacturer_specific=False)", "value": null } }, "unsupported_attributes": [] } }, "out_clusters": { "0xff50": { "endpoint_attribute": "manufacturer_specific", "attributes": {}, "unsupported_attributes": [] }, "0xff51": { "endpoint_attribute": "manufacturer_specific", "attributes": {}, "unsupported_attributes": [] } } }, "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

Custom quirk ```python [Paste your custom quirk here] ```

Additional information

No response

goodlucknow commented 2 days ago

I got as far as this with a custom quirk. The light now switches on/off correctly and no longer thinks it does colour, but I've lost dimmer control with it.

Edit: Simply removing LevelControl in replacements achieves correct on/off behaviour without any further custom classes, but obviously no dimming control.

from zigpy.profiles import zha
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.general import (
    Basic,
    Identify,
    Groups,
    Scenes,
    OnOff,
    LevelControl,
    Time,
)
from zigpy.zcl.clusters.lighting import Color
from zhaquirks import CustomCluster, Bus
from zhaquirks.const import (
    DEVICE_TYPE,
    ENDPOINTS,
    INPUT_CLUSTERS,
    OUTPUT_CLUSTERS,
    PROFILE_ID,
)

class AwoXESMLFzmW6Dimm(CustomDevice):
    signature = {
        "models_info": [("AwoX", "ESMLFzm_w6_Dimm")],
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.DIMMABLE_LIGHT,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    Time.cluster_id,
                    Color.cluster_id,
                    0x000A,  # Time cluster
                    0x1000,  # TouchLink cluster
                    0xFC57,  # Unknown AwoX specific cluster
                ],
                OUTPUT_CLUSTERS: [OnOff.cluster_id],
            },
            3: {
                PROFILE_ID: 0x128F,
                DEVICE_TYPE: zha.DeviceType.DIMMABLE_LIGHT,
                INPUT_CLUSTERS: [
                    Groups.cluster_id,
                    0xFF50,  # Unknown AwoX specific cluster
                    0xFF51,  # Unknown AwoX specific cluster
                ],
                OUTPUT_CLUSTERS: [
                    0xFF50,  # Unknown AwoX specific cluster
                    0xFF51,  # Unknown AwoX specific cluster
                ],
            },
            242: {
                PROFILE_ID: 0xA1E0,
                DEVICE_TYPE: 0x0061,
                INPUT_CLUSTERS: [],
                OUTPUT_CLUSTERS: [0x0021],  # Binding cluster
            },
        },
    }

    replacement = {
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.DIMMABLE_LIGHT,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    Time.cluster_id,
                    0x000A,  # Time cluster
                    0x1000,  # TouchLink cluster
                    0xFC57,  # Unknown AwoX specific cluster
                ],
                OUTPUT_CLUSTERS: [OnOff.cluster_id],
            },
        }
    }
goodlucknow commented 1 day ago

I thought I'd update here as I have found a zigbee-herdsman-converter code that someone else wrote for Z2M here. I'm aware they are very different standards but thought it might be of use. I haven't had any progress with the quirk file, probably due to not understanding what I am doing.

const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
const tz = require('zigbee-herdsman-converters/converters/toZigbee');
const exposes = require('zigbee-herdsman-converters/lib/exposes');
const reporting = require('zigbee-herdsman-converters/lib/reporting');
const legacy = require('zigbee-herdsman-converters/lib/legacy');
const extend = require('zigbee-herdsman-converters/lib/extend');
const ota = require('zigbee-herdsman-converters/lib/ota');
const tuya = require('zigbee-herdsman-converters/lib/tuya');
const utils = require('zigbee-herdsman-converters/lib/utils');
const globalStore = require('zigbee-herdsman-converters/lib/store');
const e = exposes.presets;
const ea = exposes.access;

const definition = {
    zigbeeModel: ['ESMLFzm_w6_Dimm'],
    model: 'ESMLFzm_w6_Dimm',
    vendor: 'AwoX',
    description: 'Dimmable filament lamp',
    // Note that fromZigbee, toZigbee and exposes are missing here since we use extend here.
    // Extend contains a default set of fromZigbee/toZigbee converters and expose for common device types.
    // The following extends are available:
    // - extend.switch
    // - extend.light_onoff_brightness
    // - extend.light_onoff_brightness_colortemp
    // - extend.light_onoff_brightness_color
    // - extend.light_onoff_brightness_colortemp_color
    extend: extend.light_onoff_brightness(),
};

module.exports = definition;
goodlucknow commented 1 day ago

I have noticed that while other light bulbs when you issue the zigbee command move_to_level_with_onoff with a value of 255, they still read a value of 254. Whereas this bulb is you set to 255, it reads 255 in the cluster attributes. And with other bulbs, issue the zigbee command move_to_level_with_onoff with a value of 0 and the light switches off, and reads 1 in the cluster attributes. With the Eglo, setting 0 reads as 1 in the cluster attributes, and the light remains on at a very low brightness. I'm not sure if that is indicative of an off-by-one issue or whether the solution lies in directly calling the OnOff command cluster.