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
773 stars 703 forks source link

[Device Support Request] TS000F Mumubiz Smart Switch with Temperature and Humidity Sensors #3251

Open cleverdevil opened 4 months ago

cleverdevil commented 4 months ago

Problem description

I recently acquired this device: https://www.amazon.com/dp/B0D63CR311

It is a smart on/off switch coupled with a temperature and humidity sensor. It can be added to ZHA, but only functions as an on/off switch, and does not report temperature or humidity. I believe that this device will require a custom quirk.

Solution description

A custom quirk to support this device would be necessary.

Screenshots/Video

No response

Device signature

Device signature ```json { "node_descriptor": "NodeDescriptor(logical_type=, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=, mac_capability_flags=, manufacturer_code=4417, maximum_buffer_size=66, maximum_incoming_transfer_size=66, server_mask=10752, maximum_outgoing_transfer_size=66, descriptor_capability_field=, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=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": "0x0100", "input_clusters": [ "0x0000", "0x0003", "0x0004", "0x0005", "0x0006", "0xe000", "0xe001", "0xef00" ], "output_clusters": [ "0x000a", "0x0019" ] }, "242": { "profile_id": "0xa1e0", "device_type": "0x0061", "input_clusters": [], "output_clusters": [ "0x0021" ] } }, "manufacturer": "_TZ3218_7fiyo3kv", "model": "TS000F", "class": "zigpy.device.Device" } ```

Diagnostic information

