Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Device Support Request] Blind motor "_TZE200_libht6ua" #2636

Open
kineticscreen opened this issue Oct 10, 2023 · 24 comments
Open

[Device Support Request] Blind motor "_TZE200_libht6ua" #2636

kineticscreen opened this issue Oct 10, 2023 · 24 comments
Labels
Tuya Request/PR regarding a Tuya device

Comments

@kineticscreen
Copy link

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

blindmotorbox

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

@TheJulianJES TheJulianJES added the Tuya Request/PR regarding a Tuya device label Oct 16, 2023
@superflyman74
Copy link

superflyman74 commented Nov 2, 2023

I have the same blind motor... How can this be added to HA?

@kineticscreen
Copy link
Author

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...

Screenshot_20231116-163808
Screenshot_20231116-163741

@hplar11111
Copy link

I would also like a quirk for this device.

@javilopezalarcon
Copy link

I have the same motor for Tuya's blind that appears to me as unsupported if someone could help us I would appreciate it

@javilopezalarcon
Copy link

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.

@hplar11111
Copy link

hplar11111 commented Nov 27, 2023 via email

@env-dxb
Copy link

env-dxb commented Nov 30, 2023

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!

@kineticscreen
Copy link
Author

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.

image

@fearless666
Copy link

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.

  1. Manually close your curtains
  2. While the curtains are shut, connect them to the motor
  3. Click "start" under "Set upper limit" to start learning the upper limit of your curtain. The motor should begin to open the curtain
  4. Just before the curtain is fully open, click "stop" under "Set upper limit"
  5. The controller should now remember the fully close and open positions

@env-dxb
Copy link

env-dxb commented Dec 1, 2023

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.

image

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)

@env-dxb
Copy link

env-dxb commented Dec 1, 2023

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.

  1. Manually close your curtains
  2. While the curtains are shut, connect them to the motor
  3. Click "start" under "Set upper limit" to start learning the upper limit of your curtain. The motor should begin to open the curtain
  4. Just before the curtain is fully open, click "stop" under "Set upper limit"
  5. The controller should now remember the fully close and open positions

Seems I need a hub and app for it, I don’t)

@kineticscreen
Copy link
Author

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?

@env-dxb
Copy link

env-dxb commented Dec 3, 2023

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)

@javilopezalarcon
Copy link

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) 👍🏻👍🏻

@javilopezalarcon
Copy link

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 😅

@hplar11111
Copy link

But is it possible to make it work in ZHA?

@oxcid3
Copy link

oxcid3 commented Dec 23, 2023

Also interested in this.

@TeaMoe
Copy link

TeaMoe commented Feb 15, 2024

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.

@kineticscreen
Copy link
Author

Does the quirk expose anything else, like Battery status etc? Or just basic up down. Does it support percentage adjustments?

@TeaMoe
Copy link

TeaMoe commented Feb 17, 2024 via email

@Aephir
Copy link

Aephir commented Feb 20, 2024

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 #2636 (comment)

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."?

@helzarto
Copy link

helzarto commented Mar 6, 2024

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?

Blinds remote

@hannes2984
Copy link

hannes2984 commented Apr 11, 2024

@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: Koenkk/zigbee2mqtt#22083 (comment)

@DuploDom
Copy link

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?

Blinds remote

Hi there, did You solve this issue - And do You have the battery-state?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Tuya Request/PR regarding a Tuya device
Projects
None yet
Development

No branches or pull requests