Al fallarme uno de los casi indestructibles Shelly 2.5 ( desde Julio del 2019 como un campeón ) decidí que empezaría a cambiar las persianas a zigbee , para ello compre par probar un par Sonoff MINI-ZBRBS
Este mini se puede integrar perfectamente en zigbee2mqtt
https://www.zigbee2mqtt.io/devices/MINI-ZBRBS.html
El factor de forma es realmente pequeño y muy compacto, con medidas de 39.5 x 33 x 16.8 mm

Aquí os dejo el manual del Sonoff MINI-ZBRBS
Externamente cuenta con un botón y un LED que realizan estas funciones según pulsemos en un tiempo y una forma concreta
- Mantener 5 s: modo emparejamiento (3 minutos).
- Pulsar 3 veces: cambia el tipo de interruptor externo.
- Mantener 10 s: inicia calibración.
- LED azul:
- Encendido fijo: conexión normal.
- Parpadeo lento: emparejamiento.
- Parpadeo rápido: error de conexión.
- Apagado: fallo o tiempo agotado.
- “Respiración”: modo calibración.
Nada mas ponerlo en modo emparejamiento zigbee2mqtt nos lo reconoce aunque en la versión 1.4 ponga que no esta soportado

Aquí podemos ver que expone ya el estado y la posición

Nos devolverá un json del estilo a este
{
"cover_mode": {
"calibration": false,
"led": false,
"maintenance": false,
"reversed": false
},
"device": {
"dateCode": "20250711",
"friendlyName": "zb_persiana_matrimonio",
"hardwareVersion": 0,
"ieeeAddr": "0x7cc6b6fffeca7d88",
"manufacturerID": 4742,
"manufacturerName": "SONOFF",
"model": "MINI-ZBRBS",
"networkAddress": 1547,
"powerSource": "Mains (single phase)",
"softwareBuildID": "1.0.5",
"type": "Router",
"zclVersion": 8
},
"last_seen": "2025-12-15T21:48:41+01:00",
"linkquality": 91,
"position": 100,
"state": "OPEN"
}En Home Assistant tenia estos dos sensores
- name: temperatura_persiana_comedor state_topic: "shellies/shellyswitch25-68DD68/temperature" unit_of_measurement: ??C icon: mdi:temperature-celsius force_update: true - name: sobretemperatura_persiana_matrimonio state_topic: "shellies/shellyswitch25-690423/overtemperature" payload_on: "1" payload_off: "0" device_class: "heat"
y con esta definición del cover
- name: window_comedor_cover # friendly_name: "Persiana comedor" state_topic: "shellies/shellyswitch25-68DD68/roller/0" command_topic: "shellies/shellyswitch25-68DD68/roller/0/command" position_topic: "shellies/shellyswitch25-68DD68/roller/0/pos" set_position_topic: "shellies/shellyswitch25-68DD68/roller/0/command/pos" # availability_topic: "shellies/shellyswitch25-68DD68/online" payload_available: "true" payload_not_available: "false" # retain: true payload_open: "open" payload_close: "close" payload_stop: "stop" state_open: "open" state_opening: "opening" state_closed: "close" state_closing: "closing" state_stopped: "stop" position_open: 100 position_closed: 0 qos: 0 retain: false optimistic: false
Una vez leída la información del dispositivo en esta pagina https://www.zigbee2mqtt.io/devices/MINI-ZBRBS.html#sonoff-mini-zbrbs empezamos a definir sensores y el cover
Así quedaria la parte de los sensores y de la persiana
# Sensores
sensor:
- state_topic: "zigbee2mqtt/zb_persiana_comedor"
availability_topic: "zigbee2mqtt/bridge/state"
icon: "mdi:calendar-clock"
value_template: "{{ value_json.last_seen }}"
name: "zb_persiana_comedor_ultima_conexion"
- name: posicion_persiana_comedor
state_topic: "zigbee2mqtt/zb_persiana_comedor"
value_template: "{{ value_json.position }}"
unit_of_measurement: "%"
icon: mdi:blinds
force_update: true
binary_sensor:
- state_topic: "zigbee2mqtt/zb_persiana_comedor/availability"
availability_topic: "zigbee2mqtt/zb_persiana_comedor/availability"
name: zb_persiana_comedor_disponibilidad
device_class: "connectivity"
payload_on: "online"
payload_off: "offline"
# Cover
cover:
- name: window_comedor_cover
command_topic: "zigbee2mqtt/zb_persiana_comedor/set"
state_topic: "zigbee2mqtt/zb_persiana_comedor"
position_topic: "zigbee2mqtt/zb_persiana_comedor"
set_position_topic: "zigbee2mqtt/zb_persiana_comedor/set"
availability_topic: "zigbee2mqtt/bridge/state"
payload_available: "online"
payload_not_available: "offline"
# Comandos
payload_open: '{"state": "OPEN"}'
payload_close: '{"state": "CLOSE"}'
payload_stop: '{"state": "STOP"}'
position_open: 100
position_closed: 0
set_position_template: '{"position": {{ position }}}'
# Estados
value_template: "{{ value_json.state }}"
position_template: "{{ value_json.position }}"
state_open: "OPEN"
state_opening: "opening"
state_closed: "CLOSE"
state_closing: "closing"
state_stopped: "STOP"
qos: 1
retain: false
optimistic: false Añadimos un sensor calculado que nos devuelve los minutos desde la ultima conexión del dispositivo
- platform: template
sensors:
zb_persiana_comedor_disponibilidad_ultima_conexion_minutos:
value_template: >-
{% set x1 = as_timestamp(states('sensor.zb_persiana_comedor_ultima_conexion')) %}
{% set x2 = as_timestamp(now()) %}
{% set time = x2 - x1 | int(0) %}
{% set days = (time/86400) | int %}
{% set hours = (time / 3600 % 24) | int %}
{% set minutes = (((time / 3600) % 1) * 60) | int %}
{{ days ~ 'd ' ~ hours ~ 'h ' ~ minutes ~ 'm' }}
friendly_name: Ultima conexión persiana comedor
icon_template: "mdi:calendar-clock" Y ya que estamos pues me dio por actualizar zigbee2mqtt de la versión 1.4 a versiones 2.X , lo primero cambiarlo en el docker compose
Bueno lo primero es hacer una buena copia de seguridad del directorio zigbee2mqtt para poder volver atrás en caso necesario
Una vez realizada la copia actualizamos el docker de zigbee2mqtt

