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
720 stars 669 forks source link

[Device Support Request] Garza Smart TRV #2486

Closed Mr-Alicates closed 7 months ago

Mr-Alicates commented 1 year ago

Problem description

I bought a Garza smart TRV.

I paired it initially with home assistant without any issue, but the device had no entities associated. The device was reported as a "TS0601" manufactured by "_TZE200_mz5y07w2".

I started investigating and found that the device is phisically very similar to this zigbee device entry.

I also found that there is an existing class for this device

I downloaded the tuya quirks, modified it manually to include my device:

class Thermostat_TZE200_c88teujp(TuyaThermostat): signature = { MODELS_INFO: [ ("_TZE200_c88teujp", "TS0601"), ("_TZE200_azqp6ssj", "TS0601"), ("_TZE200_yw7cahqs", "TS0601"), ("_TZE200_9gvruqf5", "TS0601"), ("_TZE200_zuhszj9s", "TS0601"), ("_TZE200_zr9c0day", "TS0601"), ("_TZE200_0dvm9mva", "TS0601"), ("_TZE200_h4cgnbzg", "TS0601"), ("_TZE200_exfrnlow", "TS0601"), ("_TZE200_9m4kmbfu", "TS0601"), ("_TZE200_3yp57tby", "TS0601"), ("_TZE200_mz5y07w2", "TS0601"), ],

Restarted HA, re-paired the device and all the device's functionality seems to be working:

The only issue is that HVAC action sensor that seems to be stuck in "Unknown"

Solution description

Adding official support for the device _TZE200_mz5y07w2. It seems to be almost working with that existing quirk.

Screenshots/Video

Screenshots/Video

Device signature

Device signature ```json { "node_descriptor": "NodeDescriptor(logical_type=, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=, mac_capability_flags=, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, 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": "0x0104", "device_type": "0x0301", "input_clusters": [ "0x0000", "0x0001", "0x0004", "0x0005", "0x000d", "0x0201", "0xef00" ], "output_clusters": [ "0x000a", "0x0019" ] } }, "manufacturer": "_TZE200_mz5y07w2", "model": "TS0601", "class": "tuya.ts0601_trv_sas.Thermostat_TZE200_c88teujp" } ```

Diagnostic information

Diagnostic information ```json { "home_assistant": { "installation_type": "Home Assistant OS", "version": "2023.7.3", "dev": false, "hassio": true, "virtualenv": false, "python_version": "3.11.4", "docker": true, "arch": "x86_64", "timezone": "Europe/Madrid", "os_name": "Linux", "os_version": "6.1.34", "supervisor": "2023.07.1", "host_os": "Home Assistant OS 10.3", "docker_version": "23.0.6", "chassis": "vm", "run_as_root": true }, "custom_components": { "pvpc_hourly_pricing": { "version": "1.1.0", "requirements": [ "aiopvpc==4.2.1" ] }, "meross_lan": { "version": "4.2.0", "requirements": [] }, "hacs": { "version": "1.32.1", "requirements": [ "aiogithubapi>=22.10.1" ] }, "localtuya": { "version": "5.2.1", "requirements": [] }, "floureon": { "version": "1.0.0", "requirements": [ "pythoncrc", "broadlink>=0.15.0" ] }, "ble_monitor": { "version": "12.3.1", "requirements": [ "pycryptodomex>=3.14.1", "janus>=1.0.0", "aioblescan>=0.2.14", "btsocket>=0.2.0", "pyric>=0.1.6.3" ] }, "saj_esolar": { "version": "1.4.2", "requirements": [] }, "miele": { "version": "0.1.14", "requirements": [ "flatdict==4.0.1", "pymiele==0.1.6" ] }, "browser_mod": { "version": "2.3.0", "requirements": [] } }, "integration_manifest": { "domain": "zha", "name": "Zigbee Home Automation", "after_dependencies": [ "onboarding", "usb" ], "codeowners": [ "@dmulcahey", "@adminiuga", "@puddly" ], "config_flow": true, "dependencies": [ "file_upload" ], "documentation": "https://www.home-assistant.io/integrations/zha", "iot_class": "local_polling", "loggers": [ "aiosqlite", "bellows", "crccheck", "pure_pcapy3", "zhaquirks", "zigpy", "zigpy_deconz", "zigpy_xbee", "zigpy_zigate", "zigpy_znp" ], "requirements": [ "bellows==0.35.8", "pyserial==3.5", "pyserial-asyncio==0.6", "zha-quirks==0.0.101", "zigpy-deconz==0.21.0", "zigpy==0.56.2", "zigpy-xbee==0.18.1", "zigpy-zigate==0.11.0", "zigpy-znp==0.11.3" ], "usb": [ { "vid": "10C4", "pid": "EA60", "description": "*2652*", "known_devices": [ "slae.sh cc2652rb stick" ] }, { "vid": "1A86", "pid": "55D4", "description": "*sonoff*plus*", "known_devices": [ "sonoff zigbee dongle plus v2" ] }, { "vid": "10C4", "pid": "EA60", "description": "*sonoff*plus*", "known_devices": [ "sonoff zigbee dongle plus" ] }, { "vid": "10C4", "pid": "EA60", "description": "*tubeszb*", "known_devices": [ "TubesZB Coordinator" ] }, { "vid": "1A86", "pid": "7523", "description": "*tubeszb*", "known_devices": [ "TubesZB Coordinator" ] }, { "vid": "1A86", "pid": "7523", "description": "*zigstar*", "known_devices": [ "ZigStar Coordinators" ] }, { "vid": "1CF1", "pid": "0030", "description": "*conbee*", "known_devices": [ "Conbee II" ] }, { "vid": "10C4", "pid": "8A2A", "description": "*zigbee*", "known_devices": [ "Nortek HUSBZB-1" ] }, { "vid": "0403", "pid": "6015", "description": "*zigate*", "known_devices": [ "ZiGate+" ] }, { "vid": "10C4", "pid": "EA60", "description": "*zigate*", "known_devices": [ "ZiGate" ] }, { "vid": "10C4", "pid": "8B34", "description": "*bv 2010/10*", "known_devices": [ "Bitron Video AV2010/10" ] } ], "zeroconf": [ { "type": "_esphomelib._tcp.local.", "name": "tube*" }, { "type": "_zigate-zigbee-gateway._tcp.local.", "name": "*zigate*" }, { "type": "_zigstar_gw._tcp.local.", "name": "*zigstar*" }, { "type": "_slzb-06._tcp.local.", "name": "slzb-06*" } ], "is_built_in": true }, "data": { "ieee": "**REDACTED**", "nwk": 34032, "manufacturer": "_TZE200_mz5y07w2", "model": "TS0601", "name": "_TZE200_mz5y07w2 TS0601", "quirk_applied": true, "quirk_class": "tuya.ts0601_trv_sas.Thermostat_TZE200_c88teujp", "manufacturer_code": 4098, "power_source": "Battery or Unknown", "lqi": 112, "rssi": -72, "last_seen": "2023-07-22T16:19:09", "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=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, 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": "0x0104", "device_type": "0x0301", "input_clusters": [ "0x0000", "0x0001", "0x0004", "0x0005", "0x000d", "0x0201", "0xef00" ], "output_clusters": [ "0x000a", "0x0019" ] } }, "manufacturer": "_TZE200_mz5y07w2", "model": "TS0601" }, "active_coordinator": false, "entities": [ { "entity_id": "climate.tze200_mz5y07w2_ts0601_thermostat", "name": "_TZE200_mz5y07w2 TS0601" }, { "entity_id": "number.tze200_mz5y07w2_ts0601_number_temperature_offset", "name": "_TZE200_mz5y07w2 TS0601" }, { "entity_id": "sensor.tze200_mz5y07w2_ts0601_battery", "name": "_TZE200_mz5y07w2 TS0601" }, { "entity_id": "sensor.tze200_mz5y07w2_ts0601_rssi", "name": "_TZE200_mz5y07w2 TS0601" }, { "entity_id": "sensor.tze200_mz5y07w2_ts0601_lqi", "name": "_TZE200_mz5y07w2 TS0601" }, { "entity_id": "sensor.tze200_mz5y07w2_ts0601_hvac_action", "name": "_TZE200_mz5y07w2 TS0601" } ], "neighbors": [], "routes": [], "endpoint_names": [ { "name": "THERMOSTAT" } ], "user_given_name": null, "device_reg_id": "587045e5934eb34bc370496c3bf1a8e4", "area_id": "comedor", "cluster_details": { "1": { "device_type": { "name": "THERMOSTAT", "id": 769 }, "profile_id": 260, "in_clusters": { "0x0000": { "endpoint_attribute": "basic", "attributes": { "0x0004": { "attribute_name": "manufacturer", "value": "_TZE200_mz5y07w2" }, "0x0005": { "attribute_name": "model", "value": "TS0601" } }, "unsupported_attributes": {} }, "0x0001": { "endpoint_attribute": "power", "attributes": { "0x0021": { "attribute_name": "battery_percentage_remaining", "value": 200 } }, "unsupported_attributes": {} }, "0x0004": { "endpoint_attribute": "groups", "attributes": {}, "unsupported_attributes": {} }, "0x0005": { "endpoint_attribute": "scenes", "attributes": {}, "unsupported_attributes": {} }, "0x0201": { "endpoint_attribute": "thermostat", "attributes": { "0x001b": { "attribute_name": "ctrl_sequence_of_oper", "value": 2 }, "0x0000": { "attribute_name": "local_temperature", "value": 2880 }, "0x0016": { "attribute_name": "max_heat_setpoint_limit", "value": 3000 }, "0x0015": { "attribute_name": "min_heat_setpoint_limit", "value": 500 }, "0x0012": { "attribute_name": "occupied_heating_setpoint", "value": 500 }, "0x001e": { "attribute_name": "running_mode", "value": 0 }, "0x001c": { "attribute_name": "system_mode", "value": 0 } }, "unsupported_attributes": {} }, "0xef00": { "endpoint_attribute": "tuya_manufacturer", "attributes": { "0x0569": { "attribute_name": "battery_state", "value": 0 }, "0x0267": { "attribute_name": "heating_setpoint", "value": 50 }, "0x0266": { "attribute_name": "local_temperature", "value": 288 }, "0x016c": { "attribute_name": "schedule_enabled", "value": 0 }, "0x0165": { "attribute_name": "state", "value": 0 }, "0x021b": { "attribute_name": "temperature_calibration", "value": 0 } }, "unsupported_attributes": {} }, "0x000d": { "endpoint_attribute": "analog_output", "attributes": { "0x0100": { "attribute_name": "application_type", "value": 9 }, "0x001c": { "attribute_name": "description", "value": "Temperature Offset" }, "0x0075": { "attribute_name": "engineering_units", "value": 62 }, "0x0041": { "attribute_name": "max_present_value", "value": 6 }, "0x0045": { "attribute_name": "min_present_value", "value": -6 }, "0x0055": { "attribute_name": "present_value", "value": 0 }, "0x006a": { "attribute_name": "resolution", "value": 1 } }, "unsupported_attributes": {} } }, "out_clusters": { "0x000a": { "endpoint_attribute": "time", "attributes": {}, "unsupported_attributes": {} }, "0x0019": { "endpoint_attribute": "ota", "attributes": {}, "unsupported_attributes": {} } } } } } } ```

Logs

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

Custom quirk

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

Additional information

No response

MattWestb commented 1 year ago

The latest good working tuya TRV quirks is hosted here https://github.com/jacekk015/zha_quirks and shall being at the newest stand and all functions implanted.

Mr-Alicates commented 1 year ago

Hello @MattWestb.

Thank you very much for pointing me to that repo. Using this quirk I got it working fine (doing the same addition of the model info, I mean).

Now the TRV displays a number slider for the temperature offset, a thermostat entity and an HVAC action sensor that seems to work fine since it displays idle and heating and the battery.

I also get 6 switches control that I have no clue what they do, but they seem to have a reaction on the valve.

What should I do now? Should I move this request to @jacekk015's repository?

MattWestb commented 1 year ago

Great that is working good for you !! Plea ask Jacekk and i think hi is back home after his holiday trip and i hope hi have time explaining the functions for you.

Mr-Alicates commented 1 year ago

I managed to find out what each switch does by peeking on the attributes of the device. They seem to be: Window detection Child lock Anti freeze Limescale protection Schedule mode Away mode

Thanks again!

jacekk015 commented 1 year ago

Can't give the names to switches. ZHA Code limitation.

github-actions[bot] commented 7 months ago

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