Zigbee2mqtt unsupported device TS0601

Hi, I am new to home assistant + Zigbee, trying to configure a Zemismart ZM25R3 roller blind bought from aliexpress. I am having issues pairing the motor with zigbee2mqtt. In the logs it says device unsupported.

Here is a snippet of the log.

z2m: Removing device '0x0c2a6ffffea29acd' (block: false, force: false)
z2m:mqtt: MQTT publish: topic 'homeassistant/sensor/0x0c2a6ffffea29acd/linkquality/config', payload ''
z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x0c2a6ffffea29acd', payload ''
z2m: Successfully removed device '0x0c2a6ffffea29acd' (block: false, force: false)
z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/bridge/response/device/remove', payload '{"data":{"block":false,"force":false,"id":"0x0c2a6ffffea29acd"},"status":"ok","transaction":"h9o59-13"}'
z2m: Zigbee: allowing new devices to join.
z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/bridge/response/permit_join', payload '{"data":{"time":254},"status":"ok","transaction":"h9o59-14"}'
zh:controller: Interview for '0x0c2a6ffffea29acd' started
z2m: Device '0x0c2a6ffffea29acd' joined
z2m: Starting interview of '0x0c2a6ffffea29acd'
z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x0c2a6ffffea29acd","ieee_address":"0x0c2a6ffffea29acd"},"type":"device_joined"}'
z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x0c2a6ffffea29acd","ieee_address":"0x0c2a6ffffea29acd","status":"started"},"type":"device_interview"}'
z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x0c2a6ffffea29acd","ieee_address":"0x0c2a6ffffea29acd"},"type":"device_announce"}'
zh:controller: Succesfully interviewed '0x0c2a6ffffea29acd'
z2m: Successfully interviewed '0x0c2a6ffffea29acd', device has successfully been paired
warning 2025-08-28 21:42:25z2m: Device '0x0c2a6ffffea29acd' with Zigbee model 'TS0601' and manufacturer name '_TZE200_sq6affpe' is NOT supported, please follow https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html
z2m:mqtt: MQTT publish: topic 'homeassistant/sensor/0x0c2a6ffffea29acd/linkquality/config', payload '{"availability":[{"topic":"zigbee2mqtt/bridge/state","value_template":"{{ value_json.state }}"}],"device":{"hw_version":1,"identifiers":["zigbee2mqtt_0x0c2a6ffffea29acd"],"manufacturer":"_TZE200_sq6affpe","model":"Automatically generated definition","model_id":"TS0601","name":"0x0c2a6ffffea29acd","via_device":"zigbee2mqtt_bridge_0x00124b0032d3ecf5"},"enabled_by_default":false,"entity_category":"diagnostic","icon":"mdi:signal","name":"Linkquality","object_id":"0x0c2a6ffffea29acd_linkquality","origin":{"name":"Zigbee2MQTT","sw":"2.6.0","url":"https://www.zigbee2mqtt.io"},"state_class":"measurement","state_topic":"zigbee2mqtt/0x0c2a6ffffea29acd","unique_id":"0x0c2a6ffffea29acd_linkquality_zigbee2mqtt","unit_of_measurement":"lqi","value_template":"{{ value_json.linkquality }}"}'
z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"definition":{"description":"Automatically generated definition","exposes":[{"access":1,"category":"diagnostic","description":"Link quality (signal strength)","label":"Linkquality","name":"linkquality","property":"linkquality","type":"numeric","unit":"lqi","value_max":255,"value_min":0}],"model":"TS0601","options":[],"source":"generated","supports_ota":false,"vendor":"_TZE200_sq6affpe"},"friendly_name":"0x0c2a6ffffea29acd","ieee_address":"0x0c2a6ffffea29acd","status":"successful","supported":false},"type":"device_interview"}' />

How could this device be paired.

Thanks

It’s pairing :arrow_up:

Review this from Z2M

