Ultima entrada

  • Cambio de Shelly 2.5 a Sonoff MINI-ZBRBS

    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 :

    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

    1. Localiza el botón del MINI-ZBRBS.
    2. Mantén pulsado el botón más de 10 segundos.
    3. El LED azul empezará a “respirar” (encenderse y apagarse suavemente).
    4. Suelta el botón.
    5. Pulsa una vez brevemente el botón para entrar en calibración manual.

    Paso 2: Guardar posición totalmente abierta

    1. Usa el interruptor externo (subir/bajar) para abrir completamente la persiana.
    2. Cuando esté totalmente abierta:
      • Pulsa brevemente el botón del dispositivo.
    3. El LED azul parpadeará 3 veces
      → posición “abierta” guardada.

    Paso 3: Guardar posición totalmente cerrada

    1. El dispositivo cerrará la persiana automáticamente.
    2. Cuando esté totalmente cerrada:
      • Pulsa brevemente el botón del dispositivo otra vez.
    3. 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 ………….

2 comentarios en «Ultima entrada»

  1. Hola Antonio!! LLegue a tu web buscando un tutorial de como instalar un ZBDongle-E en un QNAP TS 251D pero aun ando bastante liado jaja ojala me puedas dar una mano si tienes un tiempo libre!! Abrazo desde Argentina!!

    Responder

Deja un comentario