Diagnostic information ```json { "home_assistant": { "installation_type": "Home Assistant Container", "version": "2024.5.4", "dev": false, "hassio": false, "virtualenv": false, "python_version": "3.12.2", "docker": true, "arch": "x86_64", "timezone": "America/Los_Angeles", "os_name": "Linux", "os_version": "4.4.302+", "run_as_root": true }, "custom_components": { "zha_toolkit": { "documentation": "https://github.com/mdeweerd/zha-toolkit", "version": "v1.1.10", "requirements": [ "pytz" ] }, "pyscript": { "documentation": "https://github.com/custom-components/pyscript", "version": "1.5.0", "requirements": [ "croniter==1.3.8", "watchdog==2.3.1" ] }, "meross_lan": { "documentation": "https://github.com/krahabb/meross_lan", "version": "5.2.2", "requirements": [] }, "hacs": { "documentation": "https://hacs.xyz/docs/configuration/start", "version": "1.34.0", "requirements": [ "aiogithubapi>=22.10.1" ] }, "remote_homeassistant": { "documentation": "https://github.com/custom-components/remote_homeassistant", "version": "3.11", "requirements": [] }, "localtuya": { "documentation": "https://github.com/rospogrigio/localtuya/", "version": "5.2.1", "requirements": [] }, "zidoo": { "documentation": "https://www.github.com/wizmo2/zidoo-player", "version": "2.0.1", "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", "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.4", "pyserial==3.5", "pyserial-asyncio==0.6", "zha-quirks==0.0.115", "zigpy-deconz==0.23.1", "zigpy==0.64.0", "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": 8047, "manufacturer": "_TZ3218_7fiyo3kv", "model": "TS000F", "name": "_TZ3218_7fiyo3kv TS000F", "quirk_applied": false, "quirk_class": "zigpy.device.Device", "quirk_id": null, "manufacturer_code": 4417, "power_source": "Mains", "lqi": 32, "rssi": null, "last_seen": "2024-07-12T14:33:17", "available": true, "device_type": "Router", "signature": { "node_descriptor": "NodeDescriptor(logical_type=, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=, mac_capability_flags=, manufacturer_code=4417, maximum_buffer_size=66, maximum_incoming_transfer_size=66, server_mask=10752, maximum_outgoing_transfer_size=66, descriptor_capability_field=, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)", "endpoints": { "1": { "profile_id": "0x0104", "device_type": "0x0100", "input_clusters": [ "0x0000", "0x0003", "0x0004", "0x0005", "0x0006", "0xe000", "0xe001", "0xef00" ], "output_clusters": [ "0x000a", "0x0019" ] }, "242": { "profile_id": "0xa1e0", "device_type": "0x0061", "input_clusters": [], "output_clusters": [ "0x0021" ] } }, "manufacturer": "_TZ3218_7fiyo3kv", "model": "TS000F" }, "active_coordinator": false, "entities": [ { "entity_id": "button.temp_and_humidity_switch_identify", "name": "_TZ3218_7fiyo3kv TS000F" }, { "entity_id": "light.temp_and_humidity_switch_light", "name": "_TZ3218_7fiyo3kv TS000F" }, { "entity_id": "sensor.tz3218_7fiyo3kv_ts000f_rssi", "name": "_TZ3218_7fiyo3kv TS000F" }, { "entity_id": "sensor.tz3218_7fiyo3kv_ts000f_lqi", "name": "_TZ3218_7fiyo3kv TS000F" }, { "entity_id": "update.temp_and_humidity_switch_firmware", "name": "_TZ3218_7fiyo3kv TS000F" } ], "neighbors": [], "routes": [], "endpoint_names": [ { "name": "ON_OFF_LIGHT" }, { "name": "PROXY_BASIC" } ], "user_given_name": "Temp and Humidity Switch", "device_reg_id": "f3a60c55c60f1ec569b032cbee26423f", "area_id": null, "cluster_details": { "1": { "device_type": { "name": "ON_OFF_LIGHT", "id": 256 }, "profile_id": 260, "in_clusters": { "0x0000": { "endpoint_attribute": "basic", "attributes": { "0x0001": { "attribute_name": "app_version", "value": 80 }, "0xfffd": { "attribute_name": "cluster_revision", "value": 2 }, "0x0006": { "attribute_name": "date_code", "value": "" }, "0x0003": { "attribute_name": "hw_version", "value": 1 }, "0x0004": { "attribute_name": "manufacturer", "value": "_TZ3218_7fiyo3kv" }, "0x0005": { "attribute_name": "model", "value": "TS000F" }, "0x0007": { "attribute_name": "power_source", "value": 1 }, "0xfffe": { "attribute_name": "reporting_status", "value": 0 }, "0x0002": { "attribute_name": "stack_version", "value": 1 }, "0x0000": { "attribute_name": "zcl_version", "value": 3 } }, "unsupported_attributes": { "0x000d": { "attribute_name": "serial_number" }, "0x0011": { "attribute_name": "physical_env" }, "0x000e": { "attribute_name": "product_label" }, "0x0009": { "attribute_name": "generic_device_type" }, "0x0008": { "attribute_name": "generic_device_class" }, "0x000a": { "attribute_name": "product_code" }, "0x0013": { "attribute_name": "alarm_mask" }, "0x000b": { "attribute_name": "product_url" }, "0x0012": { "attribute_name": "device_enabled" } } }, "0x0003": { "endpoint_attribute": "identify", "attributes": { "0xfffd": { "attribute_name": "cluster_revision", "value": 1 }, "0x0000": { "attribute_name": "identify_time", "value": 0 } }, "unsupported_attributes": {} }, "0x0004": { "endpoint_attribute": "groups", "attributes": { "0xfffd": { "attribute_name": "cluster_revision", "value": 2 }, "0x0000": { "attribute_name": "name_support", "value": 0 } }, "unsupported_attributes": { "0xfffe": { "attribute_name": "reporting_status" } } }, "0x0005": { "endpoint_attribute": "scenes", "attributes": { "0xfffd": { "attribute_name": "cluster_revision", "value": 2 }, "0x0000": { "attribute_name": "count", "value": 0 }, "0x0002": { "attribute_name": "current_group", "value": 0 }, "0x0001": { "attribute_name": "current_scene", "value": 0 }, "0x0004": { "attribute_name": "name_support", "value": 0 }, "0x0003": { "attribute_name": "scene_valid", "value": 0 } }, "unsupported_attributes": { "0xfffe": { "attribute_name": "reporting_status" } } }, "0x0006": { "endpoint_attribute": "on_off", "attributes": { "0xfffd": { "attribute_name": "cluster_revision", "value": 2 }, "0x4002": { "attribute_name": "off_wait_time", "value": 0 }, "0x0000": { "attribute_name": "on_off", "value": 0 }, "0x4001": { "attribute_name": "on_time", "value": 0 } }, "unsupported_attributes": { "0x4000": { "attribute_name": "global_scene_control" }, "0xfffe": { "attribute_name": "reporting_status" }, "0x4003": { "attribute_name": "start_up_on_off" } } }, "0xe001": { "endpoint_attribute": null, "attributes": {}, "unsupported_attributes": {} }, "0xe000": { "endpoint_attribute": null, "attributes": {}, "unsupported_attributes": {} }, "0xef00": { "endpoint_attribute": null, "attributes": {}, "unsupported_attributes": {} } }, "out_clusters": { "0x000a": { "endpoint_attribute": "time", "attributes": { "0xfffd": { "attribute_name": "cluster_revision", "value": 1 } }, "unsupported_attributes": {} }, "0x0019": { "endpoint_attribute": "ota", "attributes": { "0xfffd": { "attribute_name": "cluster_revision", "value": 3 }, "0x0002": { "attribute_name": "current_file_version", "value": 80 }, "0x0003": { "attribute_name": "current_zigbee_stack_version", "value": 2 }, "0x0004": { "attribute_name": "downloaded_file_version", "value": 4294967295 }, "0x0005": { "attribute_name": "downloaded_zigbee_stack_version", "value": 65535 }, "0x0001": { "attribute_name": "file_offset", "value": 4294967295 }, "0x0008": { "attribute_name": "image_type_id", "value": 65535 }, "0x0006": { "attribute_name": "image_upgrade_status", "value": 0 }, "0x0007": { "attribute_name": "manufacturer_id", "value": 4417 }, "0x0009": { "attribute_name": "minimum_block_req_delay", "value": 0 }, "0x0000": { "attribute_name": "upgrade_server_id", "value": [ 255, 255, 255, 255, 255, 255, 255, 255 ] } }, "unsupported_attributes": {} } } }, "242": { "device_type": { "name": "PROXY_BASIC", "id": 97 }, "profile_id": 41440, "in_clusters": {}, "out_clusters": { "0x0021": { "endpoint_attribute": "green_power", "attributes": {}, "unsupported_attributes": {} } } } } } } ```

