Zemismart ZM25 Zigbee howto (Tubular roller blind/shade/cover motor)

Hi everyone,

In this post I will share my experiences with the Zemismart ZM25 Zigbee roller blind motor (I’ll call it motor from here on), how I’ve configured it and got it to work with Home Assistant.

I have 6 of these motors. I bought one with a 9 channel 433MHz RF remote and bought the rest as motor only without an additional RF remote. You need at least 1 remote to set up the Upper and Lower limits since you can not set them any other way (at least as of now). Also, you should always have a fail-safe manual control option as a backup which will be the 433MHz RF control with the remote. A 9-channel remote means that it can control up to 9 different motors.

This motor works with the Zigbee2MQTT addon and it works very well. I’ve also tried it with ZHA but it didn’t work consistently that way. It is very silent and features position indication as well as position setting.

Keep in mind that if you’re already using ZHA, you need an additional Zigbee dongle to use with Zigbee2MQTT addon. You can not use the same USB Zigbee dongle for ZHA and Zigbee2MQTT at the same time.

All the configuration of the motor is done with the single recessed button on it.

To factory reset the motor, first hold the button on the motor until it makes a short up-and-down movement or a single short movement. Then quick press the same button 5 times. It will respond with a short up-and-down movement. Factory reset is complete, meaning Zigbee and 433Mhz RF remote pairing information on the motor is cleared.

To pair with the 433Mhz RF remote, first select the desired channel on your remote. Then single click the button on the motor. It will respond with a short up-and-down movement. It’s now in RF pairing mode. Then click the Down button, Stop button and the Up buttons one by one. It should be paired now. You can now control the motor with the RF remote.

To set the Upper or Lower limit points on the motor, using the remote move the blind to the desired upper or lower limit position, then click the recessed set button on the back of the remote once. You will see ‘1’ on the remote screen. This is a temporary mode of the remote which stays active for about a couple of seconds until the remote display clears. Now, while you have the ‘1’ on the remote screen, remote is in the mode to send the ‘set limit position’ command to the motor either for the upper limit or the lower limit. Click the Up button on the remote to set the upper limit or Down button to set the lower limit. The motor will reply by a short up-and-down movement to indicate limit is set.

To clear the upper or lower limit setting in the motor, click the recessed set button on the back of the remote 3 times. You will see ‘3’ on the remote screen. This means the remote is temporarily in the mode to send the ‘clear-limit-position’ command. While the screen showing 3, either click the Down button to clear the lower limit or click the Up button to clear the upper limit. The motor will reply by a short up-and-down movement to indicate that the limit is cleared.

To pair the motor with your Zigbee coordinator, click the ‘Permit join (All)’ button on the sidebar Zigbee2MQTT interface. Now slowly click the motor button 3 times, waiting for the motor to respond with the short up-and-down movement between each click.
So this will be like: Click, <>movement, Click, <>movement, Click, <>movement. Now the motor is in Zigbee pairing mode. It will shortly appear in the Zigbee2MQTT devices section.

Next thing is to rename your shade entitiy and give it a descriptive name. It will by default have a hex value name. The easiest is to click the blue ‘rename device’ button on the right side of the device in the devices list of Zigbee2MQTT interface. Turn on ‘Update Home Assistant entity ID’ and give it a name like ‘Shade 1’. This will rename the device name shown in Zigbee2MQTT as well as the entitiy id in Home Assistant which will help you to identify the specific motor in Home Assistant. Now restart Home Assistant. You should also mark your motor with ‘1’ so you would know which one it is. Now we know which motor is which entity in Home Assistant. Now you can go and change the name (not the entitiy id) of the entitiy specific to where you’ve installed it. Go to Settings in Home Assistant side bar, click ‘Devices & Services’ and click devices in ‘Mosquitto broker / MQTT’ integration. Click on the device you want to rename and click the entity under ‘Controls’, goto entitiy Settings and enter something like ‘Kitchen Shade’ or ‘Bedroom Shade Left’ to the Name field. The entitiy id is still ‘cover.shade_1’ so you know which motor it is and the name is ‘Kitchen Shade’. If you name your device id and name this way, if you install it somewhere else you can easily change the name and keep the same id. Basically you use the entitiy id to keep track of the physical motors and the entitiy names to keep track of installation location.

