Ultima entrada

  • Modificar sensor de temperatura zigbee cambiar AHT20 para hacerlo externo

    Tengo este sensor en el arcón congelador , la verdad es que es el único que me aguanta temperaturas de -20ºC , el único inconveniente es que las baterías las devora a esas temperaturas , y una bateria que debería aguantar un año o mas en diez días esta agotada.

    Decidí que tenia que ponerle solución y para ello lo abrí a ver que había tripas adentro

    Vamos bien , vi que tenia un sensor de temperatura I2C AHT20

    Teóricamente podria aguantar hasta -40ºC según la tabla de características del modulo

    Empecé por mirar donde estaban las señales en el modulo ZTU , pero alli directamente no llegaban

    Luego me cerciore donde iban SDA y SCL , así como la tensión de la bateria y GND en los pads de la placa

    Estos serian los pads de cada una de las señales que necesitaremos para conectar nuestro modulo externo.

    El siguiente paso es localizar un AHT20 en aliexpress , por ejemplo este.

    Soldamos un cable flat de cuatro hilos al modulo

    Y lo conectamos a nuestro modulo zigbee ( previamente habremos desoldado el AHT20 que estaba soldado en la placa )

    Con cuidad meteremos todo el conjunto en su caja

    Y nos tiene que quedar así de mono

    Protegeremos nuestro modulo con pegamento termofusible , esto hará que no nos marque correctamente la humedad ambiental , pero realimente el valor que nos interesa es la temperatura

    Una vez instalado nos deberá quedar así de mono

    Una vez añadido a zigbee2mqtt empezaremos a crear los sensores , he comentado la parte de humedad y todo lo relacionado con ella ya que no la vamos a usar , en la parte de la bateria no devuelve un valor porcentual , devuelve low , medium y high que transformaremos a numérico

      ### TERMOMETRO ARCON CONGELADOR
      
        - state_topic: "zigbee2mqtt/temperatura_congelador"
          availability_topic: "zigbee2mqtt/bridge/state"
          unit_of_measurement: "°C"
          device_class: "temperature"
          value_template: "{{ value_json.temperature }}"
          name: "temperatura_congelador_temperatura"  
      
        # - state_topic: "zigbee2mqtt/temperatura_congelador"
          # availability_topic: "zigbee2mqtt/bridge/state"
          # unit_of_measurement: "%"
          # device_class: "humidity"
          # value_template: "{{ value_json.humidity }}"
          # name: "temperatura_congelador_humedad"  
      
        - state_topic: "zigbee2mqtt/temperatura_congelador"
          availability_topic: "zigbee2mqtt/bridge/state"
          unit_of_measurement: "%"
          icon: "mdi:battery"
          device_class: "battery"
          # value_template: "{{ value_json.battery }}"
          value_template: >-
            {% if value_json.battery_state == 'low' %}
              5
            {% elif value_json.battery_state == 'medium' %}
              50
            {% elif value_json.battery_state == 'high' %}
              100
            {% else %}
              0
            {% endif %}      
          expire_after: 86400
          force_update: true
          name: "temperatura_congelador_bateria"  
      
        - state_topic: "zigbee2mqtt/temperatura_congelador"
          availability_topic: "zigbee2mqtt/bridge/state"
          icon: "mdi:signal"
          unit_of_measurement: "lqi"
          value_template: "{{ value_json.linkquality }}"    
          name: "temperatura_congelador_estado"  
          
        - state_topic: "zigbee2mqtt/temperatura_congelador"
          availability_topic: "zigbee2mqtt/bridge/state"
          icon: "mdi:calendar-clock"
          value_template: "{{ value_json.last_seen }}"
          name: "temperatura_congelador_ultima_conexion"         

    Crearemos un sensor de disponibilidad

        - state_topic: "zigbee2mqtt/temperatura_congelador/availability"       
          availability_topic:  "zigbee2mqtt/temperatura_congelador/availability"     
          name: temperatura_congelador_disponibilidad      
          device_class: "connectivity"      
          payload_on: "online"
          payload_off: "offline"  

    Lo ponemos monos en en nuestro customize.yaml

    # sensor.temperatura_congelador_humedad:
      # friendly_name: Humedad arcon congelador
    sensor.temperatura_congelador_temperatura:
      friendly_name: Temperatura arcon congelador
    sensor.temperatura_congelador_bateria:
      friendly_name: Termometro arcon congelador
    sensor.temperatura_congelador_estado:
      friendly_name: Termometro arcon congelador
      
    binary_sensor.temperatura_congelador_disponibilidad: 
      friendly_name: "Sensor temp. arcon congelador"

    Creamos un par de sensores de tiempo para el sensor de disponibilidad

      - platform: template
        sensors:
          arcon_temperatura_sin_conexion:
            friendly_name: "Temperatura arcon ultima lectura"
            value_template: >
              {{ ((as_timestamp(now()) - as_timestamp(states.sensor.temperatura_congelador_ultima_conexion.last_changed)) | int(0) | round(0,default=0)) }}
            unit_of_measurement: 'Seg.'
            icon_template: mdi:timer-outline
                      
      - platform: template
        sensors:
          arcon_temperatura_sin_conexion_tiempo:
            friendly_name: "Temperatura arcon ultima lectura"
            value_template: >-
                {% set s = ((as_timestamp(now()- timedelta(hours=1)) - as_timestamp(states.sensor.temperatura_congelador_ultima_conexion.last_changed)) | int(0) | round(0,default=0)) %}
                {{ s | timestamp_custom("%H:%M") }}
            icon_template: mdi:timer-outline

    Y otro sensor de tiempo en minutos de la ultima conexión

      - platform: template
        sensors:
          temperatura_congelador_ultima_conexion_minutos:
            value_template: >-
              {% set x1 = as_timestamp(states('sensor.temperatura_congelador_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 sensor temp. congelador
            icon_template: "mdi:calendar-clock"

    A la vez creamos un sensor de bateria así con iconos con porcentajes y esas cosas

          temperatura_congelador_battery_level:
            friendly_name: Sensor temperatura congelador
            value_template: "{{ states.sensor.temperatura_congelador_bateria.state |default(-1)| int(0)  if states.sensor.temperatura_congelador_bateria is not none }}"
            unit_of_measurement: '%'
            icon_template: '{% if states.sensor.temperatura_congelador_bateria.state| int(0)   == 100 %}
                              mdi:battery
                           {% elif states.sensor.temperatura_congelador_bateria.state| int(0)   >= 90 %}
                              mdi:battery-90
                           {% elif states.sensor.temperatura_congelador_bateria.state| int(0)   >= 80 %}
                              mdi:battery-80
                           {% elif states.sensor.temperatura_congelador_bateria.state| int(0)   >= 70 %}
                              mdi:battery-70
                           {% elif states.sensor.temperatura_congelador_bateria.state| int(0)   >= 60 %}
                              mdi:battery-60
                           {% elif states.sensor.temperatura_congelador_bateria.state| int(0)   >= 50 %}
                              mdi:battery-50
                           {% elif states.sensor.temperatura_congelador_bateria.state| int(0)   >= 40 %}
                              mdi:battery-40
                           {% elif states.sensor.temperatura_congelador_bateria.state| int(0)   >= 30 %}
                              mdi:battery-30
                           {% elif states.sensor.temperatura_congelador_bateria.state| int(0)   >= 20 %}
                              mdi:battery-20
                           {% elif states.sensor.temperatura_congelador_bateria.state| int(0)   >= 10 %}
                              mdi:battery-10
                           {% else %}
                              mdi:battery-outline
                           {% endif %}'    

    Crearemos un sensor extra donde podremos calibrar si queremos un offset para la temperatura leida

    #################################################################################################
    ## SENSOR CONGELADOR
    #################################################################################################
    
      - platform: template
        sensors:
          temperatura_congelador_calibrada:
            friendly_name: 'Temperatura congelador'
            value_template: >
              {% if states('sensor.temperatura_congelador_temperatura') | float(0) | round(5,default=0) == 0 %}
                {{ states('sensor.temperatura_congelador_calibrada') | float(0) | round(2,default=0) }}
              {% else %}        
                {% set T = (states.sensor.temperatura_congelador_temperatura.state | float(0) | round(5,default=0)) %}
                {% set Ajuste  = -0.5 %}
                {% set Resultado =  T + Ajuste | round(1,default=0)  %}
                {{Resultado |round(1,default=0)  }}
              {% endif %}  
            unit_of_measurement: '°C'
            icon_template: mdi:thermometer
    
      # - platform: template
        # sensors:
          # humedad_congelador_calibrada:
            # friendly_name: 'Humedad congelador'
            # value_template: >
              # {% if states('sensor.temperatura_congelador_humedad') | float(0) | round(5,default=0) == 0 %}
                # {{ states('sensor.humedad_congelador_calibrada') | float(0) | round(2,default=0) }}
              # {% else %}        
                # {% set H = (states.sensor.temperatura_congelador_humedad.state | float(0) | round(5,default=0)) %}
                # {% set Ajuste  =  0.0 %}
                # {% set Resultado =  H + Ajuste | round(1,default=0)  %}
                # {{Resultado |round(1,default=0) }}
              # {% endif %}  
            # unit_of_measurement: '%'
            # icon_template: mdi:water-percent
                      
      # - platform: template
        # sensors:
          # sensacion_calor_congelador_calibrada:
            # friendly_name: 'Indice de calor arcon'
            # value_template: >-
              # {% set T = ((states.sensor.temperatura_congelador_calibrada.state | float(0) | round(2,default=0))*1.8)+32 %}
              # {% set RH = states.sensor.humedad_congelador_calibrada.state | float(0) | round(5,default=0) %}
              
              # {% set STEADMAN_HI = 0.5 * (T + 61.0 + ((T-68.0)*1.2) + (RH*0.094)) %}
              
              # {% if STEADMAN_HI >= 80 %}
              
              # {% set ROTHFUSZ_HI = -42.379 + 2.04901523*T + 10.14333127*RH - 0.22475541*T*RH - 0.00683783*T*T - 0.05481717*RH*RH + 0.00122874*T*T*RH + 0.00085282*T*RH*RH - 0.00000199*T*T*RH*RH %}
                               
              # {% set HI = ROTHFUSZ_HI %}
                
              # {% if RH < 13 and 80 < T  85 and 80 < T < 87 %}
                   # {% set ADJUSTMENT = ((RH-85)/10) * ((87-T)/5) %}
                   # {% set HI = HI + ADJUSTMENT %}
                 # {% endif %}
                  
              # {% else %}
                # {% set HI = STEADMAN_HI %}
              # {% endif %}
              
              # {% set HI_C = (HI-32)/1.8 %}
                
              # {{- HI_C|round(1,default=0) -}}
            # unit_of_measurement: '°C'
            # icon_template: mdi:thermometer      

    A partir de este momento ya podemos empezar a crear nuestras automatizaciones , esta por ejemplo hace que si sube la temperatura por encima de los -10ºC nos envia avisos de alarma por Telegram con los valores , así como los valores del enchufe inteligente que esta alimentando al arcón.

    ############################################
    ### Arcon  -> Alarma por temperatura
    ############################################
    
    - id: arcon congelador por temperatura alta
      alias: arcon congelador por temperatura alta
      initial_state: 'on'
      trigger:
        - platform: time_pattern
          #cada cinco minutos
          minutes: '/5'
      condition:
        - condition: template
          value_template: "{{(states.sensor.temperatura_congelador_calibrada.state | int(0) | round(0,default=0)) > -10 }}"      
    
      action:
        - service: notify.notif_telegram_ha_urgentes
          data:  
            message: |
              {{"\U00002744"}}{{"\U00002744"}} Alarma *arcon* : {{now().strftime("%H:%M:%S")}} {{"\U00002744"}}{{"\U00002744"}}
               
              *Temp. congelador:* {{(states.sensor.temperatura_congelador_calibrada.state | round(2,default=0))}} ºC
              
              {% if is_state("switch.enchufe_23_congelador", "on") %}{{"\U0001F7E2"}} *Enchufe arcon*: Encendido {% else %}{{"\U0001F534"}} *Enchufe arcon*: Apagado{% endif %}
              
              *Intensidad congelador:* {{(states.sensor.enchufe_23_congelador_current.state | round(2,default=0))}} Amp.
              *Tensión congelador:* {{(states.sensor.enchufe_23_congelador_voltage.state  | round(2,default=0))}} V.
              *Potencia congelador:* {{(states.sensor.enchufe_23_congelador_power.state | round(2,default=0))}} W.
    
        - service: notify.notif_telegram_bot
          data:  
            message: |
              {{"\U00002744"}}{{"\U00002744"}} Alarma *arcon* : {{now().strftime("%H:%M:%S")}} {{"\U00002744"}}{{"\U00002744"}}
               
              *Temp. congelador:* {{(states.sensor.temperatura_congelador_calibrada.state | round(2,default=0))}} ºC
              
              {% if is_state("switch.enchufe_23_congelador", "on") %}{{"\U0001F7E2"}} *Enchufe arcon*: Encendido {% else %}{{"\U0001F534"}} *Enchufe arcon*: Apagado{% endif %}
              
              *Intensidad congelador:* {{(states.sensor.enchufe_23_congelador_current.state | round(2,default=0))}} Amp.
              *Tensión congelador:* {{(states.sensor.enchufe_23_congelador_voltage.state  | round(2,default=0))}} V.
              *Potencia congelador:* {{(states.sensor.enchufe_23_congelador_power.state | round(2,default=0))}} W.
    
        - service: notify.notif_telegram_grupo_ha
          data:  
            message: |
              {{"\U00002744"}}{{"\U00002744"}} Alarma *arcon* : {{now().strftime("%H:%M:%S")}} {{"\U00002744"}}{{"\U00002744"}}
               
              *Temp. congelador:* {{(states.sensor.temperatura_congelador_calibrada.state | round(2,default=0))}} ºC
              
              {% if is_state("switch.enchufe_23_congelador", "on") %}{{"\U0001F7E2"}} *Enchufe arcon*: Encendido {% else %}{{"\U0001F534"}} *Enchufe arcon*: Apagado{% endif %}
              
              *Intensidad congelador:* {{(states.sensor.enchufe_23_congelador_current.state | round(2,default=0))}} Amp.
              *Tensión congelador:* {{(states.sensor.enchufe_23_congelador_voltage.state  | round(2,default=0))}} V.
              *Potencia congelador:* {{(states.sensor.enchufe_23_congelador_power.state | round(2,default=0))}} W.
    

    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