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
889 stars 788 forks source link

[Device Support Request] Tuya SmartLife compatible "Smart Water Valve" #1551

Closed wishie closed 2 months ago

wishie commented 2 years ago

Is your feature request related to a problem? Please describe. I have a new Zigbee "Smart Water Valve". It's a battery/solar powered device that connects to an external garden tap. It is sold as a Tuya SmartLife compatible device.

Describe the solution you'd like I would like this device to be supported via ZHA

Device signature - this can be acquired by clicking on the "Zigbee Device Signature" button in the device settings ``` { "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": "0x0051", "in_clusters": [ "0x0000", "0x0004", "0x0005", "0xef00" ], "out_clusters": [ "0x000a", "0x0019" ] } }, "manufacturer": "_TZE200_arge1ptm", "model": "TS0601", "class": "zigpy.device.Device" } ```
Diagnostic information - this can be acquired by clicking on the "Download Diagnostics" button in the device settings ``` { "home_assistant": { "installation_type": "Home Assistant Container", "version": "2022.4.7", "dev": false, "hassio": false, "virtualenv": false, "python_version": "3.9.9", "docker": true, "arch": "x86_64", "timezone": "Australia/Brisbane", "os_name": "Linux", "os_version": "5.10.28-Unraid", "run_as_root": true }, "custom_components": { "unifigateway": { "version": "0.3.3", "requirements": [ "pyunifi==2.21" ] }, "bayislandsguide": { "version": "1.0.0", "requirements": [] }, "iotawatt": { "version": "0.2.1", "requirements": [ "iotawattpy==0.1.0" ] }, "plex_recently_added": { "version": "0.3.8", "requirements": [] }, "fullykiosk": { "version": "1.0.1", "requirements": [ "python-fullykiosk==0.0.11" ] }, "weatherflow": { "version": "1.0.4", "requirements": [ "pyweatherflowrest==1.0.8" ] }, "smartthinq_sensors": { "version": "0.12.12", "requirements": [ "pycountry>=20.7.3", "xmltodict>=0.12.0" ] }, "bureau_of_meteorology": { "version": "1.1.2", "requirements": [] }, "goodwe": { "version": "1.0.0", "requirements": [ "goodwe==0.2.17" ] }, "hacs": { "version": "1.24.5", "requirements": [ "aiogithubapi>=21.11.0" ] }, "spotcast": { "version": "v3.6.29", "requirements": [ "spotify_token==1.0.0" ] }, "sonoff": { "version": "3.0.3", "requirements": [ "pycryptodome>=3.6.6" ] }, "watchman": { "version": "0.5.0", "requirements": [ "prettytable==3.0.0" ] } }, "integration_manifest": { "domain": "zha", "name": "Zigbee Home Automation", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/zha", "requirements": [ "bellows==0.29.0", "pyserial==3.5", "pyserial-asyncio==0.6", "zha-quirks==0.0.72", "zigpy-deconz==0.14.0", "zigpy==0.44.2", "zigpy-xbee==0.14.0", "zigpy-zigate==0.7.4", "zigpy-znp==0.7.0" ], "usb": [ { "vid": "10C4", "pid": "EA60", "description": "*2652*", "known_devices": [ "slae.sh cc2652rb stick" ] }, { "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": "10C4", "pid": "8B34", "description": "*bv 2010/10*", "known_devices": [ "Bitron Video AV2010/10" ] } ], "codeowners": [ "@dmulcahey", "@adminiuga" ], "zeroconf": [ { "type": "_esphomelib._tcp.local.", "name": "tube*" } ], "after_dependencies": [ "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": 45888, "manufacturer": "_TZE200_arge1ptm", "model": "TS0601", "name": "_TZE200_arge1ptm TS0601", "quirk_applied": false, "quirk_class": "zigpy.device.Device", "manufacturer_code": 4417, "power_source": "Battery or Unknown", "lqi": 87, "rssi": null, "last_seen": "2022-05-06T20:18:03", "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": "0x0051", "in_clusters": [ "0x0000", "0x0004", "0x0005", "0xef00" ], "out_clusters": [ "0x000a", "0x0019" ] } } }, "entities": [], "neighbors": [], "endpoint_names": [ { "name": "SMART_PLUG" } ], "user_given_name": null, "device_reg_id": "09f15feed7b6da3de8ba64044d92e581", "area_id": null } } ```
javicalle commented 2 years ago

@tube0013 I'm getting diferents DPs from your Zigbee sniffs:

set_data_response(data=TuyaCommand(status=0, tsn=222, dp=107, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'^\x00\x00\x00', *payload=94)))
set_data_response(data=TuyaCommand(status=0, tsn=220, dp=108, data=TuyaData(dp_type=<TuyaDPType.BOOL: 1>, function=0, raw=b'\x00', *payload=<Bool.false: 0>)))
set_data_response(data=TuyaCommand(status=0, tsn=1, dp=101, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'2\x00\x00\x00', *payload=50)))
set_data_response(data=TuyaCommand(status=0, tsn=2, dp=101, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'(\x00\x00\x00', *payload=40)))
set_data_response(data=TuyaCommand(status=0, tsn=2, dp=101, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'(\x00\x00\x00', *payload=40)))
set_data_response(data=TuyaCommand(status=0, tsn=3, dp=110, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'd\x00\x00\x00', *payload=100)))
set_data_response(data=TuyaCommand(status=0, tsn=4, dp=101, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'\x1e\x00\x00\x00', *payload=30)))
set_data_response(data=TuyaCommand(status=0, tsn=5, dp=101, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'\x14\x00\x00\x00', *payload=20)))
set_data_response(data=TuyaCommand(status=0, tsn=6, dp=101, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'\n\x00\x00\x00', *payload=10)))
set_data_response(data=TuyaCommand(status=0, tsn=7, dp=110, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'd\x00\x00\x00', *payload=100)))
set_data_response(data=TuyaCommand(status=0, tsn=8, dp=2, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'\x00\x00\x00\x00', *payload=0)))
set_data_response(data=TuyaCommand(status=0, tsn=9, dp=101, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'\x00\x00\x00\x00', *payload=0)))
set_data_response(data=TuyaCommand(status=0, tsn=10, dp=107, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'd\x00\x00\x00', *payload=100)))

I believe that a custom quirk would be needed for your device.

Getting DPs from Zigbee snifs is quite slow and laborious, so it would be easier if you could attach the device logs from HA with the debug enabled. It is also necessary to analyze the relationship between the DPs and the functionalities. It is much easier to do if, while manipulating the device, the logs are reviewed and the functionalities of each DP and its range of values are deduced. This will reduce most of the trial and error tests.

javicalle commented 2 years ago