Una vez acabado vemos que no arranca por un error en el adaptador USB

Según nos dice en esta pagina https://github.com/Koenkk/zigbee2mqtt/discussions/24364
Tenemos que pasar de esto que es lo que tenia actualmente
serial: port: /dev/ttyUSB0
Añadiendo esta linea
serial: port: /dev/ttyUSB0 adapter: zstack
Y vemos que ya arranca perfectamente

Una vez arrancado introducimos el token que tenemos definido en configuration.yaml
frontend: enabled: true port: 28081 host: 0.0.0.0 auth_token: '¡TuTokenSuperSecretoAquí!'
Y ya podemos ver correctamente el dispositivo

Existen una serie de breaking changes a la hora de actualizar Zigbee2MQTT a 2.0.0 o superior , aquí estan las dos paginas donde lo explica claramente :
- https://github.com/Koenkk/zigbee2mqtt/discussions/24198
- https://www.zigbee2mqtt.io/guide/configuration/configuration-update.html#migration-notes
Y por ultimo la calibración del sonoff y la persiana
Calibración del MINI-ZBRBS solo con botones
Este método sirve para que el dispositivo aprenda la posición totalmente abierta y totalmente cerrada de la persiana.
⚠️ Imprescindible para que funcione el control por porcentaje.
Paso 1: Entrar en modo calibración
- Localiza el botón del MINI-ZBRBS.
- Mantén pulsado el botón más de 10 segundos.
- El LED azul empezará a “respirar” (encenderse y apagarse suavemente).
- Suelta el botón.
- Pulsa una vez brevemente el botón para entrar en calibración manual.
Paso 2: Guardar posición totalmente abierta
- Usa el interruptor externo (subir/bajar) para abrir completamente la persiana.
- Cuando esté totalmente abierta:
- Pulsa brevemente el botón del dispositivo.
- El LED azul parpadeará 3 veces
→ posición “abierta” guardada.
Paso 3: Guardar posición totalmente cerrada
- El dispositivo cerrará la persiana automáticamente.
- Cuando esté totalmente cerrada:
- Pulsa brevemente el botón del dispositivo otra vez.
- El LED azul parpadeará 3 veces
→ calibración completada.
Calibración finalizada ✅
La persiana ya está calibrada y el dispositivo conoce todo el recorrido.
Consejos importantes
- 🔁 Si el recorrido no queda bien ajustado, repite todo el proceso.
- ⏱️ No dejes el motor funcionando más de 2 minutos seguidos.
- 🔄 Si la persiana sube cuando debería bajar:
- Corta la corriente.
- Intercambia los cables L out1 y L out2.
- ⚡ Realiza la calibración con la persiana sin bloqueos.
Y este es el resultado final en nuestro panel lovelace

Y con esto y un bizcocho ………….