Logs

No response

Custom quirk

No response

Additional information

No response

brianacox commented 4 months ago

Snap ... same issue.... have you found a work around yet? BTW, how do you power your device? I'm only using it as a 'main' (rather than battery) Zigbee temp sensor.... but only the 5v input seems to power it up.... I had hoped that 240v (regardless of whether I used it as a switch) would provide power.

cleverdevil commented 4 months ago

Nope, no luck yet. I got the switch for free as part of Amazon Vine, so not in a big rush to get it to work. I am sure it will be supported eventually! Currently powering it with this switching power adapter. Simply cut off the connector, strip the wires, and connect them directly to the switch.

brianacox commented 4 months ago

Mine started smoking with the USB cable in ..... seemed to be fine via the 240v input.... hey ho... waiting on a replacement at the moment....

Ezzob commented 1 month ago

Custom quirk was created by user klibro here TS000F_TZ3218_7fiyo3kv.py

brianacox commented 1 month ago

Custom quirk was created by user klibro here TS000F_TZ3218_7fiyo3kv.py

Works perfectly... thank you!

tk200 commented 1 month ago

I have tried installing with the custom quirk, but the temp sensor still does not work - the diagnostics state it is unsupported. It is definately measuring it (the 2380 value is 23.8 deg, and increases as temp increases), but it doesn't display anywhere:

"0x0402": { "endpoint_attribute": "temperature", "attributes": { "0xfffd": { "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=<class 'zigpy.types.basic.uint16_t'>, zcl_type=<DataTypeId.uint16: 33>, access=<ZCLAttributeAccess.Read: 1>, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0002": { "attribute": "ZCLAttributeDef(id=0x0002, name='max_measured_value', type=<class 'zigpy.types.basic.int16s'>, zcl_type=<DataTypeId.int16: 41>, access=<ZCLAttributeAccess.Read: 1>, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0x0000": { "attribute": "ZCLAttributeDef(id=0x0000, name='measured_value', type=<class 'zigpy.types.basic.int16s'>, zcl_type=<DataTypeId.int16: 41>, access=<ZCLAttributeAccess.Read|Report: 9>, mandatory=True, is_manufacturer_specific=False)", "value": 2180 }, "0x0001": { "attribute": "ZCLAttributeDef(id=0x0001, name='min_measured_value', type=<class 'zigpy.types.basic.int16s'>, zcl_type=<DataTypeId.int16: 41>, access=<ZCLAttributeAccess.Read: 1>, mandatory=True, is_manufacturer_specific=False)", "value": null }, "0xfffe": { "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=<enum 'AttributeReportingStatus'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)", "value": null }, "0x0003": { "attribute": "ZCLAttributeDef(id=0x0003, name='tolerance', type=<class 'zigpy.types.basic.uint16_t'>, zcl_type=<DataTypeId.uint16: 33>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)", "value": null } }, "unsupported_attributes": [ 0, "measured_value" ] } },

brianacox commented 1 month ago

I downloaded the custom quirk, moved it to the correct directory and then simply did a reconfigure; that was sufficient, it seems, to reload the quirk. It worked first time. I wonder if you have a slightly different device?

tk200 commented 1 month ago

I think you may be right, in that it is a slightly different device…