The 9-channel RF remote also has a channel called ‘C’. In this mode you can control all of your shades/motors at the same time. This is similar to the ‘cover group’ helper entitiy in Home Assistant. If you have multiple motors, you can group them with the ‘cover group’ helper entitiy and control all of them with voice if you expose the group entitiy to google home.

I hope this will be helpful.

8 Likes

Thank you for this amazing write up. Extremely helpful.

I just bought a bunch of these motors and the 9 channel remote.

FYI, on the remote the set menu item 5 seems to un-pair the motor from the remote! Be warned.

That said, I have somehow managed to delete 7 out of the nine channels on the remote itself. Scrolling through the channels only gives me 1, 2 & C.

Any ideas on how I can get those additional channels back?

Or reset the remote?

Update: Zemismart replied to me on AliExpress

You can unlock the remote as follows:

I also found the original manual online posted on a Korean blog:

2 Likes

Thanks, this manual helped me out with everything.

  1. Pairing with the remote
  2. Change motor control direction
  3. Setting limits

Zemismart provided me with the manual for the ZM25 too; I think it’s pretty similar to the one above.

1 Like

Thanks so much the printed instructions with my motors was wrong for the limit setting with their RF 9 channel. You saved me a lot of pain!

Hi, I’m planning to use one of these for one of my DIY project. Do you happen to know if the tube can be turned by hand still? I’d assume it might mess up the limits, but let’s assuming there is no power, can you still operate by hand? I’m actually planning to us it in a sliding door, so even if there is power, I might open it by hand, but then the closing would be automatic.

I guess you can not. it is pretty stiff.
I mean it’s more stiff than you might want to manually do anything with it.

Hi I have two blinds at right angles. I have a double mains socket in the middle just above the point the two blinds meet. I’d therefore like to install the motor on the Right Hand side of the Left blind and on the Left Hand side of the Right blind. This way the mains cords will be really close to the mains socket. I believe this will mean the motor direction of travel will be different on each blind. How can I ensure that that they both go up and down using the up and down button on the 9 channel remote. Any advice, gratefully received. Kenny

Ik heb het antwoord hier gevonden:

@kenny0961, I haven’t tried this yet but you should be able to adjust that with the remote.
I have the same problem but I haven’t installed my motors yet.

If you quickly press the ‘set’ button on the back of the remote until you see 4 on screen, you should be able to switch direction for a specific channel when you press the UP key once. Press UP again to switch direction again.

During this ‘set’ mode 4, UP is for direction change, STOP is for channel lock, DOWN button is for setting slow pause.

After going into ‘set’ mode 4, waiting about 5 seconds without pressing anything should take the remote out of set mdoe 4 and into normal operation mode.

I’ll try this myself too and report back here.

I hope this helps

Even if the motor torque is enought to move a door, this is extemely slow to use with a door. Additioanally you need the following features with sliding doors; you want the ability to 1) optionally trigger the motorized sliding action by manually sliding the door 2) optionally move the door freely without electricity after an initial small resistance. 3) optionally lock movement completely.

I just want to share another thing I realized.
My RF remote is not working very effectively for some reason. Some channels work better than others. This is not a big problem since I’m using my roller motors with home assistant over zigbee.
However, I need the remote to set the upper / lower limits and set the reverse function on the motors.

I found a quick fix to this problem. Holding my finger on the antenna part of the circuit while using the remote solved the problem.


So to make a premanent fix, I soldered a wire to the antenna and hid the wire in the remote enclosure.
This fixed all the remote problems for good. Now it even works from the other side of the room.

I’ve bought a couple of these motors to test them and was hoping that I could set the limits directly from Zigbee2MQTT instead of needing a remote. It looks like it can be done via the Tuya app using their Zigbee gateway, so there might be some custom Zigbee command I can send.

I also have an IR and 433MHz hub running ESPHome that could use to send remote commands. Does anyone else have an RF integration set up with ESPHome? It would be awesome if you could record the signals sent by the remote and reverse engineer the commands for setting upper and lower limits. I’m even tempted to use the 433MHz signals to control the blinds instead of Zigbee, because my WiFi devices tend to be a bit more reliable and faster than my Zigbee network. I already have IR hubs set up to control my air conditioners, and they have support for 433MHz RF as well. I’m using these hubs from AliExpress.

