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
747 stars 682 forks source link

[Device Support Request] TS0601 PC321-TY 3-phase Clamp Power Meter #1954

Closed Dogmeat88 closed 1 week ago

Dogmeat88 commented 1 year ago

Hi I would like to request device support for the TS0601 PC321-TY 3-phase Clamp Power Meter - TZE200_nslr42tt https://www.aliexpress.com/item/1005004719888092.html

zigbee2mqtt device support thread : https://github.com/Koenkk/zigbee2mqtt/issues/14790

Thanks.

Device signature ```yaml { "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=4417, maximum_buffer_size=66, maximum_incoming_transfer_size=66, server_mask=10752, maximum_outgoing_transfer_size=66, 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": 260, "device_type": "0x0101", "in_clusters": [ "0x0000", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0xef00" ], "out_clusters": [ "0x000a", "0x0019" ] }, "242": { "profile_id": 41440, "device_type": "0x0061", "in_clusters": [], "out_clusters": [ "0x0021" ] } }, "manufacturer": "_TZE200_nslr42tt", "model": "TS0601", "class": "zigpy.device.Device" } ```
Diagnostic information ```yaml { "home_assistant": { "installation_type": "Home Assistant OS", "version": "2022.11.4", "dev": false, "hassio": true, "virtualenv": false, "python_version": "3.10.7", "docker": true, "arch": "x86_64", "timezone": "Pacific/Auckland", "os_name": "Linux", "os_version": "5.15.74", "supervisor": "2022.10.2", "host_os": "Home Assistant OS 9.3", "docker_version": "20.10.18", "chassis": "embedded", "run_as_root": true }, "custom_components": { "hacs": { "version": "1.28.3", "requirements": [ "aiogithubapi>=22.2.4" ] }, "frigate": { "version": "3.0.0", "requirements": [] }, "zha_toolkit": { "version": "v0.8.23", "requirements": [ "packaging>=20.8" ] } }, "integration_manifest": { "domain": "zha", "name": "Zigbee Home Automation", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/zha", "requirements": [ "bellows==0.34.2", "pyserial==3.5", "pyserial-asyncio==0.6", "zha-quirks==0.0.86", "zigpy-deconz==0.19.0", "zigpy==0.51.5", "zigpy-xbee==0.16.2", "zigpy-zigate==0.10.3", "zigpy-znp==0.9.1" ], "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" ] } ], "codeowners": [ "@dmulcahey", "@adminiuga", "@puddly" ], "zeroconf": [ { "type": "_esphomelib._tcp.local.", "name": "tube*" }, { "type": "_zigate-zigbee-gateway._tcp.local.", "name": "*zigate*" }, { "type": "_zigstar_gw._tcp.local.", "name": "*zigstar*" } ], "dependencies": [ "file_upload" ], "after_dependencies": [ "onboarding", "usb", "zeroconf" ], "iot_class": "local_polling", "loggers": [ "aiosqlite", "bellows", "crccheck", "pure_pcapy3", "zhaquirks", "zigpy", "zigpy_deconz", "zigpy_xbee", "zigpy_zigate", "zigpy_znp" ], "is_built_in": true }, "data": { "ieee": "**REDACTED**", "nwk": 16514, "manufacturer": "_TZE200_nslr42tt", "model": "TS0601", "name": "_TZE200_nslr42tt TS0601", "quirk_applied": false, "quirk_class": "zigpy.device.Device", "manufacturer_code": 4417, "power_source": "Mains", "lqi": 105, "rssi": null, "last_seen": "2022-11-22T18:02:00", "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=4417, maximum_buffer_size=66, maximum_incoming_transfer_size=66, server_mask=10752, maximum_outgoing_transfer_size=66, 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": 260, "device_type": "0x0101", "in_clusters": [ "0x0000", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0xef00" ], "out_clusters": [ "0x000a", "0x0019" ] }, "242": { "profile_id": 41440, "device_type": "0x0061", "in_clusters": [], "out_clusters": [ "0x0021" ] } } }, "active_coordinator": false, "entities": [ { "entity_id": "light.tze200_nslr42tt_ts0601_light", "name": "_TZE200_nslr42tt TS0601" } ], "neighbors": [ { "device_type": "Coordinator", "rx_on_when_idle": "On", "relationship": "Parent", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x0000", "permit_joining": "Unknown", "depth": "0", "lqi": "106" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x2B54", "permit_joining": "Unknown", "depth": "1", "lqi": "27" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xD207", "permit_joining": "Unknown", "depth": "1", "lqi": "9" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x26A8", "permit_joining": "Unknown", "depth": "1", "lqi": "63" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x2088", "permit_joining": "Unknown", "depth": "1", "lqi": "121" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xD656", "permit_joining": "Unknown", "depth": "1", "lqi": "0" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xFC3A", "permit_joining": "Unknown", "depth": "1", "lqi": "27" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x0966", "permit_joining": "Unknown", "depth": "1", "lqi": "15" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x1EBE", "permit_joining": "Unknown", "depth": "1", "lqi": "97" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x95F3", "permit_joining": "Unknown", "depth": "2", "lqi": "63" }, { "device_type": "EndDevice", "rx_on_when_idle": "Off", "relationship": "Child", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xC21B", "permit_joining": "Unknown", "depth": "2", "lqi": "57" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x0EDA", "permit_joining": "Unknown", "depth": "1", "lqi": "75" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x9EE9", "permit_joining": "Unknown", "depth": "1", "lqi": "51" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xD5EE", "permit_joining": "Unknown", "depth": "1", "lqi": "94" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Child", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xECE0", "permit_joining": "Unknown", "depth": "2", "lqi": "51" }, { "device_type": "EndDevice", "rx_on_when_idle": "Off", "relationship": "Child", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xB293", "permit_joining": "Unknown", "depth": "2", "lqi": "130" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x418D", "permit_joining": "Unknown", "depth": "0", "lqi": "0" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xC508", "permit_joining": "Unknown", "depth": "1", "lqi": "103" } ], "endpoint_names": [ { "name": "DIMMABLE_LIGHT" }, { "name": "unknown 97 device_type of 0xa1e0 profile id" } ], "user_given_name": null, "device_reg_id": "2a05393bbfbbb941eb5ac9116cf48eb5", "area_id": "garage", "cluster_details": { "1": { "device_type": { "name": "DIMMABLE_LIGHT", "id": 257 }, "profile_id": 260, "in_clusters": { "0x0004": { "endpoint_attribute": "groups", "attributes": {}, "unsupported_attributes": {} }, "0x0005": { "endpoint_attribute": "scenes", "attributes": {}, "unsupported_attributes": {} }, "0x0006": { "endpoint_attribute": "on_off", "attributes": { "0x0000": { "attribute_name": "on_off", "value": 1 } }, "unsupported_attributes": { "0x4003": { "attribute_name": "start_up_on_off" } } }, "0x0008": { "endpoint_attribute": "level", "attributes": { "0x0000": { "attribute_name": "current_level", "value": 255 } }, "unsupported_attributes": { "0x0012": { "attribute_name": "on_transition_time" }, "0x4000": { "attribute_name": "start_up_current_level" }, "0x0013": { "attribute_name": "off_transition_time" }, "0x0010": { "attribute_name": "on_off_transition_time" }, "0x0014": { "attribute_name": "default_move_rate" }, "0x0011": { "attribute_name": "on_level" } } }, "0x0300": { "endpoint_attribute": "light_color", "attributes": { "0x0000": { "attribute_name": "current_hue", "value": 16 }, "0x0001": { "attribute_name": "current_saturation", "value": 16 }, "0x0003": { "attribute_name": "current_x", "value": 0 }, "0x0004": { "attribute_name": "current_y", "value": 0 }, "0x0007": { "attribute_name": "color_temperature", "value": 0 }, "0x0008": { "attribute_name": "color_mode", "value": 2 } }, "unsupported_attributes": { "0x4000": { "attribute_name": "enhanced_current_hue" }, "0x4002": { "attribute_name": "color_loop_active" }, "0x400b": { "attribute_name": "color_temp_physical_min" }, "0x4010": { "attribute_name": "start_up_color_temperature" }, "0x400a": { "attribute_name": "color_capabilities" }, "0x400c": { "attribute_name": "color_temp_physical_max" } } }, "0xef00": { "endpoint_attribute": null, "attributes": {}, "unsupported_attributes": {} }, "0x0000": { "endpoint_attribute": "basic", "attributes": { "0x0004": { "attribute_name": "manufacturer", "value": "_TZE200_nslr42tt" }, "0x0005": { "attribute_name": "model", "value": "TS0601" } }, "unsupported_attributes": {} } }, "out_clusters": { "0x0019": { "endpoint_attribute": "ota", "attributes": {}, "unsupported_attributes": {} }, "0x000a": { "endpoint_attribute": "time", "attributes": {}, "unsupported_attributes": {} } } }, "242": { "device_type": { "name": "unknown", "id": 97 }, "profile_id": 41440, "in_clusters": {}, "out_clusters": { "0x0021": { "endpoint_attribute": "green_power", "attributes": {}, "unsupported_attributes": {} } } } } } } ```
Dogmeat88 commented 1 year ago

