zha-device-handlers
zha-device-handlers copied to clipboard
[Device Support Request] Blind motor "_TZE200_libht6ua"
Problem description
This appears to be similar to other blind motors - just another variation on the manufacturer name?
https://www.aliexpress.com/item/1005002954586484.html?spm=a2g0o.order_list.order_list_main.5.529e1802C56G4M
Solution description
Hopefully is just a simple port of the other quirks for similar devices
Screenshots/Video
Screenshots/Video
Device signature
Device signature
{
"node_descriptor": "NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *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": "0x0051",
"input_clusters": [
"0x0000",
"0x0004",
"0x0005",
"0xef00"
],
"output_clusters": [
"0x000a",
"0x0019"
]
}
},
"manufacturer": "_TZE200_libht6ua",
"model": "TS0601",
"class": "zigpy.device.Device"
}
Diagnostic information
Diagnostic information
{
"home_assistant": {
"installation_type": "Home Assistant OS",
"version": "2023.10.1",
"dev": false,
"hassio": true,
"virtualenv": false,
"python_version": "3.11.5",
"docker": true,
"arch": "aarch64",
"timezone": "Australia/Sydney",
"os_name": "Linux",
"os_version": "6.1.21-v8",
"supervisor": "2023.10.0",
"host_os": "Home Assistant OS 10.5",
"docker_version": "23.0.6",
"chassis": "embedded",
"run_as_root": true
},
"custom_components": {
"zha_toolkit": {
"version": "v1.1.2",
"requirements": [
"pytz"
]
},
"scheduler": {
"version": "v0.0.0",
"requirements": []
},
"bureau_of_meteorology": {
"version": "1.1.21",
"requirements": [
"iso8601"
]
},
"sonoff": {
"version": "3.5.2",
"requirements": [
"pycryptodome>=3.6.6"
]
},
"project_zero_three": {
"version": "1.0.1",
"requirements": []
},
"sleep_as_android": {
"version": "2.2.0",
"requirements": [
"pyhaversion"
]
},
"hass_agent": {
"version": "2022.11.9",
"requirements": []
},
"artnet_led": {
"version": "0.1.1",
"requirements": [
"pyartnet==1.0.1"
]
},
"opennem": {
"version": "2022.09.1",
"requirements": []
},
"adaptive_lighting": {
"version": "1.19.0",
"requirements": [
"ulid-transform"
]
},
"powercalc": {
"version": "v1.9.5",
"requirements": [
"numpy>=1.21.1"
]
},
"hacs": {
"version": "1.33.0",
"requirements": [
"aiogithubapi>=22.10.1"
]
}
},
"integration_manifest": {
"domain": "zha",
"name": "Zigbee Home Automation",
"after_dependencies": [
"onboarding",
"usb"
],
"codeowners": [
"@dmulcahey",
"@adminiuga",
"@puddly"
],
"config_flow": true,
"dependencies": [
"file_upload"
],
"documentation": "https://www.home-assistant.io/integrations/zha",
"iot_class": "local_polling",
"loggers": [
"aiosqlite",
"bellows",
"crccheck",
"pure_pcapy3",
"zhaquirks",
"zigpy",
"zigpy_deconz",
"zigpy_xbee",
"zigpy_zigate",
"zigpy_znp",
"universal_silabs_flasher"
],
"requirements": [
"bellows==0.36.5",
"pyserial==3.5",
"pyserial-asyncio==0.6",
"zha-quirks==0.0.104",
"zigpy-deconz==0.21.1",
"zigpy==0.57.2",
"zigpy-xbee==0.18.3",
"zigpy-zigate==0.11.0",
"zigpy-znp==0.11.5",
"universal-silabs-flasher==0.0.14",
"pyserial-asyncio-fast==0.11"
],
"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": "_uzg-01._tcp.local.",
"name": "uzg-01*"
},
{
"type": "_slzb-06._tcp.local.",
"name": "slzb-06*"
}
],
"is_built_in": true
},
"data": {
"ieee": "**REDACTED**",
"nwk": 7175,
"manufacturer": "_TZE200_libht6ua",
"model": "TS0601",
"name": "_TZE200_libht6ua TS0601",
"quirk_applied": false,
"quirk_class": "zigpy.device.Device",
"manufacturer_code": 4098,
"power_source": "Battery or Unknown",
"lqi": 255,
"rssi": -64,
"last_seen": "2023-10-10T11:08:48",
"available": true,
"device_type": "EndDevice",
"signature": {
"node_descriptor": "NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, manufacturer_code=4098, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *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": "0x0051",
"input_clusters": [
"0x0000",
"0x0004",
"0x0005",
"0xef00"
],
"output_clusters": [
"0x000a",
"0x0019"
]
}
},
"manufacturer": "_TZE200_libht6ua",
"model": "TS0601"
},
"active_coordinator": false,
"entities": [],
"neighbors": [],
"routes": [],
"endpoint_names": [
{
"name": "SMART_PLUG"
}
],
"user_given_name": "Smart Blind",
"device_reg_id": "50c44ae063ea88828f2f152cdcb780e7",
"area_id": "632ad7cfddb44066b0601b811c5dafb8",
"cluster_details": {
"1": {
"device_type": {
"name": "SMART_PLUG",
"id": 81
},
"profile_id": 260,
"in_clusters": {
"0x0000": {
"endpoint_attribute": "basic",
"attributes": {
"0x0001": {
"attribute_name": "app_version",
"value": 65
},
"0x0004": {
"attribute_name": "manufacturer",
"value": "_TZE200_libht6ua"
},
"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": null,
"attributes": {},
"unsupported_attributes": {}
}
},
"out_clusters": {
"0x0019": {
"endpoint_attribute": "ota",
"attributes": {},
"unsupported_attributes": {}
},
"0x000a": {
"endpoint_attribute": "time",
"attributes": {},
"unsupported_attributes": {}
}
}
}
}
}
}
Logs
Logs
[Paste the logs here]
Custom quirk
Custom quirk
[Paste your custom quirk here]
Additional information
No response
I have the same blind motor... How can this be added to HA?
I have the same blind motor... How can this be added to HA?
I ended up just buying the cheapest Tuya wireless hub and then integrated via local Tuya. Doesn't bring in the temperature or its battery state, but it's a start...
I would also like a quirk for this device.
I have the same motor for Tuya's blind that appears to me as unsupported if someone could help us I would appreciate it
I'm working on being able to add it to z2m, I would say it's ready but I need to learn how to upload it to the code... while I'm learning, if anyone wants to try it, I uploaded it here https://github.com/javilopezalarcon/Blind-motor-_TZE200_libht6ua-z2m It works well, with position and battery control, the motor failure remains to be tested if it is real.
Does this also work without zigbee2mqtt? I only have ZHA plugin installed.
Op za 25 nov 2023 om 17:31 schreef javilopezalarcon < @.***>:
I'm working on being able to add it to z2m, I would say it's ready but I need to learn how to upload it to the code... while I'm learning, if anyone wants to try it, I uploaded it here https://github.com/javilopezalarcon/Blind-motor-_TZE200_libht6ua-z2m It works well, with position and battery control, the motor failure remains to be tested if it is real.
— Reply to this email directly, view it on GitHub https://github.com/zigpy/zha-device-handlers/issues/2636#issuecomment-1826371670, or unsubscribe https://github.com/notifications/unsubscribe-auth/A5CTKMN7SCNG4GLAVX24WEDYGIMMPAVCNFSM6AAAAAA5ZP6B6WVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMRWGM3TCNRXGA . You are receiving this because you commented.Message ID: @.***>
I'm working on being able to add it to z2m, I would say it's ready but I need to learn how to upload it to the code... while I'm learning, if anyone wants to try it, I uploaded it here https://github.com/javilopezalarcon/Blind-motor-_TZE200_libht6ua-z2m It works well, with position and battery control, the motor failure remains to be tested if it is real.
Thx for converter, now I found this motor have very limited range opening/closing 0-100, its not enough to open curtains, any ideas? Thank you!
It sounds like your unit is in 'tilt' mode, which is just for adjusting the angle of venetian blinds. From memory these instructions, which are actually for a different unit, also worked for this one, despite its very incomplete included manual.
I'm working on being able to add it to z2m, I would say it's ready but I need to learn how to upload it to the code... while I'm learning, if anyone wants to try it, I uploaded it here https://github.com/javilopezalarcon/Blind-motor-_TZE200_libht6ua-z2m It works well, with position and battery control, the motor failure remains to be tested if it is real.
Thanks for the converter @javilopezalarcon. I managed to figure out that datapoint 101 is for motor direction and 102 sets the upper limit and have made the following changes to your converter.
exposes: [
...,
e.enum('motor_direction', ea.STATE_SET, ['left', 'right']).withDescription('Motor side'),
e.enum('set_upper_limit', ea.STATE_SET, ['start', 'stop']).withDescription('Learning')
],
meta: {
tuyaDatapoints: [
...,
[101, 'motor_direction', tuya.valueConverterBasic.lookup({ 'left': tuya.enum(0), 'right': tuya.enum(1) })],
[102, 'set_upper_limit', tuya.valueConverterBasic.lookup({ 'start': tuya.enum(0), 'stop': tuya.enum(1) })],
],
},
@env-dxb I had a similar problem to you until I found out about setting an upper limit. You can try the following to see if it helps.
- Manually close your curtains
- While the curtains are shut, connect them to the motor
- Click "start" under "Set upper limit" to start learning the upper limit of your curtain. The motor should begin to open the curtain
- Just before the curtain is fully open, click "stop" under "Set upper limit"
- The controller should now remember the fully close and open positions
It sounds like your unit is in 'tilt' mode, which is just for adjusting the angle of venetian blinds. From memory these instructions, which are actually for a different unit, also worked for this one, despite its very incomplete included manual.
Tilt mode exactly what I need, but it’s about half of required limit, and manual doesn’t work for me as well(( But I keep trying)
I'm working on being able to add it to z2m, I would say it's ready but I need to learn how to upload it to the code... while I'm learning, if anyone wants to try it, I uploaded it here https://github.com/javilopezalarcon/Blind-motor-_TZE200_libht6ua-z2m It works well, with position and battery control, the motor failure remains to be tested if it is real.
Thanks for the converter @javilopezalarcon. I managed to figure out that datapoint 101 is for motor direction and 102 sets the upper limit and have made the following changes to your converter.
exposes: [ ..., e.enum('motor_direction', ea.STATE_SET, ['left', 'right']).withDescription('Motor side'), e.enum('set_upper_limit', ea.STATE_SET, ['start', 'stop']).withDescription('Learning') ], meta: { tuyaDatapoints: [ ..., [101, 'motor_direction', tuya.valueConverterBasic.lookup({ 'left': tuya.enum(0), 'right': tuya.enum(1) })], [102, 'set_upper_limit', tuya.valueConverterBasic.lookup({ 'start': tuya.enum(0), 'stop': tuya.enum(1) })], ], },
@env-dxb I had a similar problem to you until I found out about setting an upper limit. You can try the following to see if it helps.
- Manually close your curtains
- While the curtains are shut, connect them to the motor
- Click "start" under "Set upper limit" to start learning the upper limit of your curtain. The motor should begin to open the curtain
- Just before the curtain is fully open, click "stop" under "Set upper limit"
- The controller should now remember the fully close and open positions
Seems I need a hub and app for it, I don’t)
Kind of weird the way this issue on the ZHA repository has turned into a Zigbee2MQTT thread, but hopefully that will lead to a quirk being available for ZHA I guess?
Kind of weird the way this issue on the ZHA repository has turned into a Zigbee2MQTT thread, but hopefully that will lead to a quirk being available for ZHA I guess?
Yeah, I have homebridge based on raspberry and zigbee. That’s why. I spent a lot of time to connect this motor to any system, but all I get is sleepless nights and state in mqtt. I returned it today. Enough)
Thank you very much @env-dxb for the contribution of the new sensors, I will add them before sending it to z2m (sorry for the delay, I was very busy) 👍🏻👍🏻
It's my fault for converting this from zha to z2m, I'm sorry @kineticscreen ... I was the same, I couldn't find anything that worked for me and I found this thread, where I saw that there were more people like me, in zha yes, but like me, without integration. .. I started to work to be able to add it in z2m and I wanted you to be the first to know, since you were like me... I imagine, that having the data from each sensor, passing it to zha will be much easier than not having anything, If it helps, I already fulfilled what I wanted, which was to help 😅
But is it possible to make it work in ZHA?
Also interested in this.
I've had some success by using the following quirk:
"""Tuya based cover and blinds."""
from zigpy.profiles import zha
from zigpy.zcl.clusters.general import Basic, Groups, Identify, OnOff, Ota, Scenes, Time
from zhaquirks.const import (
DEVICE_TYPE,
ENDPOINTS,
INPUT_CLUSTERS,
MODELS_INFO,
OUTPUT_CLUSTERS,
PROFILE_ID,
)
from zhaquirks.tuya import (
TuyaManufacturerWindowCover,
TuyaManufCluster,
TuyaWindowCover,
TuyaWindowCoverControl,
)
class TuyaMoesCover0601(TuyaWindowCover):
"""Tuya blind controller device."""
tuya_cover_inverted_by_default = True
signature = {
# "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=128, manufacturer_code=4098,
# maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264,
# maximum_outgoing_transfer_size=82, descriptor_capability_field=0)",
# "endpoints": {
# "1": { "profile_id": 260, "device_type": "0x0051", "in_clusters": [ "0x0000", "0x0004","0x0005","0xef00"], "out_clusters": ["0x000a","0x0019"] }
# },
# "manufacturer": "_TZE200_zah67ekd",
# "model": "TS0601",
# "class": "zigpy.device.Device"
# }
MODELS_INFO: [
("_TZE200_libht6ua", "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,
TuyaManufCluster.cluster_id,
],
OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
}
},
}
replacement = {
ENDPOINTS: {
1: {
DEVICE_TYPE: zha.DeviceType.WINDOW_COVERING_DEVICE,
INPUT_CLUSTERS: [
Basic.cluster_id,
Groups.cluster_id,
Scenes.cluster_id,
TuyaManufacturerWindowCover,
TuyaWindowCoverControl,
],
OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
}
}
}
Opening and closing works, which is what i need. I set the open and close positions by using the buttons on the device itself.
Does the quirk expose anything else, like Battery status etc? Or just basic up down. Does it support percentage adjustments?
It supports percentage adjustments but no battery status yet. I planed to do more research in this device tomorrow. Maybe i'm able to figure out how the battery status reporting works.
Kinetic Screen @.***> schrieb am Sa., 17. Feb. 2024, 06:01:
Does the quirk expose anything else, like Battery status etc? Or just basic up down. Does it support percentage adjustments?
— Reply to this email directly, view it on GitHub https://github.com/zigpy/zha-device-handlers/issues/2636#issuecomment-1949649832, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAZ6YERC6TWM4UTKDLEGKDYUA2UFAVCNFSM6AAAAAA5ZP6B6WVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTSNBZGY2DSOBTGI . You are receiving this because you are subscribed to this thread.Message ID: @.***>
Taking the tuya 0610 cover quirk and adding the device to the MODELS_INFO
of the TuyaZemismartSmartCover0601_3
class also seems somewhat work, probably similar to https://github.com/zigpy/zha-device-handlers/issues/2636#issuecomment-1946870127
modified MODELS_INFO, line 173
MODELS_INFO: [
("_TZE200_fzo2pocs", "TS0601"),
("_TZE200_iossyxra", "TS0601"),
("_TZE200_pw7mji0l", "TS0601"),
("_TZE200_libht6ua", "TS0601"), # <-- This is the one I added
],
EDIT: I just realized that those two are virtually identical, so makes sense both would work.
Also, I think it's in "tilt" mode. I tried the method described above to change, but this didn't work, I just lost the connection to ZHA (I think it went into pairing mode).
@TeaMoe, how do you "set the open and close positions by using the buttons on the device itself."?
Hey guys, converter by @javilopezalarcon with modifications by @fearless666 worked well, thanks a lot. However, I have a slight issue I imagine can be fixed in code but I am quite a newbie so struggling on how to do so.
When pressing up or down in HA, it does the opposite of what the buttons do in the remote and the device. Now, it doesn’t matter on whether it is set on right config or left config, they are always the opposite of each other. Can anyone help with a fix perhaps?
@helzarto I am really sorry to apparently ask a dumb question. How did you add the converter _TZE200_libht6ua.js to HA and zigbee2mqqt? (i am really new to HA). Help is really appreciated and sorry for "pushing" the thread to HA Z2M again.
Edit: Got it running. I did everything "right" but there was a change because of the last update: https://github.com/Koenkk/zigbee2mqtt/issues/22083#issuecomment-2037342969
Hey guys, converter by @javilopezalarcon with modifications by @fearless666 worked well, thanks a lot. However, I have a slight issue I imagine can be fixed in code but I am quite a newbie so struggling on how to do so.
When pressing up or down in HA, it does the opposite of what the buttons do in the remote and the device. Now, it doesn’t matter on whether it is set on right config or left config, they are always the opposite of each other. Can anyone help with a fix perhaps?
Hi there, did You solve this issue - And do You have the battery-state?