By the way, it seems that Zigbee messaging is set to False with the manufacturer_specific flag. Could you confirm @MattWestb that you see it that way too? (I'm refreshing what I learned in our previous adventure)

wishie commented 2 years ago

I haven't had time to review the Zigbee messaging sniff (I have to look where I have the Wireshark...), but I have a new proposal:

ts0601_valve.py I have fixed the DP3 values. Now the range must be 0-254 (same as dim values) Now the NO_MANUFACTURER_ID is used in Zigbee.

I will try this quirk now.

wishie commented 2 years ago

Turning the switch in HA from 'off' to 'on'

2022-05-16 16:06:56 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event call_service[L]: domain=light, service=turn_on, service_data=entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off>
2022-05-16 16:06:56 DEBUG (MainThread) [homeassistant.components.zha.entity] light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off: turned on: {'on_off': Default_Response(command_id=1, status=<Status.SUCCESS: 0>)}
2022-05-16 16:06:56 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off, old_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=off; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:45.165582+10:00>, new_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=3, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>>

Changing 'brightness' from '0' to '50' in HA

2022-05-16 16:07:45 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event call_service[L]: domain=light, service=turn_on, service_data=entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off, brightness_pct=50>
2022-05-16 16:07:45 DEBUG (MainThread) [homeassistant.components.zha.entity] light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off: turned on: {'move_to_level_with_on_off': Default_Response(command_id=4, status=<Status.SUCCESS: 0>)}
2022-05-16 16:07:45 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off, old_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=3, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>, new_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=128, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>>

Pressing the button on the device itself (from closed to open)

2022-05-16 16:08:23 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off, old_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=128, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>, new_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=51, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>>
2022-05-16 16:08:28 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off, old_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=51, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>, new_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=204, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>>
2022-05-16 16:08:30 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off, old_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=204, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>, new_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=254, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>>

Pressing the button on the device itself (from open to close)

2022-05-16 16:09:06 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off, old_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=254, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>, new_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=204, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>>
2022-05-16 16:09:07 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off, old_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=204, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>, new_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=178, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>>
2022-05-16 16:09:09 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off, old_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=178, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>, new_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=127, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>>
2022-05-16 16:09:10 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off, old_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=127, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>, new_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=102, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>>
2022-05-16 16:09:13 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off, old_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=102, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>, new_state=<state light.tze200_arge1ptm_ts0601_bcc7f40d_level_on_off=on; supported_color_modes=[<ColorMode.BRIGHTNESS: 'brightness'>], color_mode=brightness, brightness=0, off_brightness=None, friendly_name=_TZE200_arge1ptm TS0601 bcc7f40d level, on_off, supported_features=33 @ 2022-05-16T16:06:56.720736+10:00>>

NOTE: The switch and slider in HA do not actually make the device react.

javicalle commented 2 years ago

@wishie the logs from ZHA are needed to understand what can be happening here. Can you enable it and attach the logs with this part also? https://www.home-assistant.io/integrations/zha/#debug-logging

wishie commented 2 years ago

That is tail -f home-assistant.log |grep ts0601 I wasn't including the full ZHA logs and I figured it would be too 'noisy' as I have a lot of devices.

javicalle commented 2 years ago

Ahhhh, I see. Ok, but we also need the zigpy.zcl logs from your device. They look like:

2022-05-10 22:47:00 DEBUG (MainThread) [zigpy.zcl] [0x873E:1:0xef00] tuya_mcu_command: cluster_data=TuyaClusterData(endpoint_id=1, cluster_attr='on_off', attr_value=1, expect_reply=True)

but instead of 0x873E the id that your device has. Would it be possible to include these logs as well?

wishie commented 2 years ago

I will get these now for you.. hold on

wishie commented 2 years ago

Toggling the switch in HA from 'on' to 'off' gives:

2022-05-16 17:29:36 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0x0006] Setting the NO manufacturer id in command: 0
2022-05-16 17:29:36 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0x0006] Sending Tuya Cluster Command... Cluster Command is 0, Arguments are ()
2022-05-16 17:29:36 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] tuya_mcu_command: cluster_data=TuyaClusterData(endpoint_id=1, cluster_attr='on_off', attr_value=0, expect_reply=True, manufacturer=-1)
2022-05-16 17:29:36 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] from_cluster_data: None, None
2022-05-16 17:29:36 WARNING (MainThread) [zigpy.zcl] [0x3148:1:0xef00] No cluster_dp found for 1, on_off
2022-05-16 17:29:36 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] tuya_command: None
2022-05-16 17:29:36 WARNING (MainThread) [zigpy.zcl] [0x3148:1:0xef00] no MCU command for data TuyaClusterData(endpoint_id=1, cluster_attr='on_off', attr_value=0, expect_reply=True, manufacturer=-1)
2022-05-16 17:29:36 DEBUG (MainThread) [homeassistant.components.zha.core.channels.base] [0x3148:1:0x0006]: executed 'off' command with args: '()' kwargs: '{}' result: Default_Response(command_id=0, status=<Status.SUCCESS: 0>)

With device off, changing the slider in HA from '0' to '50' gives:

