Ultima entrada

  • Sensor Lluvia ZG-223Z e integración en Home Assistant

    Estos días decidí montar un sensor de lluvia que compre hace unas semanas y ponerlo en el balcón para que avisase cuando estaba lloviendo . Este es el enlace donde lo compre.

    La parte superior del sensor tiene un led de estado y el medidor de luz. Tiene una forma inclinada la parte del sensor para evitar que las gotas se acumulen en su superficie

    Para ponerlo en marcha quitaremos el papel que evita la descarga de la bateria

    Dentro del compartimento de la bateria encontraremos un botón que nos sirve con una pulsación corta para enviar los datos actuales y con una pulsación de ocho o mas segundos para ponerlo en modo emparejamiento

    Zigbee2MQTT lo reconoce de forma nativa tal como pone en este documento , https://www.zigbee2mqtt.io/devices/ZG-223Z.html

    Al emparejarlo empezara la entrevista con el dispositivo

    Da este error de que no esta soportado , pero como veremos mas adelante lo soporta sin poblemas

    Una vez cambiado el nombre del dispositivo veremos todas sus especificaciones

    Este seria el JSON que nos llegaria via MQTT , la señal de alarma de lluvia en este caso seria la alarm_1

    {
        "battery": 100,
        "device": {
            "applicationVersion": 147,
            "dateCode": "25102025",
            "friendlyName": "sensor_lluvia",
            "hardwareVersion": 1,
            "ieeeAddr": "0xa4c1388d75d391c3",
            "manufacturerID": 4742,
            "manufacturerName": "HOBEIAN",
            "model": "ZG-223Z",
            "networkAddress": 26845,
            "powerSource": "Battery",
            "softwareBuildID": "0125102025",
            "stackVersion": 2,
            "type": "EndDevice",
            "zclVersion": 3
        },
        "illuminance": 33573,
        "illuminance_lux": 2276,
        "last_seen": "2026-01-05T14:10:57+01:00",
        "linkquality": 43,
        "alarm_1": false,
        "alarm_2": false,
        "battery_low": false,
        "tamper": false
    }

    En nuestra sección sensor: crearemos estos sensores

    ### SENSOR LLUVIA
          
        - state_topic: "zigbee2mqtt/sensor_lluvia"
          availability_topic: "zigbee2mqtt/bridge/state"
          unit_of_measurement: "%"
          icon: "mdi:battery"
          device_class: "battery"
          value_template: "{{ value_json.battery }}"
          expire_after: 86400
          force_update: true
          name: "sensor_lluvia_bateria"
      
        - state_topic: "zigbee2mqtt/sensor_lluvia"
          availability_topic: "zigbee2mqtt/bridge/state"
          icon: "mdi:signal"
          unit_of_measurement: "lqi"
          value_template: "{{ value_json.linkquality }}"
          name: "sensor_lluvia_estado"  
      
        - state_topic: "zigbee2mqtt/sensor_lluvia"
          availability_topic: "zigbee2mqtt/bridge/state"
          icon: "mdi:calendar-clock"
          value_template: "{{ value_json.last_seen }}"
          name: "sensor_lluvia_ultima_conexion" 

    En nuestra sección binary_sensor: crearemos estos sensores

    ### SENSOR LLUVIA
    
        - state_topic: "zigbee2mqtt/sensor_lluvia"
          availability_topic: "zigbee2mqtt/sensor_lluvia/availability"  
          payload_on: true
          payload_off: false
          value_template: "{{ value_json.alarm_1 }}"
          device_class: "moisture"   
          name: sensor_lluvia_evento
    
        - state_topic: "zigbee2mqtt/sensor_lluvia"
          availability_topic: "zigbee2mqtt/sensor_lluvia/availability"  
          payload_on: true
          payload_off: false
          value_template: "{{ value_json.battery_low }}"
          device_class: "battery"   
          name: sensor_lluvia_bateria_baja_evento  
          
        - state_topic: "zigbee2mqtt/sensor_lluvia/availability"       
          availability_topic:  "zigbee2mqtt/sensor_lluvia/availability"     
          name: sensor_lluvia_disponibilidad      
          device_class: "connectivity"      
          payload_on: "online"
          payload_off: "offline"       

    Los ponemos mas bonitos en nuestro customize.yaml

    binary_sensor.sensor_lluvia_evento:  
      friendly_name: Sensor lluvia
      icon: mdi:weather-lightning-rainy
    binary_sensor.sensor_lluvia_bateria_baja_evento:
      friendly_name: Sensor lluvia
    sensor.sensor_lluvia_bateria:
      friendly_name: Sensor lluvia
    sensor.sensor_lluvia_estado:
      friendly_name: Sensor lluvia
    sensor.sensor_lluvia_ultima_conexion:
      friendly_name: Sensor lluvia
    binary_sensor.sensor_lluvia_disponibilidad: 
      friendly_name: Sensor lluvia

    Y ya empezamos con las automatizaciones , en este caso la principal que si el sensor detecta lluvia durante mas de diez segundos nos avisara por Telegram y visualmente encendiendo y apagando los cuatro Gateways en color azul , y si es una hora prudencial nos dará también un aviso sonoro por los Google home

    ##################################
    ### Automatizaciones sensor lluvia
    ##################################
    
    # Notificación cuando empieza a llover (con delay y límite de frecuencia)
    - alias: alerta_de_lluvia_telegram
      id: alerta_de_lluvia_telegram
      trigger:
        platform: state
        entity_id: binary_sensor.sensor_lluvia_evento
        to: "on"
        for:
          seconds: 10  # Debe estar 10 segundos en ON
      condition:
        - condition: template
          value_template: >
            {% set last = state_attr('automation.alerta_de_lluvia_telegram', 'last_triggered') %}
            {{ last == none or (now() - last).total_seconds() > 3600 }}
      action:
        - service: notify.notif_telegram_bot
          data:
            title: "🌧️ *¡Está lloviendo!*"
            message: >
              ☔ Ha comenzado a llover.
              
              🪟 Revisa ventanas y toldos
    
        # TTS solo entre las 8:00 y las 23:00
        - choose:
            - conditions:
                - condition: time
                  after: "08:00:00"
                  before: "23:00:00"
              sequence:
                - service: media_player.volume_set
                  continue_on_error: true
                  entity_id: 
                    - media_player.lenovo_smart_clock
                    - media_player.googlehome2670
                    - media_player.lenovo_lenovo_matrimonio
                  data:
                    volume_level: 0.6
              
                - delay: 00:00:03 
              
                - service: tts.google_translate_say
                  data:
                    language: "es-es"	
                    entity_id: 
                      - media_player.lenovo_smart_clock
                      - media_player.lenovo_lenovo_matrimonio
                      - media_player.googlehome2670
                    message: 'Ha comenzado a llover , Revisa ventanas y toldos '  
              
                - delay: 00:00:03 
        
        - repeat:
            sequence:        
              # Luces en azul 25 veces 
              - service: light.turn_on
                target:
                  entity_id:
                    - light.gateway_light_7c49eb1d1d0a
                    - light.gateway_light_286c07f0e736
                    - light.gateway_light_286c07f0b574
                    - light.gateway_light_04cf8cf69f4f
                data:
                  brightness: 255
                  rgb_color: [4, 29, 247]     
                                 
              - delay: '00:00:02'              
                 
              - service: light.turn_off
                target:
                  entity_id:
                    - light.gateway_light_7c49eb1d1d0a
                    - light.gateway_light_286c07f0e736           
                    - light.gateway_light_286c07f0b574   
                    - light.gateway_light_04cf8cf69f4f            
                             
              - delay: '00:00:01'  
              
            until: '{{ repeat.index >= 25 }}'
            
      mode: single
      max_exceeded: silent

    Esta otra por ejemplo nos avisara en caso de que llueva y exista alguna puerta o ventana exterior abierta

    # Alerta de lluvia con ventanas abiertas (URGENTE)
    - alias: lluvia_y_ventanas_abiertas_telegram
      id: lluvia_y_ventanas_abiertas_telegram
      trigger:
        platform: state
        entity_id: binary_sensor.sensor_lluvia_evento
        to: "on"
        for:
          seconds: 30
      condition:
        - condition: state
          entity_id: binary_sensor.todas_puertas_ventanas_cerradas
          state: "off"
        - condition: template
          value_template: >
            {% set last = state_attr('automation.lluvia_y_ventanas_abiertas_telegram', 'last_triggered') %}
            {{ last == none or (now() - last).total_seconds() > 3600 }}
      action:
        - service: notify.notif_telegram_bot
          data:
            title: "🚨 *¡ATENCIÓN URGENTE!*"
            message: >
              ⚠️ *Está lloviendo y tienes ventanas o puertas abiertas*
              
              ⏰ Hora: {{ now().strftime('%H:%M') }}
              
              ¡Ciérralas cuanto antes!
              
        # TTS solo entre las 8:00 y las 23:00
        - choose:
            - conditions:
                - condition: time
                  after: "08:00:00"
                  before: "23:00:00"
              sequence:
                - service: media_player.volume_set
                  continue_on_error: true
                  entity_id: 
                    - media_player.lenovo_smart_clock
                    - media_player.googlehome2670
                    - media_player.lenovo_lenovo_matrimonio
                  data:
                    volume_level: 0.6
              
                - delay: 00:00:03 
              
                - service: tts.google_translate_say
                  data:
                    language: "es-es"	
                    entity_id: 
                      - media_player.lenovo_smart_clock
                      - media_player.lenovo_lenovo_matrimonio
                      - media_player.googlehome2670
                    message: 'Está lloviendo y tienes ventanas o puertas abiertas , Ciérralas cuanto antes'  
              
                - delay: 00:00:03 
    
       
      mode: single
      max_exceeded: silent

    Y esta otra nos avisara cuando haya dejado de llover hace cinco minutos

    # Ha dejado de llover
    - alias: ha_dejado_de_llover_telegram
      id: ha_dejado_de_llover_telegram
      trigger:
        platform: state
        entity_id: binary_sensor.sensor_lluvia_evento
        to: "off"
        for:
          minutes: 5
      condition:
        - condition: template
          value_template: >
            {% set last = state_attr('automation.ha_dejado_de_llover_telegram', 'last_triggered') %}
            {{ last == none or (now() - last).total_seconds() > 3600 }}
      action:
        - service: notify.notif_telegram_bot
          data:
            title: "☀️ *Ya no llueve*"
            message: >
              🌤️ Ha dejado de llover hace 5 minutos
    
        # TTS solo entre las 8:00 y las 23:00
        - choose:
            - conditions:
                - condition: time
                  after: "08:00:00"
                  before: "23:00:00"
              sequence:
                - service: media_player.volume_set
                  continue_on_error: trueº
                  entity_id: 
                    - media_player.lenovo_smart_clock
                    - media_player.googlehome2670
                    - media_player.lenovo_lenovo_matrimonio
                  data:
                    volume_level: 0.6
              
                - delay: 00:00:03 
              
                - service: tts.google_translate_say
                  data:
                    language: "es-es"	
                    entity_id: 
                      - media_player.lenovo_smart_clock
                      - media_player.lenovo_lenovo_matrimonio
                      - media_player.googlehome2670
                    message: 'Ha dejado de llover hace 5 minutos'  
              
                - delay: 00:00:03 
    
    
      mode: single
      max_exceeded: silent

    Ahora si queremos le añadimos unas estadisiticas

    #####################################################
    ### SENSOR LLUVIA
    #####################################################    
    
      - platform: history_stats
        name: Eventos Lluvia Hoy
        entity_id: binary_sensor.sensor_lluvia_evento
        state: "on"
        type: count
        start: "{{ now().replace(hour=0, minute=0, second=0) }}"
        end: "{{ now() }}"
        
      - platform: history_stats
        name: Eventos Lluvia Esta Semana
        entity_id: binary_sensor.sensor_lluvia_evento
        state: "on"
        type: count
        start: "{{ as_timestamp(now().replace(hour=0, minute=0, second=0)) - now().weekday() * 86400 }}"
        end: "{{ now() }}"
        
      - platform: history_stats
        name: Eventos Lluvia Este Mes
        entity_id: binary_sensor.sensor_lluvia_evento
        state: "on"
        type: count
        start: "{{ now().replace(day=1, hour=0, minute=0, second=0) }}"
        end: "{{ now() }}"

    Y lo añadimos a nuestro panel lovelace

          - type: entities
            title: Estadísticas de Lluvia
            entities:
              - entity: sensor.eventos_lluvia_hoy
                name: Eventos Hoy
              - entity: sensor.eventos_lluvia_esta_semana
                name: Esta Semana
              - entity: sensor.eventos_lluvia_este_mes
                name: Este Mes        
            
          - type: history-graph
            title: Historial Sensor Lluvia
            entities:
              - entity: binary_sensor.sensor_lluvia_evento
            hours_to_show: 720  # 30 días
            refresh_interval: 60

    Quedando visualmente tal como este

    Y con esto y un bizcocho ……

    Y AL FIN LLOVIO

    Después de unos días de instalarlo empezó a llover y el sensor hizo su trabajo

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