Thanks [LiQuid_cOOled], I went through this link to try an add an extension, tried to follow the instructions. It refers to look at existing device (https://existingdevices). Under Zemismart.ts there is already a definition for “_TZE200_sq6affpe”

    {
        fingerprint: tuya.fingerprint("TS0601", ["_TZE200_1vxgqfba", "_TZE200_wdfurkoa", "_TZE200_sq6affpe"]),
        model: "ZM25R1",
        vendor: "Zemismart",
        description: "Tubular motor",
        fromZigbee: [legacy.fromZigbee.tuya_cover, tuya.fz.datapoints],
        toZigbee: [legacy.toZigbee.tuya_cover_control, tuya.tz.datapoints],
        exposes: [
            e.cover_position().setAccess("position", ea.STATE_SET),
            e.enum("motor_direction", ea.STATE_SET, ["normal", "reversed"]).withDescription("Motor direction").withCategory("config"),
            e
                .enum("motor_working_mode", ea.STATE_SET, ["continuous", "intermittently"])
                .withDescription("Motor operating mode")
                .withCategory("config"),
            e.enum("remote_pair", ea.STATE_SET, ["on", "off"]).withDescription("Remote control pairing mode").withCategory("config"),
            e.enum("upper_stroke_limit", ea.STATE_SET, ["SET", "RESET"]).withDescription("Set / Reset the upper stroke limit").withCategory("config"),
            e
                .enum("middle_stroke_limit", ea.STATE_SET, ["SET", "RESET"])
                .withDescription("Set / Reset the middle stroke limit")
                .withCategory("config"),
            e.enum("lower_stroke_limit", ea.STATE_SET, ["SET", "RESET"]).withDescription("Set / Reset the lower stroke limit").withCategory("config"),
        ],
        whiteLabel: [tuya.whitelabel("Zemismart", "ZM25R3", "Tubular motor", ["_TZE200_sq6affpe"])],
        meta: {
            // All datapoints go in here
            tuyaDatapoints: [
                [5, "motor_direction", tuya.valueConverter.tubularMotorDirection],
                [101, "remote_pair", tuya.valueConverterBasic.lookup({on: true, off: false})],
                [103, "upper_stroke_limit", tuya.valueConverterBasic.lookup({SET: true, RESET: false})],
                [104, "middle_stroke_limit", tuya.valueConverterBasic.lookup({SET: true, RESET: false})],
                [105, "lower_stroke_limit", tuya.valueConverterBasic.lookup({SET: true, RESET: false})],
                [106, "motor_working_mode", tuya.valueConverterBasic.lookup({continuous: tuya.enum(0), intermittently: tuya.enum(1)})],
            ],
        },
    },```

I added this file under

>  `data/external_converters/`

and also under

> homeassistant/zigbee2mqtt/external_converters

Tried repairing the device. I am not sure if i have added the extension correctly. I am new to this. As its still same in the logs it says 

info 2025-09-05 16:51:37zh:controller: Succesfully interviewed ‘0x0c2a6ffffea29acd’
info 2025-09-05 16:51:37z2m: Successfully interviewed ‘0x0c2a6ffffea29acd’, device has successfully been paired
warning 2025-09-05 16:51:37z2m: Device ‘0x0c2a6ffffea29acd’ with Zigbee model ‘TS0601’ and manufacturer name ‘_TZE200_sq6affpe’ is NOT supported, please follow https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.htm

This was recently added, so might not be yet in 2.6.1 (if not use the dev/edge version)

Thanks a lot Francisp, I installed the dev version and it can recognize this device.

I’ve gone down the same road as you and have several ZM25R3 installed via Z2M. The support is now on the main branch also.
Although I can’t set the position of the blinds, and it’s reported position seems to be inverted, or only 0 or 1.
The only function that works is the open/close/stop.
Have you had this problem or found a solution?

Thanks for letting me know, I tried setting the position but didnt work. Also you are right the motor seem to be inverted. At this stage didnt find a solution. Still learning about zigbee devices and their settings.

You can change this setting according to the docs.

Open Z2M in your sidebar > Click your device in the Devices Page > Go to Settings (Specific) > Set invert_cover to true.

@burnsy180 the above applies for you too.

So these still don’t work correctly, even with the invert_cover = true set.
The only way I can control these reliably is within Z2M, exposes tab, and clicking the OPEN/CLOSE/STOP buttons. These work initially within HA, however the position gets messed up and then the open button is disabled when it’s closed. Setting optimistic: false at least seems to stop the buttons getting disabled.
It reports "position": 99 or "state": "OPEN" when fully closed or after pressing the CLOSE button, regardless of where it stops.
Position changes to "position": 100 after you press the OPEN button and stays there until it fully opens.
Using the position slider in Z2M or HA does nothing. It seems this is an issue with position reporting, i’m currently down the rabbithole of external converters and trying to test things, no luck so far.

So in a nutshell, the blind always reports OPEN. 100% when fully open, 99% open in any other position. But then using the remote messes up the position again.

Just heads up, I think ive figured out an external converter that works for my ZM25R3: [External Converter] zemismart zm25r3 · Issue #9803 · Koenkk/zigbee-herdsman-converters · GitHub Hopefully it helps you too!

I tried steps of manually adding the code you shared https://github.com/Koenkk/zigbee-herdsman-converters/issues/9803#issuecomment-3314453794
into both the locations

/config/zigbee2mqtt/external_converters/zemismart_zm25r3.js
/homeassistant/zigbee2mqtt/external_converters/zemismart_zm25r3.js

Updated /homeassistant/zigbee2mqtt/configuration.yaml, but got a syntax error.

So i removed them from the yaml file and just restarted zigbee2mqtt. On restart for this device under exposed tab i saw very few settings, mainly just open,close,stop.

Is this expected or did i miss a step.

You legend! I’ve been deep into ChatGPT and Gemini trying to get them to sort this out, and they’ve both gone round in circles and solved nothing. But thank you!
I’ve added the external_converter as you’ve suggested and Z2M has picked it up and seems to be working perfectly. Blinds drive to requested % positions and report OPEN/CLOSED or the correct position % correctly.
Same as you though, battery has not reported yet.

Did you find a way to set upper and lower limit for this motor. I tried setting stroke limit but it doesnt work.