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
714 stars 661 forks source link

[Device Support Request] Moes ZHT-3000-GB-SS-MS thermostat floor temperature sensor #3043

Open scp93ch opened 5 months ago

scp93ch commented 5 months ago

Problem description

I have connected this thermostat to Home Assistant using Zigbee Home Automation and the SkyConnect dongle. The basic features work: the current temperature, set temperature, on/off, and it appears as a functional climate device in HA. The thermostat is for electric underfloor heating and so has a room temperature sensor (which I can read) and a floor temperature sensor which I cannot read.

I previously opened issue #2479 which was closed by a bot as I didn't respond quickly enough. The info below is up to date.

Solution description

I would like to be able to read the floor temperature over Zigbee.

Screenshots/Video

Screenshots/Video [Paste/upload your media here]

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=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)", "endpoints": { "1": { "profile_id": "0x0104", "device_type": "0x0301", "input_clusters": [ "0x0000", "0x0004", "0x0005", "0x0201", "0x0204", "0xef00" ], "output_clusters": [ "0x000a", "0x0019" ] } }, "manufacturer": "_TZE200_aoclfnxz", "model": "TS0601", "class": "zhaquirks.tuya.ts0601_electric_heating.MoesBHT" } ```

Diagnostic information

Diagnostic information ```json { "home_assistant": { "installation_type": "Home Assistant OS", "version": "2024.3.0", "dev": false, "hassio": true, "virtualenv": false, "python_version": "3.12.2", "docker": true, "arch": "x86_64", "timezone": "Europe/London", "os_name": "Linux", "os_version": "6.6.16-haos", "supervisor": "2024.03.0", "host_os": "Home Assistant OS 12.0", "docker_version": "24.0.7", "chassis": "vm", "run_as_root": true }, "custom_components": { "hacs": { "version": "1.34.0", "requirements": [ "aiogithubapi>=22.10.1" ] }, "octopus_energy": { "version": "10.1.4", "requirements": [] }, "ytube_music_player": { "version": "20240131.01", "requirements": [ "ytmusicapi==1.4.2", "pytube==15.0.0", "integrationhelper==0.2.2" ] }, "tapo": { "version": "3.0.0", "requirements": [ "plugp100==4.0.3" ] }, "better_thermostat": { "version": "1.4.0", "requirements": [] }, "scheduler": { "version": "v0.0.0", "requirements": [] } }, "integration_manifest": { "domain": "zha", "name": "Zigbee Home Automation", "after_dependencies": [ "onboarding", "usb" ], "codeowners": [ "@dmulcahey", "@adminiuga", "@puddly", "@TheJulianJES" ], "config_flow": true, "dependencies": [ "file_upload" ], "documentation": "https://www.home-assistant.io/integrations/zha", "import_executor": true, "iot_class": "local_polling", "loggers": [ "aiosqlite", "bellows", "crccheck", "pure_pcapy3", "zhaquirks", "zigpy", "zigpy_deconz", "zigpy_xbee", "zigpy_zigate", "zigpy_znp", "universal_silabs_flasher" ], "requirements": [ "bellows==0.38.1", "pyserial==3.5", "pyserial-asyncio==0.6", "zha-quirks==0.0.112", "zigpy-deconz==0.23.1", "zigpy==0.63.4", "zigpy-xbee==0.20.1", "zigpy-zigate==0.12.0", "zigpy-znp==0.12.1", "universal-silabs-flasher==0.0.18", "pyserial-asyncio-fast==0.11" ], "usb": [ { "vid": "10C4", "pid": "EA60", "description": "*2652*", "known_devices": [ "slae.sh cc2652rb stick" ] }, { "vid": "10C4", "pid": "EA60", "description": "*slzb-07*", "known_devices": [ "smlight slzb-07" ] }, { "vid": "1A86", "pid": "55D4", "description": "*sonoff*plus*", "known_devices": [ "sonoff zigbee dongle plus v2" ] }, { "vid": "10C4", "pid": "EA60", "description": "*sonoff*plus*", "known_devices": [ "sonoff zigbee dongle plus" ] }, { "vid": "10C4", "pid": "EA60", "description": "*tubeszb*", "known_devices": [ "TubesZB Coordinator" ] }, { "vid": "1A86", "pid": "7523", "description": "*tubeszb*", "known_devices": [ "TubesZB Coordinator" ] }, { "vid": "1A86", "pid": "7523", "description": "*zigstar*", "known_devices": [ "ZigStar Coordinators" ] }, { "vid": "1CF1", "pid": "0030", "description": "*conbee*", "known_devices": [ "Conbee II" ] }, { "vid": "0403", "pid": "6015", "description": "*conbee*", "known_devices": [ "Conbee III" ] }, { "vid": "10C4", "pid": "8A2A", "description": "*zigbee*", "known_devices": [ "Nortek HUSBZB-1" ] }, { "vid": "0403", "pid": "6015", "description": "*zigate*", "known_devices": [ "ZiGate+" ] }, { "vid": "10C4", "pid": "EA60", "description": "*zigate*", "known_devices": [ "ZiGate" ] }, { "vid": "10C4", "pid": "8B34", "description": "*bv 2010/10*", "known_devices": [ "Bitron Video AV2010/10" ] } ], "zeroconf": [ { "type": "_esphomelib._tcp.local.", "name": "tube*" }, { "type": "_zigate-zigbee-gateway._tcp.local.", "name": "*zigate*" }, { "type": "_zigstar_gw._tcp.local.", "name": "*zigstar*" }, { "type": "_uzg-01._tcp.local.", "name": "uzg-01*" }, { "type": "_slzb-06._tcp.local.", "name": "slzb-06*" } ], "is_built_in": true }, "data": { "ieee": "**REDACTED**", "nwk": 31246, "manufacturer": "_TZE200_aoclfnxz", "model": "TS0601", "name": "_TZE200_aoclfnxz TS0601", "quirk_applied": true, "quirk_class": "zhaquirks.tuya.ts0601_electric_heating.MoesBHT", "quirk_id": null, "manufacturer_code": 4098, "power_source": "Mains", "lqi": 172, "rssi": -57, "last_seen": "2024-03-15T17:50:46", "available": true, "device_type": "Router", "signature": { "node_descriptor": "NodeDescriptor(logical_type=, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=, mac_capability_flags=, manufacturer_code=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=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)", "endpoints": { "1": { "profile_id": "0x0104", "device_type": "0x0301", "input_clusters": [ "0x0000", "0x0004", "0x0005", "0x0201", "0x0204", "0xef00" ], "output_clusters": [ "0x000a", "0x0019" ] } }, "manufacturer": "_TZE200_aoclfnxz", "model": "TS0601" }, "active_coordinator": false, "entities": [ { "entity_id": "climate.bathroom_thermostat", "name": "_TZE200_aoclfnxz TS0601" }, { "entity_id": "select.bathroom_thermostat_keypad_lockout", "name": "_TZE200_aoclfnxz TS0601" }, { "entity_id": "sensor.bathroom_thermostat_hvac_action", "name": "_TZE200_aoclfnxz TS0601" }, { "entity_id": "update.bathroom_thermostat_firmware", "name": "_TZE200_aoclfnxz TS0601" } ], "neighbors": [ { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x4898", "permit_joining": "Unknown", "depth": "15", "lqi": "52" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xB25A", "permit_joining": "Unknown", "depth": "15", "lqi": "123" }, { "device_type": "Router", "rx_on_when_idle": "On", "relationship": "Sibling", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0xF56C", "permit_joining": "Unknown", "depth": "15", "lqi": "52" }, { "device_type": "EndDevice", "rx_on_when_idle": "Off", "relationship": "Child", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x87DF", "permit_joining": "NotAccepting", "depth": "2", "lqi": "151" }, { "device_type": "EndDevice", "rx_on_when_idle": "Off", "relationship": "Child", "extended_pan_id": "**REDACTED**", "ieee": "**REDACTED**", "nwk": "0x6960", "permit_joining": "NotAccepting", "depth": "2", "lqi": "120" } ], "routes": [ { "dest_nwk": "0x0000", "route_status": "Active", "memory_constrained": false, "many_to_one": false, "route_record_required": false, "next_hop": "0xB25A" }, { "dest_nwk": "0x4898", "route_status": "Active", "memory_constrained": false, "many_to_one": false, "route_record_required": false, "next_hop": "0xB25A" }, { "dest_nwk": "0x082B", "route_status": "Active", "memory_constrained": false, "many_to_one": false, "route_record_required": false, "next_hop": "0x082B" }, { "dest_nwk": "0x93D0", "route_status": "Active", "memory_constrained": false, "many_to_one": false, "route_record_required": false, "next_hop": "0xB25A" } ], "endpoint_names": [ { "name": "THERMOSTAT" } ], "user_given_name": "Bathroom thermostat", "device_reg_id": "e46bdea69f3400293a20ecdc6533e5e9", "area_id": "bathroom", "cluster_details": { "1": { "device_type": { "name": "THERMOSTAT", "id": 769 }, "profile_id": 260, "in_clusters": { "0x0000": { "endpoint_attribute": "basic", "attributes": { "0x0001": { "attribute_name": "app_version", "value": 72 }, "0x0004": { "attribute_name": "manufacturer", "value": "_TZE200_aoclfnxz" }, "0x0005": { "attribute_name": "model", "value": "TS0601" } }, "unsupported_attributes": {} }, "0x0004": { "endpoint_attribute": "groups", "attributes": {}, "unsupported_attributes": {} }, "0x0005": { "endpoint_attribute": "scenes", "attributes": {}, "unsupported_attributes": {} }, "0xef00": { "endpoint_attribute": "tuya_manufacturer", "attributes": { "0x0128": { "attribute_name": "child_lock", "value": 1 }, "0x0101": { "attribute_name": "enabled", "value": 1 }, "0x0402": { "attribute_name": "manual_mode", "value": 1 }, "0x0424": { "attribute_name": "running_mode", "value": 1 }, "0x0403": { "attribute_name": "schedule_mode", "value": 1 }, "0x0210": { "attribute_name": "target_temperature", "value": 20 }, "0x0218": { "attribute_name": "temperature", "value": 210 } }, "unsupported_attributes": {} }, "0x0201": { "endpoint_attribute": "thermostat", "attributes": { "0x001b": { "attribute_name": "ctrl_sequence_of_oper", "value": 2 }, "0x0000": { "attribute_name": "local_temperature", "value": 2100 }, "0x0012": { "attribute_name": "occupied_heating_setpoint", "value": 2000 }, "0x0025": { "attribute_name": "programing_oper_mode", "value": 1 }, "0x001e": { "attribute_name": "running_mode", "value": 0 }, "0x0029": { "attribute_name": "running_state", "value": 0 }, "0x001c": { "attribute_name": "system_mode", "value": 4 } }, "unsupported_attributes": { "0x0010": { "attribute_name": "local_temperature_calibration" }, "0x0002": { "attribute_name": "occupancy" }, "0x0003": { "attribute_name": "abs_min_heat_setpoint_limit" }, "0x0004": { "attribute_name": "abs_max_heat_setpoint_limit" }, "0x0005": { "attribute_name": "abs_min_cool_setpoint_limit" }, "0x0006": { "attribute_name": "abs_max_cool_setpoint_limit" }, "0x0011": { "attribute_name": "occupied_cooling_setpoint" }, "0x0007": { "attribute_name": "pi_cooling_demand" }, "0x0008": { "attribute_name": "pi_heating_demand" }, "0x0013": { "attribute_name": "unoccupied_cooling_setpoint" }, "0x0014": { "attribute_name": "unoccupied_heating_setpoint" }, "0x0015": { "attribute_name": "min_heat_setpoint_limit" }, "0x0016": { "attribute_name": "max_heat_setpoint_limit" }, "0x0017": { "attribute_name": "min_cool_setpoint_limit" }, "0x0018": { "attribute_name": "max_cool_setpoint_limit" }, "0x0030": { "attribute_name": "setpoint_change_source" } } }, "0x0204": { "endpoint_attribute": "thermostat_ui", "attributes": { "0x0001": { "attribute_name": "keypad_lockout", "value": 1 } }, "unsupported_attributes": { "0x0002": { "attribute_name": "schedule_programming_visibility" }, "0x0000": { "attribute_name": "temperature_display_mode" } } } }, "out_clusters": { "0x000a": { "endpoint_attribute": "time", "attributes": {}, "unsupported_attributes": { "0x0007": { "attribute_name": "local_time" }, "0x0000": { "attribute_name": "time" } } }, "0x0019": { "endpoint_attribute": "ota", "attributes": { "0x0002": { "attribute_name": "current_file_version", "value": 72 } }, "unsupported_attributes": { "0x0002": { "attribute_name": "current_file_version" } } } } } } } } ```

Logs

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

Custom quirk

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

Additional information

No response

muellerjo commented 5 months ago

I got the similar issue and want to upvote!!!

Quirk i'm currently using: https://github.com/zigpy/zha-device-handlers/issues/2433#issuecomment-1932675542

scp93ch commented 5 months ago

With the default set-up I can read the room temperature from the device and control the floor heating that way. As the thermostat unit controls the underfloor heating in the bathroom but is not actually inside the bathroom, this is not ideal. For what it's worth, I am currently pairing the Moes device with a separate zigbee temperature sensor with the Better Thermostat add-on so that the underfloor heating reacts to the bathroom temperature. I'd still like to read the floor temperature as well for better control.

muellerjo commented 2 months ago

Do you have any updates on reading the floor temperature of the Zigbee Thermostat? I'm also looking parrallely for another thermostat that may provide all values (including the floor temperaure) via Zigbee (ZHA) but haven't found any.

scp93ch commented 2 months ago

Do you have any updates on reading the floor temperature of the Zigbee Thermostat? I'm also looking parrallely for another thermostat that may provide all values (including the floor temperaure) via Zigbee (ZHA) but haven't found any.

None from me, but I have not done any further investigation myself.