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
694 stars 639 forks source link

Tuya water valve (TS0049 by _TZ3210_0jxeoadc) #2377

Open pcxsam opened 1 year ago

pcxsam commented 1 year ago

Problem description

Please can a handler be created to support a Tuya water valve controller (TS0049). The device can be added to home assistant via zha but no entities are available to control the valve.

Solution description

Creation of a new handler to support the device

Screenshots/Video

Screenshots/Video ![Screenshot 2023-05-04 115003](https://user-images.githubusercontent.com/76849001/236183267-659bc96c-4ac7-44f0-b554-164eda30417e.png)

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=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=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": 260, "device_type": "0x0000", "in_clusters": [ "0x0000", "0xef00" ], "out_clusters": [ "0x000a", "0x0019" ] } }, "manufacturer": "_TZ3210_0jxeoadc", "model": "TS0049", "class": "zigpy.device.Device" } ```

Diagnostic information

Diagnostic information ```json { "home_assistant": { "installation_type": "Home Assistant OS", "version": "2023.4.6", "dev": false, "hassio": true, "virtualenv": false, "python_version": "3.10.10", "docker": true, "arch": "aarch64", "timezone": "Europe/London", "os_name": "Linux", "os_version": "6.1.25", "supervisor": "2023.04.1", "host_os": "Home Assistant OS 10.1", "docker_version": "23.0.3", "chassis": "embedded", "run_as_root": true }, "custom_components": { "fullykiosk": { "version": "1.1.0", "requirements": [ "python-fullykiosk==0.0.11" ] }, "watchman": { "version": "0.5.1", "requirements": [ "prettytable==3.0.0" ] }, "hacs": { "version": "1.32.1", "requirements": [ "aiogithubapi>=22.10.1" ] }, "alexa_media": { "version": "4.6.2", "requirements": [ "alexapy==1.26.5", "packaging>=20.3", "wrapt>=1.12.1" ] }, "platerecognizer": { "version": "1.0.0", "requirements": [ "pillow", "requests" ] }, "webrtc": { "version": "v3.1.0", "requirements": [] }, "govee": { "version": "0.2.2", "requirements": [ "govee-api-laggat==0.2.2", "dacite==1.6.0" ] }, "myenergi": { "version": "0.0.23", "requirements": [ "pymyenergi==0.0.27" ] }, "frigate": { "version": "4.0.0", "requirements": [ "pytz==2022.7" ] }, "tplink_deco": { "version": "3.3.1", "requirements": [ "pycryptodome>=3.12.0" ] }, "solaredge_modbus_multi": { "version": "2.2.14", "requirements": [ "pymodbus>=3.1.1" ] }, "feedparser": { "version": "0.1.7", "requirements": [ "feedparser==6.0.8" ] }, "samsungtv_smart": { "version": "0.11.6", "requirements": [ "websocket-client!=1.4.0,>=0.58.0", "wakeonlan>=2.0.0", "aiofiles>=0.8.0", "casttube>=0.2.1" ] } }, "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" ], "requirements": [ "bellows==0.35.1", "pyserial==3.5", "pyserial-asyncio==0.6", "zha-quirks==0.0.97", "zigpy-deconz==0.20.0", "zigpy==0.54.1", "zigpy-xbee==0.17.0", "zigpy-zigate==0.10.3", "zigpy-znp==0.10.0" ], "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": "_slzb-06._tcp.local.", "name": "slzb-06*" } ], "is_built_in": true }, "data": { "ieee": "**REDACTED**", "nwk": 59523, "manufacturer": "_TZ3210_0jxeoadc", "model": "TS0049", "name": "_TZ3210_0jxeoadc TS0049", "quirk_applied": false, "quirk_class": "zigpy.device.Device", "manufacturer_code": 4417, "power_source": "Battery or Unknown", "lqi": 138, "rssi": null, "last_seen": "2023-05-04T11:53:44", "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=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=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": 260, "device_type": "0x0000", "in_clusters": [ "0x0000", "0xef00" ], "out_clusters": [ "0x000a", "0x0019" ] } } }, "active_coordinator": false, "entities": [], "neighbors": [], "routes": [], "endpoint_names": [ { "name": "ON_OFF_SWITCH" } ], "user_given_name": null, "device_reg_id": "298a89d2209617fae104b31fe9fcf0f8", "area_id": "outside", "cluster_details": { "1": { "device_type": { "name": "ON_OFF_SWITCH", "id": 0 }, "profile_id": 260, "in_clusters": { "0xef00": { "endpoint_attribute": null, "attributes": {}, "unsupported_attributes": {} }, "0x0000": { "endpoint_attribute": "basic", "attributes": { "0x0004": { "attribute_name": "manufacturer", "value": "_TZ3210_0jxeoadc" }, "0x0005": { "attribute_name": "model", "value": "TS0049" } }, "unsupported_attributes": {} } }, "out_clusters": { "0x0019": { "endpoint_attribute": "ota", "attributes": {}, "unsupported_attributes": {} }, "0x000a": { "endpoint_attribute": "time", "attributes": {}, "unsupported_attributes": {} } } } } } } ```
alexuco81 commented 1 month ago

https://github.com/zigpy/zha-device-handlers/issues/2377#issuecomment-2138725256 Same here. Any ideas? Regards.

alexdaszek commented 4 weeks ago

I recently discovered another issue with zha and this valve, sometimes sending the command to turn it on doesn't turn it on. It shows as if it's on but it's not. Physically pressing the button on the valve turns it on if that happens, but this is not a good solution obviously. So what I realized was that if I send the command to turn it on and then off, repeat that a few times, then after a few times it successfully wakes up the device and turning it on succeeds. Anyone else seeing this behavior? I don't know how to "verify" it's really on, I've been seen a zigbee device that's reporting to be on when it's not (I have a few of these valves and I'm seeing this behavior in all of them, so this is not a unique device failure)

I experienced this too from my above issues, I think it just that the device doesn't have a good connection. It would work fine inside my house and be responsive, but when used outside for the garden as intended the signal just isn't good enough, even with boosters as close as I could manage. This is with my coordinator I use for all my Zigbee devices, not the one that came with the device.

moryoav commented 1 week ago

This may be related to connection, but I'm not 100% convinced. I have a few of those devices, Today I noticed it had an LQI of 200 and RSSI of -50dbm, which should be really ok, it's relatively high, shouldn't be problematic at all. I had to switch the valve on and off like 5 times or more until it actually switched on. Now, connectivity issues are possible, definitely ones that are momentary before going back to normal, however, the big issue here is that the zha device reports as "on" when it is not. With other devices this is not the case, if my zha light switch loses connectivity, for example, or has a weak connectivity, then when trying to turn it on, zha will tell me it cannot turn it on. So I'm hoping it's some missing functionality in this quirk, where it doesn't properly report "success" or "failure" after switching it on or off, and zha therefore doesn't know the correct state of the device. I really hope someone who knows something about those quirks will be able to shed some light here. Otherwise I'm going to try switching to zigbee2mqtt to see what the situation over there with these valves.

Edit: Maybe relevant, the guy here says something about "requires Tuya cluster command 0x04 (instead of the usual command 0x00)", see the comment, and I don't see 0x04 in the current quirk, so maybe something is missing?

moryoav commented 1 week ago
  1. I have a slight suspicion that the issues I have with this valve are related to the batteries, I added fresh new batteries to all my valves and will give it a few days to see if things improve.
  2. In any case, I found a really cool solution to know if the valve is really open or not, and if not to just try again. It's using a zigbee vibration sensor placed on top of the valve. I created a detailed writeup about it here: https://smarthome.yoavmor.com/home-assistant/ensuring-zigbee-valve-reliability-with-vibration-sensors-in-home-assistant/