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: