HA instalación de válvulas termostáticas ( TRV ) – Parte II – Sensores

En esta parte definiremos los sensores de la válvula termostática y crearemos alguna automatización para empezar a jugar con ellas.

Si todo ha ido bien en la parte I del articulo deberíamos tener nuestro termostato ya activo y funcionando

El nivel de batería nos llega con el sensor termostato_comedor_derecho_battery_low , que solo tiene dos valores , 1 batería baja y 0 para batería correcta, para mostrarlo en las graficas y en lovelace por el porcentaje de batería crearemos un nuevo sensor a partir de termostato_comedor_derecho_battery_low.

      termostato_comedor_derecho_battery_level:
        friendly_name: Bateria termostato com. derecho
        value_template:  >
                       {% if is_state('binary_sensor.termostato_comedor_derecho_battery_low', 'off') %}
                          100
                       {% else %}
                          0
                       {% endif %}        
        unit_of_measurement: '%'
        icon_template: >
                       {% if is_state('binary_sensor.termostato_comedor_derecho_battery_low', 'on') %}
                          mdi:battery-10
                       {% else %}
                          mdi:battery
                       {% endif %}

También nos llega la temperatura local de la válvula , le daremos forma a dicho sensor

  - platform: mqtt
    name: termostato_comedor_derecho_local_temperature
    state_topic: "zigbee2mqtt/termostato_comedor_derecho"
    value_template: '{{ value_json.local_temperature|float }}'    
    unit_of_measurement: °C
    force_update: true

A la válvula le pasaremos un offset de corrección de la temperatura de la estancia a partir de otro sensor de temperatura ( yo tengo un sensor que he calibrado previamente llamado temperatura_comedor_calibrada ) , de esta forma haremos que la válvula corrija su temperatura la cual habitualmente no es correcta , ya que simplemente entre otros factores es afectada por la proximidad al radiador , estas válvulas solo admiten un margen de corrección de +9ºC a -9ºC , yo he puesto como máximo un margen de ±5ºC . ya que de ser superior o inferior en las siguientes correcciones se va calibrando

  - platform: template
    sensors:
      termostato_comedor_derecho_temperature_offset:
        friendly_name: 'Offset temperatura radiador com. derecho'
        value_template:  >-
            {{  min(5,  max( -5, (
            (states.sensor.temperatura_comedor_calibrada.state | float(0)) | round(2) -
            (states.climate.termostato_comedor_derecho.attributes['local_temperature'] | float(0)) 
            ))) | round(2)
            }}
        icon_template: >-
            mdi:temperature-celsius        
        unit_of_measurement: °C

En la posición de la válvula podremos ver cuando abre y cierra así como el comportamiento en función del preset que utilicemos , estos cierres y aperturas son los que mas consumo tienen en las baterías de la válvula por lo que buscaremos la mas optima para alargar la batería.

Y en el fichero customize.yaml le pondriamos todos los atributos para que luzcan bien

binary_sensor.termostato_comedor_derecho_battery_low:
  friendly_name: Nivel bajo termostato radiador comedor der.
  icon: mdi:battery  
sensor.termostato_comedor_derecho_position:
  friendly_name: Posición valvula termostato com. derecho    
sensor.termostato_comedor_derecho_local_temperature:
  friendly_name: Temperatira medida en termostato com. derecho

Así nos quedaría nuestra tarjeta en lovelace

        - type: entities
          show_name: true
          show_state: false
          show_header_toggle: false
          columns: 3     
          entities:
            - sensor.termostato_comedor_derecho_position
            - sensor.termostato_comedor_derecho_local_temperature
            - sensor.temperatura_comedor_calibrada
            - sensor.termostato_comedor_derecho_temperature_offset
            - sensor.termostato_comedor_derecho_battery_level     

Una vez que ya tenemos los sensores creados y funcionando pasaremos a las automatizaciones , la primera es para que nos avise cuando alguno de los termostatos tenga la batería baja

- id: alerta_bateria_baja_telegram_termostatos
  alias: 'Alerta bateria baja termostatos'
  initial_state: 'on'
  trigger:
  
  - platform: state
    entity_id: 
      - binary_sensor.termostato_oriol_battery_low
      - binary_sensor.termostato_matrimonio_battery_low
      - binary_sensor.termostato_comedor_derecho_battery_low
      - binary_sensor.termostato_comedor_izquierdo_battery_low
    from: 'off'    
    to: 'on'
      
  condition:
    condition: and
    conditions:
      - condition: state
        entity_id: input_boolean.int_menos_notificaciones
        state: 'off'  
      - condition: or
        conditions:
          - condition: template
            value_template: "{{ trigger.from_state.state != 'unknown' and trigger.to_state.state != 'unknown'}}"
          - condition: template
            value_template: "{{ trigger.to_state.state > 0 and trigger.to_state.state < 10 }}"

  action:
    - service: notify.notif_telegram_bot
      data_template:
        message: "\U0001f50b Atención! {{ trigger.to_state.name }} el nivel de bateria del termostato es bajo* \U0001f50b"