Is there anything I can do to help move this thing along?

Any-berg commented 1 year ago

Please try matseeplus_ts0601.py.txt - just remember to remove the .txt suffix from the filename.

This is still far from perfect. For example, HA seems to only create sensors/entities for phase A attributes, although corresponding phase B and C attributes are available. I had to SKIP_CONFIGURATION, because debug log was flooded with unhandled '_unsupported_attribute_added' events and FOREIGN_KEY constraint failures, and in the end only Power factor entity was added. Current situation looks a bit better:

Clamp

Note that the device does not actually report Apparent power. I could have just hidden that sensor, but instead I calculated it from Active power and Power factor. Instantaneous demand should not be reported, either, but I could not hide it without hiding also Summation delivered. And like I mentioned earlier, there are several attributes for which HA does not create sensors. At least you can read them through device management.

Suheaa commented 11 months ago

matseeplus_ts0601.py.txt - his file works great. Can I get one that works for 3 phases?

mattbyte commented 6 months ago

As a quick and dirty solution, I have created duplicate clusters on different endpoints to get all the data to come through: ts0601_3_phase_energy_meter_edited.zip

It will creates some redundant entities that can be hidden (the meter only provides one frequency for all phases for example). The order of duplicate entries are Total, Phase A, Phase B, Phase C. Only device status is not presented. Might try to use Quirks V2 to improve this at some point.

Suheaa commented 6 months ago

Great. Works! That's enough information. And the excess can be hidden.

github-actions[bot] commented 2 weeks 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.