private@homelab: ~/latest
Home Assistant · Zigbee2MQTT · local control
private@homelab:~$ cat guides/article.md
· · ·
· ·
7–10 minutes
read

Aqara Curtain Driver E1 with Zigbee2MQTT + Home Assistant

Pair the Aqara Curtain Driver E1 (ZNCLBL01LM) with Zigbee2MQTT and Home Assistant — calibration, entities, automations, common fixes.

Aqara Curtain Driver E1 with Zigbee2MQTT and Home Assistant

Some links in this post are affiliate links. If you buy through them, I may earn a small commission at no extra cost to you.

The Curtain Driver E1 moves an existing curtain using a rechargeable motor mounted on the rod or track. Through Zigbee2MQTT, Home Assistant can open, close and position it without an Aqara hub. Correct mounting and travel-limit setup matter as much as the Zigbee pairing.

What you need

  • A Curtain Driver E1 and the mounting kit suited to your rod or track.
  • A compatible curtain installation that moves freely by hand, with no steps or obstructions along the route.
  • A supported Zigbee2MQTT coordinator, MQTT broker and Home Assistant MQTT discovery.
  • Enough battery charge to complete installation and travel tests.

The Aqara M2 hub route is an alternative ecosystem path. It is not a Zigbee2MQTT radio adapter. Follow Aqara’s mounting instructions before sending movement commands.

Identify E1 rod and track versions

Label or model What to check
ZNCLBL01LM / CM-M01 / CM-M01R E1 aliases listed in the Zigbee2MQTT device entry
E1 rod or track kit Confirm the supplied mounting parts fit the rail
ZNCLDJ12LM A different curtain-motor model; use its own device entry

The rod and track labels describe the mounting arrangement. The older ZNCLDJ12LM B1 is not simply the E1 track version. Check the physical label and Zigbee2MQTT identification rather than inferring the model from the shop or purchase year.

The E1 device entry lists its recognised aliases. Aqara’s installation guidance describes compatible rods, rails and mounting kits.

Pair the E1

  1. Enable Permit join in Zigbee2MQTT.
  2. Hold the device’s setting/reset button for about five seconds and look for its pairing indication.
  3. Wait for the interview to finish and check the model. If joining stalls, the device notes suggest a short button press.
  4. Give it a friendly name, close joining and find the cover under Home Assistant’s MQTT integration.

Use the installed device’s manual for the button and indicator details; it is not a generic pinhole reset. Establish a stable radio connection before calibrating.

Set the travel limits before using percentages

The driver needs to know the curtain’s usable start and end positions. A cover entity appearing in Home Assistant does not prove that those limits are set. First check the mounting and rail, then follow the route-setting procedure and test full travel.

Do not force the curtain past an obstruction to obtain a percentage reading. Intermediate positions depend on correctly learned travel and the installation remaining in place.

Calibration controls in Zigbee2MQTT

The limits_calibration control accepts start, end and reset. These are calibration commands, separate from normal OPEN, CLOSE, STOP and position commands.

Use the procedure for your device’s firmware to set the endpoints. Do not assume that sending start, waiting for one movement and immediately sending end automatically teaches both limits. If the interface does not explain the sequence, use the documented physical-button route method below, then verify 0, 50 and 100 percent in Home Assistant.

Position inversion is separate from calibration

invert_cover changes Zigbee2MQTT’s interpretation of the position and derived open/closed state. Its normal convention is 0 closed and 100 open. Inversion does not repair a slipping mount, reverse a badly installed motor or teach missing limits.

If the displayed position is reversed, check the model’s option in Zigbee2MQTT and verify it with a small movement before sending a full-travel command. The current device notes describe the option.

Set limits with the physical button

The official E1 support page also provides the manual and installation material for checking your kit.

The rod-version E1 manual, Opening Distance Settings, gives this no-app method after correct mounting:

  1. If replacing an old route, click the setting button five times rapidly to delete the stored range.
  2. Put the curtain fully closed and mount the driver as shown in the rod installation instructions.
  3. Click the setting button three times rapidly. Wait for the long beep confirming the first, closed limit.
  4. Pull the curtain about 10 cm in the opening direction. The driver runs to the fully open limit and stops; its long beep confirms the second limit.

For two curtains, use two drivers and set each side’s range with the same closed-limit and opening-travel procedure. Do not force an obstructed curtain. Then test open, stop, close and 50 percent in Home Assistant. A successful full-travel movement and sensible intermediate position confirm more than the presence of a cover entity. Use the matching track manual for a track installation.

Home Assistant controls and diagnostics

Start with the cover entity, then review the extra controls and sensors. Names and enabled diagnostics depend on discovery settings. Treat a missing reading separately from a motor that does not move.

Cover position