I will probably just order a remote now, but it will take 2-3 weeks to arrive so I am still interested in other methods. (Otherwise I’ll post some info myself once I get the remote and reverse engineer it.)

—-

EDIT: Oh cool, some people seem to have figured out the commands in the comments on this zigbee2mqtt GitHub issue: TS0601 _TZE200_fzo2pocs (Zemismart ZM25TQ) - position and motor speed issue · Issue #11164 · Koenkk/zigbee2mqtt · GitHub

bool,103,1 to set up an upper limit
bool,105,1 to set up the down limit
bool,104,1 to set up the middle limit

3 Likes

Awesome, I was able to set the limits by manually publishing some messages to MQTT.

I wrote a script for Home Assistant to make this easier:

alias: Update Zemismart ZM25 Blind Motor Limit
fields:
  entity_id:
    required: true
    description: Entity ID of your cover entity
    example: cover.blinds
    selector:
      entity:
        filter:
          domain: cover      
  limit:
    required: true
    description: "Type of limit: upper, lower, middle"
    default: upper
    selector:
      select:
        options:
          - upper
          - middle
          - lower
  action:
    required: true
    description: Set or unset limit
    default: set
    selector:
      select:
        options:
          - set
          - unset
mode: single
icon: mdi:blinds
sequence:
  - service: mqtt.publish
    data:
      qos: 0
      retain: false
      topic: >-
        zigbee2mqtt/{{ states[entity_id].attributes.friendly_name
        }}/set/tuya_data_point_test
      payload_template: >-
        bool,{{"103" if limit == "upper" else ("105" if limit == "lower" else
        "104")}},{{"1" if action == "set" else "0"}}     

After you create the script, you can call it from the Developer Tools page:

Or manually with YAML:

service: script.update_zemismart_zm25_blind_motor_limit
data:
  entity_id: cover.blinds
  limit: upper
  action: set

EDIT: Wrote another script to control the direction of the motor:

alias: Configure Zemismart ZM25 Blind Motor Options
fields:
  entity_id:
    required: true
    description: Entity ID of your cover entity
    example: cover.blinds
    selector:
      entity:
        filter:
          domain: cover
  reverse_direction:
    required: true
    description: If the motor should turn in the opposite direction
    default: false
    selector:
      boolean:
mode: single
icon: mdi:blinds
sequence:
  - service: mqtt.publish
    data:
      qos: 0
      retain: false
      topic: >-
        zigbee2mqtt/{{ states[entity_id].attributes.friendly_name
        }}/set
      payload_template: >-
        { "options": { "reverse_direction": {{"true" if reverse_direction else "false"}} } }

You can use this to set reverse_direction to true or false:

6 Likes

Does the remote or Tuya app have any way to adjust the speed? I’d like to make it faster if possible.

EDIT: I found this page: [RELEASE] Zemismart Zigbee Blind Driver - Custom Drivers - Hubitat

It looks like the ZM25TQ motor doesn’t have support for speed. That’s no problem, will have to make do with the current speed.

awesome findings and info.

I have 6 of these motors. They all work at the same speed. However, one of them is more noisy.
I will definitely try your scripts.

1 Like

@ndbroadbent, There is a small problem with your set limit script. In my case set upper and set lower works reversed. set upper sets the lower limit and set lower sets the upper limit. This has to do with my motor having the reverse direction setting. The reverse direction is required when the motor is installed at the opposite side of the blind cylinder and works in reverse in relation the the other blinds. This is mostly done for wiring reasons. For example if you have two blinds next to each other, you might want the motors in the middle so they share the same electrical cable and resultantly one goes in reverse direction.

So when the reverse direction is set for a motor, when using your script, one needs to set upper instead of set lower. I don’t know how this works but this is not a problem with the RF remote. Do you think maybe you could have your script query the reverse_direction and have your script issue the correct command accordingly?

By the way, from the page you shared, it seems like there should be step up and step down commands for these blinds. It would be really awesome if you would also make a script to control the shades with step commands.

1 Like

Hi,
I just wanted to say thank you! I didn’t purchased the remote and in my mind it should indeed be possible to program it via zigbee but I didn’t know how. I used both of your scripts and they work beautiful. (FYI I use the sonoff e dongle). Saves some E-waste as I was not planning on using the remote anyway, only for programming. Thanks again. The HA community is amazing!

1 Like