2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0x0008] Setting the NO manufacturer id in command: 4
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0x0008] Sending Tuya Cluster Command. Cluster Command is 4, Arguments are (128, 1)
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] tuya_mcu_command: cluster_data=TuyaClusterData(endpoint_id=1, cluster_attr='on_off', attr_value=1, expect_reply=True, manufacturer=-1)
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] from_cluster_data: None, None
2022-05-16 17:30:27 WARNING (MainThread) [zigpy.zcl] [0x3148:1:0xef00] No cluster_dp found for 1, on_off
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] tuya_command: None
2022-05-16 17:30:27 WARNING (MainThread) [zigpy.zcl] [0x3148:1:0xef00] no MCU command for data TuyaClusterData(endpoint_id=1, cluster_attr='on_off', attr_value=1, expect_reply=True, manufacturer=-1)
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] tuya_mcu_command: cluster_data=TuyaClusterData(endpoint_id=1, cluster_attr='current_level', attr_value=128, expect_reply=True, manufacturer=-1)
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] get_dp_mapping --> found DP: 3
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] from_cluster_data: 3, DPToAttributeMapping(ep_attribute='level', attribute_name='current_level', dp_type=<TuyaDPType.VALUE: 2>, converter=<function TuyaValveManufCluster.<lambda> at 0x14bc8b82b940>, dp_converter=<function TuyaValveManufCluster.<lambda> at 0x14bc8b82baf0>, endpoint_id=None)
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] converted: 50
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] ztype: 50
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] from_value: [4, 0, 0, 0, 50]
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] raw: b'\x00\x00\x002'
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] tuya_command: TuyaCommand(status=0, tsn=84, dp=3, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'\x00\x00\x002', *payload=838860800))
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=False, is_reply=0, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=85, command_id=0, *is_reply=False)
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] Sending request: set_data(data=TuyaCommand(status=0, tsn=84, dp=3, data=TuyaData(dp_type=<TuyaDPType.VALUE: 2>, function=0, raw=b'\x00\x00\x002', *payload=838860800)))
2022-05-16 17:30:27 DEBUG (MainThread) [homeassistant.components.zha.core.channels.base] [0x3148:1:0x0008]: executed 'move_to_level_with_on_off' command with args: '(128, 1)' kwargs: '{}' result: Default_Response(command_id=4, status=<Status.SUCCESS: 0>)
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.device] [0x3148] Extending timeout for 0x55 request
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy_znp.api] Sending request: AF.DataRequestExt.Req(DstAddrModeAddress=AddrModeAddress(mode=<AddrMode.NWK: 2>, address=0x3148), DstEndpoint=1, DstPanId=0x0000, SrcEndpoint=1, ClusterId=61184, TSN=85, Options=<TransmitOptions.SUPPRESS_ROUTE_DISC_NETWORK|ACK_REQUEST: 48>, Radius=30, Data=b'\x01\x55\x00\x00\x54\x03\x02\x00\x04\x00\x00\x00\x32')
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.IncomingMsg.Callback(GroupId=0x0000, ClusterId=61184, SrcAddr=0x3148, SrcEndpoint=1, DstEndpoint=1, WasBroadcast=<Bool.false: 0>, LQI=84, SecurityUse=<Bool.false: 0>, TimeStamp=8683973, TSN=0, Data=b'\x18\x55\x0B\x00\x00', MacSrcAddr=0x4E2C, MsgResultRadius=28)
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] Received ZCL frame: b'\x18\x55\x0B\x00\x00'
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=85, command_id=11, *is_reply=True)
2022-05-16 17:30:27 DEBUG (MainThread) [zigpy.zcl] [0x3148:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:Default_Response(command_id=0, status=<Status.SUCCESS: 0>)
wishie commented 2 years ago

Is that enough information, or you need something else?

javicalle commented 2 years ago

The logs show that the commands are sent and the device responds with a success(Default_Response(command_id=0, status=<Status.SUCCESS: 0>))

We can try with another version:

ts0601_valve.py ```python """Tuya valve devices.""" import logging from typing import Dict from zigpy.profiles import zha from zigpy.quirks import CustomDevice import zigpy.types as t from zigpy.zcl.clusters.general import ( Basic, Groups, Ota, PowerConfiguration, Scenes, Time, ) from zhaquirks import DoublingPowerConfigurationCluster from zhaquirks.const import ( DEVICE_TYPE, ENDPOINTS, INPUT_CLUSTERS, MODELS_INFO, OUTPUT_CLUSTERS, PROFILE_ID, ) from zhaquirks.tuya.mcu import ( DPToAttributeMapping, TuyaAttributesCluster, TuyaDPType, TuyaLevelControl, TuyaMCUCluster, TuyaOnOff, ) from zhaquirks.tuya.ts0601_dimmer import NoManufacturerCluster, TuyaOnOffNM _LOGGER = logging.getLogger(__name__) class TuyaPowerConfiguration(DoublingPowerConfigurationCluster, TuyaAttributesCluster): """Tuya PowerConfiguration.""" class TuyaLevelControlNM(NoManufacturerCluster, TuyaLevelControl): """Tuya LevelControl cluster with NoManufacturerID.""" class TuyaValveManufCluster(TuyaMCUCluster): """Tuya valve manufacturer cluster.""" attributes = TuyaMCUCluster.attributes.copy() attributes.update( { 0xEF02: ("dp_2", t.uint32_t, True), 0xEF65: ("dp_101", t.uint32_t, True), } ) dp_to_attribute: Dict[int, DPToAttributeMapping] = { 1: DPToAttributeMapping( TuyaOnOffNM.ep_attribute, "on_off", dp_type=TuyaDPType.BOOL, ), 3: DPToAttributeMapping( TuyaMCUCluster.ep_attribute, "dp_2", dp_type=TuyaDPType.VALUE, ), 2: DPToAttributeMapping( TuyaLevelControlNM.ep_attribute, "current_level", dp_type=TuyaDPType.VALUE, converter=lambda x: (x * 255) // 100, dp_converter=lambda x: (x * 100) // 255, ), 101: DPToAttributeMapping( TuyaMCUCluster.ep_attribute, "dp_101", dp_type=TuyaDPType.VALUE, ), # 104: DPToAttributeMapping( # TuyaLevelControl.ep_attribute, # "dp_104", # dp_type=TuyaDPType.BITMAP, # ), 110: DPToAttributeMapping( TuyaPowerConfiguration.ep_attribute, "battery_percentage_remaining", dp_type=TuyaDPType.VALUE, ), } data_point_handlers = { 1: "_dp_2_attr_update", 2: "_dp_2_attr_update", 3: "_dp_2_attr_update", 101: "_dp_2_attr_update", # 104: "_dp_2_attr_update", 110: "_dp_2_attr_update", } class TuyaValve(CustomDevice): """Tuya valve device.""" signature = { MODELS_INFO: [("_TZE200_arge1ptm", "TS0601")], ENDPOINTS: { # 1: { PROFILE_ID: zha.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.SMART_PLUG, INPUT_CLUSTERS: [ Basic.cluster_id, Groups.cluster_id, Scenes.cluster_id, TuyaValveManufCluster.cluster_id, ], OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id], } }, } replacement = { ENDPOINTS: { 1: { DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, INPUT_CLUSTERS: [ Basic.cluster_id, Groups.cluster_id, Scenes.cluster_id, TuyaValveManufCluster, TuyaOnOffNM, TuyaLevelControlNM, TuyaPowerConfiguration, ], OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id], } } } ```

I have switched DP2 and DP3. Enabled DP1 linked to the OnOff switch. Enabled DP110 linked to the PowerConfiguration cluster.

@tube0013 Maybe they are the same device. Can you attach some sniff from a few commands. I'm interested in the on, off and 'dim' ones. It's hard to get from the previous sniffs.

wishie commented 2 years ago

I will try this when I get home later today. Thanks

dedwards66 commented 2 years ago

@javicalle You the man! Changing the level brightness changes the percentage the water valve is open. 100% brightness = fully open and 0 = closed. I will have other log data in a bit.

wishie commented 2 years ago

@javicalle You the man! Changing the level brightness changes the percentage the water valve is open. 100% brightness = fully open and 0 = closed. I will have other log data in a bit.

Does 50% make it half open etc?

tube0013 commented 2 years ago

valve2.pcapng.zip

new sniff, it's filtered to be just the traffic to and from 0xef44 (the valve).

I was interrupted so I may not have the sequence perfect, but I think it is:

On Off 25% 50% 100% (never got there per the app*) Off

The App has a gauge that ticks up or down after you change the opening percentage - not sure if the valve is sending feedback or it's just a visual (likely).

dedwards66 commented 2 years ago

@wishie Yes 50% = value 50% closed. I don't know if that really equates to half water flow.

After about a minute the valve changes to 0% on its own. This is updated on the GUI showing 0% brightness.

dedwards66 commented 2 years ago

@javicalle I tried to get the log of just talking to this device during the time I adjusted the brightness from 0 to 100%. I think it captured it automatically going back to zero after a minute. Sorry if the log data is not right.

``` 2022-05-17 18:45:07 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\t<\x02\x00fn\x02\x00\x04\x00\x00\x00d', 0, 175, 255, 212, 23, 159, 1, -62] 2022-05-17 18:45:07 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\t<\x02\x00fn\x02\x00\x04\x00\x00\x00d' 2022-05-17 18:45:07 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=60, command_id=2, *is_reply=True) 2022-05-17 18:45:07 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=102, dp=110, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:07 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 60): set_data_response(data=TuyaCommand(status=0, tsn=102, dp=110, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:07 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=60, command_id=, *is_reply=True) 2022-05-17 18:45:07 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:07 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'093c0200666e02000400000064' 2022-05-17 18:45:07 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 182, , , 260, 61184, 1, b'\x18<\x0b\x02\x00', , 0) 2022-05-17 18:45:07 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xb6 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:10 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\t=\x02\x00ge\x02\x00\x04\x00\x00\x00\n', 0, 175, 255, 212, 23, 159, 1, -75] 2022-05-17 18:45:10 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\t=\x02\x00ge\x02\x00\x04\x00\x00\x00\n' 2022-05-17 18:45:10 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=61, command_id=2, *is_reply=True) 2022-05-17 18:45:10 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=103, dp=101, data=TuyaData(dp_type=, function=0, raw=b'\n\x00\x00\x00', *payload=10))) 2022-05-17 18:45:10 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 61): set_data_response(data=TuyaCommand(status=0, tsn=103, dp=101, data=TuyaData(dp_type=, function=0, raw=b'\n\x00\x00\x00', *payload=10))) 2022-05-17 18:45:10 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=61, command_id=, *is_reply=True) 2022-05-17 18:45:10 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:10 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'093d020067650200040000000a' 2022-05-17 18:45:10 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 184, , , 260, 61184, 1, b'\x18=\x0b\x02\x00', , 0) 2022-05-17 18:45:10 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xb8 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:20 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\t>\x02\x00h\x02\x02\x00\x04\x00\x00\x00\x00', 0, 175, 255, 225, 23, 159, 1, -72] 2022-05-17 18:45:20 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\t>\x02\x00h\x02\x02\x00\x04\x00\x00\x00\x00' 2022-05-17 18:45:20 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=62, command_id=2, *is_reply=True) 2022-05-17 18:45:20 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=104, dp=2, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:20 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 62): set_data_response(data=TuyaCommand(status=0, tsn=104, dp=2, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:20 DEBUG (MainThread) [homeassistant.components.zha.core.channels.base] [0xC34F:1:0x0008]: received attribute: 0 update with value: 0 2022-05-17 18:45:20 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=62, command_id=, *is_reply=True) 2022-05-17 18:45:20 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:20 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'093e0200680202000400000000' 2022-05-17 18:45:20 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 189, , , 260, 61184, 1, b'\x18>\x0b\x02\x00', , 0) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xbd 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\t?\x02\x00ie\x02\x00\x04\x00\x00\x00\x00', 0, 175, 255, 225, 23, 159, 1, -70] 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\t?\x02\x00ie\x02\x00\x04\x00\x00\x00\x00' 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=63, command_id=2, *is_reply=True) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=105, dp=101, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 63): set_data_response(data=TuyaCommand(status=0, tsn=105, dp=101, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=63, command_id=, *is_reply=True) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'093f0200696502000400000000' 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 190, , , 260, 61184, 1, b'\x18?\x0b\x02\x00', , 0) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xbe 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\t@\x02\x00jk\x02\x00\x04\x00\x00\x00@', 0, 175, 255, 225, 23, 159, 1, -68] 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\t@\x02\x00jk\x02\x00\x04\x00\x00\x00@' 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=64, command_id=2, *is_reply=True) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=106, dp=107, data=TuyaData(dp_type=, function=0, raw=b'@\x00\x00\x00', *payload=64))) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 64): set_data_response(data=TuyaCommand(status=0, tsn=106, dp=107, data=TuyaData(dp_type=, function=0, raw=b'@\x00\x00\x00', *payload=64))) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] No datapoint handler for TuyaCommand(status=0, tsn=106, dp=107, data=TuyaData(dp_type=, function=0, raw=b'@\x00\x00\x00', *payload=64)) 2022-05-17 18:45:21 WARNING (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] No 'handle_set_data_response' tuya handler found for set_data_response(data=TuyaCommand(status=0, tsn=106, dp=107, data=TuyaData(dp_type=, function=0, raw=b'@\x00\x00\x00', *payload=64))) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=64, command_id=, *is_reply=True) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094002006a6b02000400000040' 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 191, , , 260, 61184, 1, b'\x18@\x0b\x02\x81', , 0) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xbf 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tA\x02\x00k\x03\x02\x00\x04\x00\x00\x00d', 0, 175, 255, 225, 23, 159, 1, -66] 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tA\x02\x00k\x03\x02\x00\x04\x00\x00\x00d' 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=65, command_id=2, *is_reply=True) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=107, dp=3, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 65): set_data_response(data=TuyaCommand(status=0, tsn=107, dp=3, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=65, command_id=, *is_reply=True) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094102006b0302000400000064' 2022-05-17 18:45:21 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 192, , , 260, 61184, 1, b'\x18A\x0b\x02\x00', , 0) 2022-05-17 18:45:22 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xc0 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:23 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tB\x02\x00l\x03\x02\x00\x04\x00\x00\x00P', 0, 175, 255, 225, 23, 159, 1, -63] 2022-05-17 18:45:23 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tB\x02\x00l\x03\x02\x00\x04\x00\x00\x00P' 2022-05-17 18:45:23 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=66, command_id=2, *is_reply=True) 2022-05-17 18:45:23 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=108, dp=3, data=TuyaData(dp_type=, function=0, raw=b'P\x00\x00\x00', *payload=80))) 2022-05-17 18:45:23 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 66): set_data_response(data=TuyaCommand(status=0, tsn=108, dp=3, data=TuyaData(dp_type=, function=0, raw=b'P\x00\x00\x00', *payload=80))) 2022-05-17 18:45:23 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=66, command_id=, *is_reply=True) 2022-05-17 18:45:23 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:23 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094202006c0302000400000050' 2022-05-17 18:45:23 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 193, , , 260, 61184, 1, b'\x18B\x0b\x02\x00', , 0) 2022-05-17 18:45:23 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xc1 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:24 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tC\x02\x00m\x03\x02\x00\x04\x00\x00\x00F', 0, 175, 255, 225, 23, 159, 1, -63] 2022-05-17 18:45:24 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tC\x02\x00m\x03\x02\x00\x04\x00\x00\x00F' 2022-05-17 18:45:24 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=67, command_id=2, *is_reply=True) 2022-05-17 18:45:24 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=109, dp=3, data=TuyaData(dp_type=, function=0, raw=b'F\x00\x00\x00', *payload=70))) 2022-05-17 18:45:24 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 67): set_data_response(data=TuyaCommand(status=0, tsn=109, dp=3, data=TuyaData(dp_type=, function=0, raw=b'F\x00\x00\x00', *payload=70))) 2022-05-17 18:45:24 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=67, command_id=, *is_reply=True) 2022-05-17 18:45:24 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:24 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094302006d0302000400000046' 2022-05-17 18:45:24 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 194, , , 260, 61184, 1, b'\x18C\x0b\x02\x00', , 0) 2022-05-17 18:45:24 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xc2 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:26 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tD\x02\x00n\x03\x02\x00\x04\x00\x00\x00(', 0, 175, 255, 225, 23, 159, 1, -62] 2022-05-17 18:45:26 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tD\x02\x00n\x03\x02\x00\x04\x00\x00\x00(' 2022-05-17 18:45:26 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=68, command_id=2, *is_reply=True) 2022-05-17 18:45:26 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=110, dp=3, data=TuyaData(dp_type=, function=0, raw=b'(\x00\x00\x00', *payload=40))) 2022-05-17 18:45:26 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 68): set_data_response(data=TuyaCommand(status=0, tsn=110, dp=3, data=TuyaData(dp_type=, function=0, raw=b'(\x00\x00\x00', *payload=40))) 2022-05-17 18:45:26 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=68, command_id=, *is_reply=True) 2022-05-17 18:45:26 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:26 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094402006e0302000400000028' 2022-05-17 18:45:26 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 196, , , 260, 61184, 1, b'\x18D\x0b\x02\x00', , 0) 2022-05-17 18:45:27 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xc4 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:29 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tE\x02\x00o\x03\x02\x00\x04\x00\x00\x00\n', 0, 175, 255, 225, 23, 159, 1, -55] 2022-05-17 18:45:29 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tE\x02\x00o\x03\x02\x00\x04\x00\x00\x00\n' 2022-05-17 18:45:29 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=69, command_id=2, *is_reply=True) 2022-05-17 18:45:29 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=111, dp=3, data=TuyaData(dp_type=, function=0, raw=b'\n\x00\x00\x00', *payload=10))) 2022-05-17 18:45:29 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 69): set_data_response(data=TuyaCommand(status=0, tsn=111, dp=3, data=TuyaData(dp_type=, function=0, raw=b'\n\x00\x00\x00', *payload=10))) 2022-05-17 18:45:29 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=69, command_id=, *is_reply=True) 2022-05-17 18:45:29 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:29 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094502006f030200040000000a' 2022-05-17 18:45:29 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 197, , , 260, 61184, 1, b'\x18E\x0b\x02\x00', , 0) 2022-05-17 18:45:29 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xc5 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tF\x02\x00p\x03\x02\x00\x04\x00\x00\x00\x00', 0, 175, 255, 246, 23, 159, 1, -58] 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tF\x02\x00p\x03\x02\x00\x04\x00\x00\x00\x00' 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=70, command_id=2, *is_reply=True) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=112, dp=3, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 70): set_data_response(data=TuyaCommand(status=0, tsn=112, dp=3, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=70, command_id=, *is_reply=True) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'09460200700302000400000000' 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 198, , , 260, 61184, 1, b'\x18F\x0b\x02\x00', , 0) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xc6 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tG\x02\x00q\x02\x02\x00\x04\x00\x00\x00\x00', 0, 175, 255, 246, 23, 159, 1, -52] 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tG\x02\x00q\x02\x02\x00\x04\x00\x00\x00\x00' 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=71, command_id=2, *is_reply=True) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=113, dp=2, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 71): set_data_response(data=TuyaCommand(status=0, tsn=113, dp=2, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:30 DEBUG (MainThread) [homeassistant.components.zha.core.channels.base] [0xC34F:1:0x0008]: received attribute: 0 update with value: 0 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=71, command_id=, *is_reply=True) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'09470200710202000400000000' 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 199, , , 260, 61184, 1, b'\x18G\x0b\x02\x00', , 0) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xc7 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tH\x02\x00re\x02\x00\x04\x00\x00\x00\x00', 0, 175, 255, 246, 23, 159, 1, -51] 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tH\x02\x00re\x02\x00\x04\x00\x00\x00\x00' 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=72, command_id=2, *is_reply=True) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=114, dp=101, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 72): set_data_response(data=TuyaCommand(status=0, tsn=114, dp=101, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=72, command_id=, *is_reply=True) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'09480200726502000400000000' 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 200, , , 260, 61184, 1, b'\x18H\x0b\x02\x00', , 0) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xc8 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [33, , , 1, , 1, 260, 61184, b'\tI\x02\x00sh\x05\x00\x01\x00', 0, 175, 255, 246, 23, 159, 1, -52] 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tI\x02\x00sh\x05\x00\x01\x00' 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=73, command_id=2, *is_reply=True) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=115, dp=104, data=TuyaData(dp_type=, function=0, raw=b'\x00', *payload=))) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 73): set_data_response(data=TuyaCommand(status=0, tsn=115, dp=104, data=TuyaData(dp_type=, function=0, raw=b'\x00', *payload=))) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] No datapoint handler for TuyaCommand(status=0, tsn=115, dp=104, data=TuyaData(dp_type=, function=0, raw=b'\x00', *payload=)) 2022-05-17 18:45:30 WARNING (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] No 'handle_set_data_response' tuya handler found for set_data_response(data=TuyaCommand(status=0, tsn=115, dp=104, data=TuyaData(dp_type=, function=0, raw=b'\x00', *payload=))) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=73, command_id=, *is_reply=True) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'09490200736805000100' 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 201, , , 260, 61184, 1, b'\x18I\x0b\x02\x81', , 0) 2022-05-17 18:45:30 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xc9 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:36 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tJ\x02\x00t\x02\x02\x00\x04\x00\x00\x00d', 0, 175, 255, 246, 23, 159, 1, -71] 2022-05-17 18:45:36 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tJ\x02\x00t\x02\x02\x00\x04\x00\x00\x00d' 2022-05-17 18:45:36 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=74, command_id=2, *is_reply=True) 2022-05-17 18:45:36 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=116, dp=2, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:36 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 74): set_data_response(data=TuyaCommand(status=0, tsn=116, dp=2, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:36 DEBUG (MainThread) [homeassistant.components.zha.core.channels.base] [0xC34F:1:0x0008]: received attribute: 0 update with value: 255 2022-05-17 18:45:36 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=74, command_id=, *is_reply=True) 2022-05-17 18:45:36 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:36 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094a0200740202000400000064' 2022-05-17 18:45:36 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 203, , , 260, 61184, 1, b'\x18J\x0b\x02\x00', , 0) 2022-05-17 18:45:36 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xcb 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:37 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tK\x02\x00u\x03\x02\x00\x04\x00\x00\x00\x00', 0, 175, 255, 246, 23, 159, 1, -64] 2022-05-17 18:45:37 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tK\x02\x00u\x03\x02\x00\x04\x00\x00\x00\x00' 2022-05-17 18:45:37 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=75, command_id=2, *is_reply=True) 2022-05-17 18:45:37 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=117, dp=3, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:37 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 75): set_data_response(data=TuyaCommand(status=0, tsn=117, dp=3, data=TuyaData(dp_type=, function=0, raw=b'\x00\x00\x00\x00', *payload=0))) 2022-05-17 18:45:37 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=75, command_id=, *is_reply=True) 2022-05-17 18:45:37 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:37 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094b0200750302000400000000' 2022-05-17 18:45:37 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 205, , , 260, 61184, 1, b'\x18K\x0b\x02\x00', , 0) 2022-05-17 18:45:37 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xcd 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:38 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tL\x02\x00v\x03\x02\x00\x04\x00\x00\x00\n', 0, 175, 255, 246, 23, 159, 1, -70] 2022-05-17 18:45:38 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tL\x02\x00v\x03\x02\x00\x04\x00\x00\x00\n' 2022-05-17 18:45:38 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=76, command_id=2, *is_reply=True) 2022-05-17 18:45:38 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=118, dp=3, data=TuyaData(dp_type=, function=0, raw=b'\n\x00\x00\x00', *payload=10))) 2022-05-17 18:45:38 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 76): set_data_response(data=TuyaCommand(status=0, tsn=118, dp=3, data=TuyaData(dp_type=, function=0, raw=b'\n\x00\x00\x00', *payload=10))) 2022-05-17 18:45:38 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=76, command_id=, *is_reply=True) 2022-05-17 18:45:38 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:38 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094c020076030200040000000a' 2022-05-17 18:45:38 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 206, , , 260, 61184, 1, b'\x18L\x0b\x02\x00', , 0) 2022-05-17 18:45:38 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xce 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:41 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tM\x02\x00w\x03\x02\x00\x04\x00\x00\x002', 0, 175, 255, 246, 23, 159, 1, -53] 2022-05-17 18:45:41 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tM\x02\x00w\x03\x02\x00\x04\x00\x00\x002' 2022-05-17 18:45:41 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=77, command_id=2, *is_reply=True) 2022-05-17 18:45:41 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=119, dp=3, data=TuyaData(dp_type=, function=0, raw=b'2\x00\x00\x00', *payload=50))) 2022-05-17 18:45:41 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 77): set_data_response(data=TuyaCommand(status=0, tsn=119, dp=3, data=TuyaData(dp_type=, function=0, raw=b'2\x00\x00\x00', *payload=50))) 2022-05-17 18:45:41 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=77, command_id=, *is_reply=True) 2022-05-17 18:45:41 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:41 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094d0200770302000400000032' 2022-05-17 18:45:41 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 207, , , 260, 61184, 1, b'\x18M\x0b\x02\x00', , 0) 2022-05-17 18:45:41 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xcf 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tN\x02\x00x\x03\x02\x00\x04\x00\x00\x00P', 0, 175, 255, 246, 23, 159, 1, -55] 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tN\x02\x00x\x03\x02\x00\x04\x00\x00\x00P' 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=78, command_id=2, *is_reply=True) 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=120, dp=3, data=TuyaData(dp_type=, function=0, raw=b'P\x00\x00\x00', *payload=80))) 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 78): set_data_response(data=TuyaCommand(status=0, tsn=120, dp=3, data=TuyaData(dp_type=, function=0, raw=b'P\x00\x00\x00', *payload=80))) 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=78, command_id=, *is_reply=True) 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094e0200780302000400000050' 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 209, , , 260, 61184, 1, b'\x18N\x0b\x02\x00', , 0) 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xd1 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tO\x02\x00y\x03\x02\x00\x04\x00\x00\x00Z', 0, 175, 255, 9, 24, 159, 1, -55] 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tO\x02\x00y\x03\x02\x00\x04\x00\x00\x00Z' 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=79, command_id=2, *is_reply=True) 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=121, dp=3, data=TuyaData(dp_type=, function=0, raw=b'Z\x00\x00\x00', *payload=90))) 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 79): set_data_response(data=TuyaCommand(status=0, tsn=121, dp=3, data=TuyaData(dp_type=, function=0, raw=b'Z\x00\x00\x00', *payload=90))) 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=79, command_id=, *is_reply=True) 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'094f020079030200040000005a' 2022-05-17 18:45:44 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 210, , , 260, 61184, 1, b'\x18O\x0b\x02\x00', , 0) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xd2 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tP\x02\x00z\x03\x02\x00\x04\x00\x00\x00d', 0, 175, 255, 9, 24, 159, 1, -55] 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tP\x02\x00z\x03\x02\x00\x04\x00\x00\x00d' 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=80, command_id=2, *is_reply=True) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=122, dp=3, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 80): set_data_response(data=TuyaCommand(status=0, tsn=122, dp=3, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=80, command_id=, *is_reply=True) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'095002007a0302000400000064' 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 211, , , 260, 61184, 1, b'\x18P\x0b\x02\x00', , 0) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xd3 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tQ\x02\x00{\x02\x02\x00\x04\x00\x00\x00d', 0, 175, 255, 9, 24, 159, 1, -55] 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tQ\x02\x00{\x02\x02\x00\x04\x00\x00\x00d' 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=81, command_id=2, *is_reply=True) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=123, dp=2, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 81): set_data_response(data=TuyaCommand(status=0, tsn=123, dp=2, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:45 DEBUG (MainThread) [homeassistant.components.zha.core.channels.base] [0xC34F:1:0x0008]: received attribute: 0 update with value: 255 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=81, command_id=, *is_reply=True) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'095102007b0202000400000064' 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 212, , , 260, 61184, 1, b'\x18Q\x0b\x02\x00', , 0) 2022-05-17 18:45:45 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xd4 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:46 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [33, , , 1, , 1, 260, 61184, b'\tR\x02\x00|h\x05\x00\x01\x00', 0, 175, 255, 9, 24, 159, 1, -55] 2022-05-17 18:45:46 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tR\x02\x00|h\x05\x00\x01\x00' 2022-05-17 18:45:46 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=82, command_id=2, *is_reply=True) 2022-05-17 18:45:46 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=124, dp=104, data=TuyaData(dp_type=, function=0, raw=b'\x00', *payload=))) 2022-05-17 18:45:46 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 82): set_data_response(data=TuyaCommand(status=0, tsn=124, dp=104, data=TuyaData(dp_type=, function=0, raw=b'\x00', *payload=))) 2022-05-17 18:45:46 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] No datapoint handler for TuyaCommand(status=0, tsn=124, dp=104, data=TuyaData(dp_type=, function=0, raw=b'\x00', *payload=)) 2022-05-17 18:45:46 WARNING (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] No 'handle_set_data_response' tuya handler found for set_data_response(data=TuyaCommand(status=0, tsn=124, dp=104, data=TuyaData(dp_type=, function=0, raw=b'\x00', *payload=))) 2022-05-17 18:45:46 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=82, command_id=, *is_reply=True) 2022-05-17 18:45:46 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:46 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'095202007c6805000100' 2022-05-17 18:45:46 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 213, , , 260, 61184, 1, b'\x18R\x0b\x02\x81', , 0) 2022-05-17 18:45:46 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xd5 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:51 DEBUG (MainThread) [zigpy_deconz.api] APS data indication response: [36, , , 1, , 1, 260, 61184, b'\tS\x02\x00}n\x02\x00\x04\x00\x00\x00d', 0, 175, 255, 9, 24, 159, 1, -58] 2022-05-17 18:45:51 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received ZCL frame: b'\tS\x02\x00}n\x02\x00\x04\x00\x00\x00d' 2022-05-17 18:45:51 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=83, command_id=2, *is_reply=True) 2022-05-17 18:45:51 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Decoded ZCL frame: TuyaValveManufCluster:set_data_response(data=TuyaCommand(status=0, tsn=125, dp=110, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:51 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Received command 0x02 (TSN 83): set_data_response(data=TuyaCommand(status=0, tsn=125, dp=110, data=TuyaData(dp_type=, function=0, raw=b'd\x00\x00\x00', *payload=100))) 2022-05-17 18:45:51 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=83, command_id=, *is_reply=True) 2022-05-17 18:45:51 DEBUG (MainThread) [zigpy.zcl] [0xC34F:1:0xef00] Sending reply: Default_Response(command_id=2, status=) 2022-05-17 18:45:51 DEBUG (MainThread) [zigpy_deconz.api] 'aps_data_indication' response from , ep: 1, profile: 0x0104, cluster_id: 0xef00, data: b'095302007d6e02000400000064' 2022-05-17 18:45:51 DEBUG (MainThread) [zigpy_deconz.api] Command Command.aps_data_request (20, 216, , , 260, 61184, 1, b'\x18S\x0b\x02\x00', , 0) 2022-05-17 18:45:51 DEBUG (MainThread) [zigpy_deconz.api] Request id: 0xd8 'aps_data_confirm' for , status: 0x00 2022-05-17 18:45:53 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0xC34F](TS0601): Device seen - marking the device available and resetting counter 2022-05-17 18:45:53 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0xC34F](TS0601): Update device availability - device available: True - new availability: True - changed: False ```
dedwards66 commented 2 years ago

This was the only battery cluster that returned anything for me. I believe it is fully charged because it has been in the sun for days. battery_percentage_remaining (id: 0x0021)

Value 200

wishie commented 2 years ago

I wonder if the 'turns off after 1 minute' is due to a timer that is set?

tube0013 commented 2 years ago

Adding in the full log as well, just incase the filtered log was missing anything. Note though I am currently running another test network on the same channel (25) that the tuya gateway was on

valve2_Full.pcapng.zip .

wishie commented 2 years ago

For me, the slider (dim) works fine, but the on/off switch does not seem to function.

dedwards66 commented 2 years ago

I thought it did nothing, but it enables brightness status updates on the UI. If it is "on" and I push the manual button to open and close the valve the UI will update the brightness. If it is "off" it does not.

dedwards66 commented 2 years ago

@tube0013 Thanks for capturing those logs.

javicalle commented 2 years ago

@dedwards66, please edit your comment and put the logs inside ``` marks. Or even better, inside a details block like:


<details>
<summary>brightness from 0 to 100%</summary>

All your logs HERE


</details>
javicalle commented 2 years ago

@tube0013 Thanks for the detailed sniff. I'll check in the afternoon (GMT+2 here)

javicalle commented 2 years ago

This was the only battery cluster that returned anything for me. I believe it is fully charged because it has been in the sun for days. battery_percentage_remaining (id: 0x0021)

Does the device create a new battery entity in HA? If yes, it has the 100% value?

javicalle commented 2 years ago

If someone wants to play around with the possible funtionallities, it seems that the DPs used by the device would be (from Z2M #12153:)

1 - Switch
2 - Regulating water volume
3 - Flow state
10 - Weather Delay
11 - Irrigation time

101 - 倒计时剩余时间  countdown time remaining
102 - 倒计时剩余时间设置 countdown remaining time setting
103 - 开到底状态 open to the end
104 - 故障告警 fault alarm
105 - 默认倒计时开启 by default countdown is on
106 - 默认倒计时设置 default countdown settings
107 - 月使用时长 monthly usage time
108 - 月使用水容量 monthly water capacity
109 - 定时灌溉 regular irrigation
110 - 电池电量 battery power

They can all be added as attributes of the TuyaValveManufCluster, but you must know the type of value that each attribute accepts. The logs would give also some info for the known DPs. For example:

2022-05-10 22:47:00 DEBUG (MainThread) [zigpy.zcl] [0x873E:1:0xef00] Sending request: set_data(data=TuyaCommand(status=0, tsn=81, dp=1, data=TuyaData(dp_type=<TuyaDPType.BOOL: 1>, function=0, raw=b'\x01', *payload=<Bool.true: 1>)))

dp=1 will give us the device DP dp_type=<TuyaDPType.BOOL: 1> will give us the DP type

Adding new DPs would be like this:

class TuyaValveManufCluster(TuyaMCUCluster):
    """Tuya valve manufacturer cluster."""

    attributes = TuyaMCUCluster.attributes.copy()
    attributes.update(
        {
            0xEF02: ("dp_2", t.uint32_t, True),
            0xEF65: ("dp_101", t.uint32_t, True),
            0xEF66: ("dp_102", t.uint32_t, True), # <-- new cluster attribute with fake IDs (102=0x66).Format= ID: ("name", type, True)
        }
    )

    dp_to_attribute: Dict[int, DPToAttributeMapping] = {
        1: DPToAttributeMapping(
            TuyaOnOffNM.ep_attribute,
            "on_off",
            dp_type=TuyaDPType.BOOL,
        ),
        3: DPToAttributeMapping(
            TuyaMCUCluster.ep_attribute,
            "dp_2",
            dp_type=TuyaDPType.VALUE,
        ),
        2: DPToAttributeMapping(
            TuyaLevelControlNM.ep_attribute,
            "current_level",
            dp_type=TuyaDPType.VALUE,
            converter=lambda x: (x * 255) // 100,
            dp_converter=lambda x: (x * 100) // 255,
        ),
        101: DPToAttributeMapping(
            TuyaMCUCluster.ep_attribute,
            "dp_101",
            dp_type=TuyaDPType.VALUE,
        ),
        102: DPToAttributeMapping(       # <-- device DP102
            TuyaMCUCluster.ep_attribute, # <-- reference to the cluster which has the attribute
            "dp_101",                                  # <-- attribute "name"
            dp_type=TuyaDPType.VALUE,  # <-- DP Type it is related to the attribute type
        ),
        # 104: DPToAttributeMapping(
        #     TuyaLevelControl.ep_attribute,
        #     "dp_104",
        #     dp_type=TuyaDPType.BITMAP,
        # ),
        110: DPToAttributeMapping(
            TuyaPowerConfiguration.ep_attribute,
            "battery_percentage_remaining",
            dp_type=TuyaDPType.VALUE,
        ),
    }

    data_point_handlers = {
        1: "_dp_2_attr_update",
        2: "_dp_2_attr_update",
        3: "_dp_2_attr_update",
        101: "_dp_2_attr_update",
        102: "_dp_2_attr_update", # <-- data point handler for the new DP
        # 104: "_dp_2_attr_update",
        110: "_dp_2_attr_update",
    }

The possible DP type (and the relation with attribute types) would be:

class TuyaDPType(t.enum8):
    """Tuya DataPoint Type."""

    RAW = 0x00, None
    BOOL = 0x01, t.Bool
    VALUE = 0x02, t.uint32_t
    STRING = 0x03, None
    ENUM = 0x04, t.enum8
    BITMAP = 0x05, None

Once configured, from the device view it is possible to modify the cluster attributes by assigning new values. When consulting the value again, it will tell us if the value has been set.

Happy hunting.

dedwards66 commented 2 years ago

@javicalle Yes it did create a battery that showed 100%.

dedwards66 commented 2 years ago

@javicalle For some reason doing a details block worked for me, but the three ticks didn't.

javicalle commented 2 years ago

@dedwards66 have you keep the breaklines before the open and after the closing ``` mark? Maybe the logs content causes the problem.

dedwards66 commented 2 years ago

@javicalle I added some line breaks and repasted the logs. It looks like it should now.

javicalle commented 2 years ago

@dedwards66 in your traces you can see that the value of DP101 seems to correspond to some kind of countdown (in intervals of 10 sec?) DP110 (with value 100) could be the battery percentage The device accepts the DP2 and DP3 commands (Default_Response(command_id=2, status=<Status.SUCCESS: 0>)) although it is not guaranteed that it will 'react' to commands

And there are 2 more DP:

javicalle commented 2 years ago

@MattWestb sorry to ping you directly. Does it occur to you that it may be suitable to implement the 'dim' function of this device? Using the LevelControl cluster generates events associated with the light entity that seem to be counterproductive in this case. Any idea what could be used in this case?

Thank you.

MattWestb commented 2 years ago

If it one timer function for shutting the valve of then i think cluster 0x0006 and command 0x42 is better but i think ZHA have no GUI elements for it. https://github.com/zigpy/zigpy/blob/8fefb7c8cf327858c35002a66c3e3cac31fdafc4/zigpy/zcl/clusters/general.py#L644-L653 Also the on time is on attribute with the time. https://github.com/zigpy/zigpy/blob/8fefb7c8cf327858c35002a66c3e3cac31fdafc4/zigpy/zcl/clusters/general.py#L628

But need looking in the ZCL R8 for see if its working with the function you is having.

Level controll (0x00008) is also having "renaming time" but i think its for transition time then dimming up and down and not working in your case. https://github.com/zigpy/zigpy/blob/8fefb7c8cf327858c35002a66c3e3cac31fdafc4/zigpy/zcl/clusters/general.py#L701

PS: i think i was missing replaying on one question in the last week but i cant finding it :-((

javicalle commented 2 years ago

Interesting. I think we could set some of the attributes in the OnOff cluster. I thought that from your experience with TRVs we would have found some kind of entity in HA that allows you to control the flow without behaving like a light (move_to_level_with_on_off). The goal would be to find an implementation that allows this new type of device to be functional (in HA) without having to edit the attributes from the device view. The truth is that it is increasingly necessary to have configuration controls in HA for manufacturer attributes that cannot be adjusted to the Zigbee standard.

Thank you.

MattWestb commented 2 years ago

The TRVs is only getting one set point temperature and can (but not all) reporting back the valve opening % and also different working modes.

I think for the count down is "elapsed_active_time" from BinaryOutputRegular (or input) OK. https://github.com/zigpy/zigpy/blob/8fefb7c8cf327858c35002a66c3e3cac31fdafc4/zigpy/zcl/clusters/protocol.py#L200.

Have not finding any flow but it shall being in the building part of ZCL.

dedwards66 commented 2 years ago

@javicalle I did some reading from the manage clusters on the DP101. Just like in the past, if I use the dimmer slider to set the valve position it correctly moves to the position. Then after a short period of time, it closes. It does not return to the previous setting, always to closed. After I moved valve I queried the DP101 value several times and it does appear to be a countdown of the seconds remaining until the valve closes.

wishie commented 2 years ago

I've been busy today, what is the current latest version of the work in progress quirk? I wish to test it.

illuzn commented 2 years ago

I've also got _TZE200_arge1ptm from digging around on the Tuya IOT website this appears to be a in the custom category for a large number of different valve controllers (which might all be reporting as the same/ similar thing).

Mine is a solar powered valve controller that attaches to the water tap to control irrigation.

I've been doing tuya-cli get --full dumps to query the device and have worked out the following for my version of this device:

2 - Set Valve Position (Accepts a number from 0-100 corresponds to desired valve position in %) 3 - Current Valve Position (Reports as a number from 0-100 corresponds to the current valve position in %. Mine ramps up over 2 seconds to the set position) 11 - Set Autoshutoff Timer (Accepts a number from 0-86399 n.b. 86399 corresponds with 23h:59m:59s the maximum allowable in the app and 0 disables the autoshutoff. Setting this to numbers higher than 86399 work but may have unintended consequences) 101 - Autoshutoff Timer remaining (reports the amount of time remaining from dps 11 since it was last set or the valve was turned on in seconds e.g. if a 60s timer is set and the valve has been on for 10s then this will report 50) 104 - Unknown - Maybe Fault Reporting 107 - Unknown - Does not appear to be Monthly usage time. 110 - Battery Percentage (Reports a number from 0-100 corresponds to battery percentage in %)

Being a custom device the DPS do not correspond with the default ones reported on the Tuya IOT website. Not sure if there is a way to differentiate these.

dedwards66 commented 2 years ago

@illuzn That sounds exactly like my valve. Thanks for posting the details.

wishie commented 2 years ago

I do wonder how similar all of these things are.. Hopefully they have more in common than not.

dedwards66 commented 2 years ago

I went ahead and got a Tuya ZigBee hub from Amazon for $20. I have the valve added with the Tuya integration into Home Assistant kinda. Since water valves are not supported I can only control it indirectly by having Home Assistant start a Tuya scene that controls the water valve. The main problem is the same that javicalle ran into. Home Assistant does not have real ways to control this type of device.

Playing with the Tuya Smartlife app to control the valve I think I can provide some better translation/speculation of the DP documentation. My speculation in " ( ) "

1 - Switch 2 - Regulating water volume 3 - Flow state 10 - Weather Delay 11 - Irrigation time

101 - 倒计时剩余时间 countdown time remaining (It might be seconds updated every 10 seconds if less than a minute. The app only updates every minute when over a minute remaining.) 102 - 倒计时剩余时间设置 countdown remaining time setting (I think this might be if a countdown timer is currently running?) 103 - 开到底状态 open to the end (open the valve to the max and begin countdown timer, the app has a button that does this) 104 - 故障告警 fault alarm 105 - 默认倒计时开启 by default countdown is on (change the behavior if the countdown starts by default??? app does not do this and always begins a timer) 106 - 默认倒计时设置 default countdown settings (set the default for the manual start countdown timer. Probably in seconds or hours, minutes, and seconds) 107 - 月使用时长 monthly usage time (In the app you can see the total time the valve was open in hours for any month, you can also see in that month each time that it ran and for how long. 107 and 108 might be total for month[s] and a list of the times run in the month[s]) 108 - 月使用水容量 monthly water capacity 109 - 定时灌溉 regular irrigation (I suspect this is setting the scheduled watering. Parameters would be day[s] of the week, start time, end time, and valve position) 110 - 电池电量 battery power (state of the battery, probably in percent.

wishie commented 2 years ago

Based on the above information, do you think its possible to get this valve working well in HA?

Mickago commented 2 years ago

Hello,

I just bought the solar QT-05M and I'm sad to see that the integration with Home Assistant is not working. But I regained hope when I found your topic.

I'm a beginner so I'm not sure how to make this product become HA compatible.

In the meantime, I'm using the Smart Life app (Tuya) but it's limited. For example, it is possible to create scenes which can be retrieved on Home Assistant, but the scene actions are very very limited on the Smart Life app. To tell you, the only possible action is to adjust the countdown during a manual triggering of the valve. In other words not very useful since we cannot operate the valve from HA...

dedwards66 commented 2 years ago

It is possible that a future ZHA update will have this added but I am not sure what their current plans are. Here is my understanding of the problems, that others have mentioned. One of the issues is that Home Assistant ZHA does not really have a way to deal with valves that open a little and close the water flow after a defined time. The test quirk files got around this by pretending that it was a dimmable lightbulb for moving the valve. It is going to take someone to work across adding features to ZHA core abilities and then building a quirk definition that uses those new abilities. Not impossible, but not trivial either. @javicalle is that a good summation of the situation.

In my continued research into water control, I found a really well-built tap control that has built-in support for Home Assistant in its gateway. I have it working in my backyard and the company is really focused on making a great product. It is not cheap, but it is a lot cheaper than playing around with other products.

wishie commented 2 years ago

I always assumed it would be better to emulate a 'cover' (window blind) as that also has open/closed to a certain percentage, and does not really have an 'on' or 'off' setting like a light does.

illuzn commented 2 years ago

I'm trying to work on a custom-quirk handler for this but given that it is very wet where I am at the moment it's a very low priority.

However, my proposed schema is as follows:

QT-05M Valve:
  - controls:
    - switch.on_off: On/ Off Switch - self explanatory
  - sensors:
    - sensor.current_valve_position: current valve position as reported by valve
    - sensor.fail_safe_time_remaining: time remaining before the fail_safe triggers as reported by valve
    - sensor.battery_percentage: battery percentage of valve as reported by valve
  - configuration:
    - number.fail_safe: number input for the builtin timer to auto shut off in case there is an issue with communication
    - number.preset_valve_position: number input between 0-100 - switch.on_off sets this valve position when turned on
dedwards66 commented 2 years ago

That sounds like a very reasonable proposal.

morten6883 commented 2 years ago

I have the same valve. Moonshine has made this but I havent been able to get it working. Could this be to any help? https://github.com/MoonshineSG/zigbee2mqtt-custom/blob/master/QT-05M.js

dedwards66 commented 2 years ago

I have removed the valve because it was leaky, but I think it still works. If so I will give it a go this weekend. I have found TapLink now. Those valves are a bit pricey but they are built like a tank, never leak, and have great battery life and signal.