The cover supports opening, closing, stopping and a requested percentage. Home Assistant normally uses 0 for closed and 100 for open. Check the physical direction and calibrated limits before relying on the percentage in an automation.

Manual-pull assistance

hand_open controls whether a gentle curtain pull starts the motor. Check it on your firmware and test without forcing the curtain. Its operation is separate from a normal command issued by Home Assistant.

Hook controls

hooks_lock and hooks_state relate to the driver’s physical mounting hooks. They are relevant to the mounting process, including rod installations; they are not just a software lock or an option that rod users can always ignore.

Do not send an unlock command casually from a dashboard. Follow the mounting procedure and support the driver when the hooks are being released.

Light reading

The illuminance reading is taken at the driver, which may sit behind fabric. Check whether it sees outside light, room light or a shaded space before choosing a threshold. A value measured at another window may not be useful here.

Battery and charging

The E1 has a rechargeable battery and USB-C connection. Zigbee2MQTT reports battery and charging information, with power_source distinguishing battery and a DC supply. Allow time for readings to update after charging.

If using continuous USB power, route the cable so it can follow the complete curtain travel without snagging or tangling. Do not assume a full discharge always erases calibration; charge the device and test the limits before deciding to reset them.

Manual action messages

The documented action values include manual_open and manual_close. Inspect the incoming MQTT payload before writing an automation around them. Discovered device triggers or MQTT messages avoid a dependency on an optional legacy action-state entity.

Example automations

These are individual automations for Home Assistant’s YAML editor, using example entity IDs. Check the motor and travel first, then choose either a light-based rule or a schedule so overlapping rules do not fight each other.

Open when the window gets light

alias: "Open curtains on morning light"
triggers:
  - trigger: numeric_state
    entity_id: sensor.curtain_driver_e1_illuminance
    above: 100
conditions:
  - condition: time
    after: "05:30:00"
    before: "09:00:00"
actions:
  - action: cover.open_cover
    target:
      entity_id: cover.curtain_driver_e1
mode: single

This runs when the reading crosses above 100 during the time window. It is not a sunrise calculation and will not run at 05:30 merely because the reading is already above the threshold. Adjust the value from your own window’s history.

Reduce glare after sustained brightness

alias: "Close curtains on sustained bright light"
triggers:
  - trigger: numeric_state
    entity_id: sensor.curtain_driver_e1_illuminance
    above: 1000
    for:
      minutes: 5
actions:
  - action: cover.set_cover_position
    target:
      entity_id: cover.curtain_driver_e1
    data:
      position: 20
mode: single

The five-minute period filters short brightness changes. The driver’s reading can fall as the fabric closes, so check for conflicts if you also add an automatic reopening rule. A position of 20 leaves a small opening only when calibration and direction are correct.

Morning and evening schedule

alias: "Curtain morning and evening schedule"
triggers:
  - trigger: time
    at: "07:30:00"
    id: morning
  - trigger: time
    at: "21:00:00"
    id: evening
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: morning
        sequence:
          - action: cover.open_cover
            target:
              entity_id: cover.curtain_driver_e1
      - conditions:
          - condition: trigger
            id: evening
        sequence:
          - action: cover.close_cover
            target:
              entity_id: cover.curtain_driver_e1
mode: single

Replace the times and cover entity. Home Assistant must be running at the scheduled time. Numeric-state and state-trigger for: periods also restart when automations reload or Home Assistant restarts.

Troubleshooting

Watch the cover’s reported position, motor state and physical movement together. Check the mounting and battery before clearing a working Zigbee pairing.

Only the endpoints work

Check whether the route was fully set and whether the mount slips during travel. Test the physical control, then an intermediate command. Use the manual’s route procedure again if the limits are missing; a cover entity alone cannot establish them.

Position looks wrong after power loss

Charge or reconnect the driver and test a short movement. Check that it is still correctly mounted and moves freely. If its position no longer matches the curtain, redo the route-setting procedure; do not assume every power interruption requires a factory reset.

OTA updates

The E1 device entry lists OTA support. Charge the driver, use a stable radio path and avoid movement during the update. Wait for the transfer and restart to finish, then check position, manual-pull assistance and hook settings. Do not promise that every failed update automatically restores the old firmware.

If you use ZHA

Check the current ZNCLBL01LM handler and its entity coverage rather than relying on old pairing reports for a particular adapter. The Zigbee2MQTT configuration and MQTT examples here do not apply unchanged to ZHA.

The H1 no-neutral guide shows why checking exact models and current action names matters elsewhere in the Aqara range too.

Does the E1 extend the Zigbee mesh?

The E1 is an end device. It needs a suitable coordinator or router connection and does not relay other devices’ traffic. Test coverage at both ends of the curtain’s travel, because a good link when open may differ from the link behind closed fabric.

local-firstHome Assistantno-cloud