Esta automatización envía la calibración de temperatura a las válvulas cada 30 minutos siempre que el estado de la caldera sea calentando que es cuando nos interesa que la reciban.

  ######################################################################################################################
  #Enviamos la calibracion de la temperatura local cuando arranca la caldera o cada 30 minutos mientras acta activa
  ######################################################################################################################
  
- id: Ajuste de calibracion de la temperatura de las valvulas termostato MQTT
  initial_state: 'on'
  alias: Ajuste de calibracion de la temperatura de las valvulas termostato MQTT
  trigger:
    - platform: state  
      entity_id: climate.calefaccion_casa
    - platform: time_pattern
      minutes: '/30'
      seconds: 00   
  condition:
    - condition: template
      value_template: "{{(states.climate.calefaccion_casa.state ==  'heat')}}"
    - condition: state
      entity_id: switch.rele_termostato_caldera
      state: 'on'      
  action:   
    - service: notify.notif_telegram_bot
      data:
        message: "*Ajuste valvula radiador : * ( Oriol )"          
    - service: mqtt.publish
      data:
        topic: zigbee2mqtt/termostato_oriol/set   
        payload: >-
            { 
            "local_temperature_calibration": "{{  min(5,  max( -5, (
            (states.sensor.temperatura_oriol_calibrada.state | float(0)) | round(2) -
            (states.climate.termostato_oriol.attributes['local_temperature'] | float(0)) 
            ))) | round(2)
            }}"
            }

    - service: notify.notif_telegram_bot
      data:
        message: "*Ajuste valvula radiador : * ( Matrimonio )"                  
    - service: mqtt.publish
      data:
        topic: zigbee2mqtt/termostato_matrimonio/set   
        payload: >-
            { 
            "local_temperature_calibration": "{{  min(5,  max( -5, (
            (states.sensor.temperatura_comedor_calibrada.state | float(0)) | round(2) -
            (states.climate.termostato_matrimonio.attributes['local_temperature'] | float(0)) 
            ))) | round(2)
            }}"
            }

    - service: notify.notif_telegram_bot
      data:
        message: "*Ajuste valvula radiador : * ( Comedor derecho )"                  
    - service: mqtt.publish
      data:
        topic: zigbee2mqtt/termostato_comedor_derecho/set   
        payload: >-
            { 
            "local_temperature_calibration": "{{  min(5,  max( -5, (
            (states.sensor.temperatura_comedor_calibrada.state | float(0)) | round(2) -
            (states.climate.termostato_comedor_derecho.attributes['local_temperature'] | float(0)) 
            ))) | round(2)
            }}"
            }

    - service: notify.notif_telegram_bot
      data:
        message: "*Ajuste valvula radiador : * ( Comedor izquierdo )"                  
    - service: mqtt.publish
      data:
        topic: zigbee2mqtt/termostato_comedor_izquierdo/set   
        payload: >-
            { 
            "local_temperature_calibration": "{{  min(5,  max( -5, (
            (states.sensor.temperatura_comedor_calibrada.state | float(0)) | round(2) -
            (states.climate.termostato_comedor_izquierdo.attributes['local_temperature'] | float(0)) 
            ))) | round(2)
            }}"
            }

    - service: notify.notif_telegram_bot
      data:
        message: "*Fin de ajuste valvulas radiadores *"
  

Al minuto de arrancar Home Assistant enviamos la configuración de las válvulas según mas nos interese.

  ######################################################################################################################
  #Enviamos la configuracion de las valvulas al arrancar el sistema
  ######################################################################################################################

- id: Envio configuracion valvulas termostaticas 
  alias: Envio configuracion valvulas termostaticas 
  initial_state: 'on'
  trigger:
    - event: start
      platform: homeassistant       
  action:
    - delay: 00:01:00
    #Temperaturas Termostatos valvulas radiadores climate
    - service: climate.set_preset_mode
      target:
        entity_id: 
          - climate.calefaccion_casa
          - climate.termostato_oriol
          - climate.termostato_matrimonio
          - climate.termostato_comedor_derecho
          - climate.termostato_comedor_izquierdo
      data:
        preset_mode: 'none'

    - service: climate.set_temperature
      target:
        entity_id: 
          - climate.calefaccion_casa
          - climate.termostato_oriol
          - climate.termostato_matrimonio
          - climate.termostato_comedor_derecho
          - climate.termostato_comedor_izquierdo
      data:
        temperature: '{{ states.input_number.temperatura_caldera.state | float(0) }}'

    - service: climate.set_hvac_mode
      target:
        entity_id: 
          - climate.calefaccion_casa
          - climate.termostato_oriol
          - climate.termostato_matrimonio
          - climate.termostato_comedor_izquierdo
          - climate.termostato_comedor_derecho
      data:
        hvac_mode: 'off'

    - service: climate.turn_off
      entity_id: 
        - climate.termostato_oriol
        - climate.termostato_matrimonio
        - climate.termostato_comedor_derecho
        - climate.termostato_comedor_izquierdo