viernes, 2 de agosto de 2024

Home Assistant: Termostato virtual controlado por la sensación térmica

En este artículo voy a desarrollar un termostato que puede controlar el encendido/apagado de un aparato de aire acondicionado pero teniendo en cuenta la sensación térmica en vez de la temperatura ambiente. Necesitaremos un sensor de temperatura y humedad (en mi caso un Shelly BLU H&T), un relé para encender/apagar el aire acondicionado, en este caso un Shelly Plus Plug S y un método de cálculo de la sensación térmica.

Si quieres colaborar con el desarrollo del blog puedes hacerlo adquiriendo uno de estos dispositivos en Amazon España a través de los siguientes enlaces:

 

Aunque no es necesario, lo primero que vamos a hacer es añadir la tarjeta Comfortable Environment Card a nuestro HA que nos muestra la sensación térmica en base a la temperatura y la humedad. Para ello seleccionamos HACS - Interfaz - Explorar y descargar repositorio y buscamos por Comfortable Environment Card.


Lo seleccionamos y Descargar - Descargar.

Una vez instalado debemos reiniciar HA. Cuando ha terminado el reinicio vamos a nuestro Panel de control y añadimos una nueva tarjeta y buscamos/seleccionamos Comfortable Environment Card. Debemos añadir un nombre a la tarjeta y seleccionar los sensores de temperatura y humedad de nuestro Shelly. Además seleccionamos algunos parámetros para personalizar la información que muestra la tarjeta y Guardar.

Con esto ya tenemos una tarjeta que nos indica la sensación térmica y el grado de confort en base a la información proporcionada por el Shelly BLU H&T


Creación de los sensores

Esta tarjeta no nos proporciona ningún sensor para obtener la sensación térmica que utilizará nuestro termostato virtual así que tenemos que crear uno. Para ello, y es este el motivo de explicar esta tarjeta, su código fuente nos muestra las formulas de la sensación térmica y del grado de confort.

Nota: El cálculo se basa en la información de la web The Heat Index Equation

Sensación térmica:

protected calcHI(tempInF: number, humValue: number): number {    
  // Compute HI using Farenheit
  const T = tempInF
  const RH = humValue
  let cHI = 0.5 * (T + 61.0 + ((T-68.0)*1.2) + (RH*0.094))
  if (cHI >= 80.0) {
    cHI = -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
    if (RH < 13.0) {
      cHI = cHI - ((13.0 - RH) / 4.0) * Math.sqrt((17.0 - Math.abs(T - 95.0)) / 17.0)
    } else if (RH > 85.0 && T >= 80.0 && T <= 87.0) {
      cHI = cHI + ((RH - 85.0) / 10.0) * ((87.0 - T) / 5.0)
    }
  }
  return cHI
}

Grado de confort (no es necesario):

protected calcDI(tempInC: number, humValue: number): number {
  return parseFloat((tempInC - 0.55 * (1 - 0.01 * humValue) * (tempInC - 14.5)).toFixed(2))
}

Ahora, nos vamos a Studio Code Server y editamos el fichero configuration.yaml. Tenemos que convertir el código original al formato utilizado en yaml (utilizo para esto ChatGPT):

sensor:
  - platform: template
    sensors:
      sensacion_termica:
        friendly_name: "Sensación Térmica"
        unit_of_measurement: "°C"
        value_template: >
          {% set T = (states('sensor.termostato_temperatura') | float * 9 / 5) + 32 %}
          {% set RH = states('sensor.termometro_humedad') | float %}
         {% set simple_HI = 0.5 * (T + 61.0 + ((T-68.0)*1.2) + (RH*0.094)) %}
          {% if simple_HI >= 80.0 %}
            {% set 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 %}
            
            {% if RH < 13.0 and T >= 80.0 and T <= 112.0 %}
              {% set HI = HI - ((13.0 - RH) / 4.0) * ((17.0 - (T - 95.0) | abs) / 17.0) | sqrt %}
            {% elif RH > 85.0 and T >= 80.0 and T <= 87.0 %}
              {% set HI = HI + ((RH - 85.0) / 10.0) * ((87.0 - T) / 5.0) %}
            {% endif %}
          {% else %}
            {% set HI = simple_HI %}
          {% endif %}
          {{ ((HI - 32) * 5 / 9) | round(1) }}
      confort_termico:
        friendly_name: "Confort Térmico"
        unit_of_measurement: "°C"
        value_template: >
          {% set tempInC = states('sensor.termostato_temperatura') | float %}
          {% set humValue = states('sensor.termostato_humedad') | float %}
          {% set confort = tempInC - (0.55 * (1 - 0.01 * humValue) * (tempInC - 14.5)) %}
          {{ confort | round(2) }}

Debemos sustituir sensor.termostato_temperaturasensor.termostato_humedad por las entidades de nuestro sensor de temperatura y humedad. 

Ahora seleccionamos Herramientas para desarrolladores - Verificar configuración y si está correcto, Reiniciar.


Una vez hayamos reiniciado, nos vamos al Panel de control y añadimos una tarjeta del tipo Entidades con los dos sensores que hemos creado (Sensación Térmica y Confort Térmico) para comprobar que la programación realizada es correcta.

Termostato virtual

Por último, vamos crear nuestro propio termostato virtual que dispare un aire acondicionado en base a la sensación térmica. Para ello, editamos el fichero configuration.yaml y añadimos el siguiente código:

climate:
  - platform: generic_thermostat
    name: "Aire acondicionado salón"
    unique_id: "termostato_aire_acondicionado"
    heater: switch.shellyplusplugs_b0b21c10f7e0_switch_0
    target_sensor: sensor.sensacion_termica
    min_temp: 22
    max_temp: 30
    ac_mode: true
    cold_tolerance: 0.5
    hot_tolerance: 0.5
    precision: 0.1
    target_temp_step: 0.1

Hay que destacar que como sensor de temperatura utilizamos el sensor que hemos creado de sensación térmica.

Explicaré cada concepto:

  • climate: Apartado con la configuración de los diferentes dispositivos de climatización.
  • platform: Dispositivo del tipo termostato.
  • name: Nombre del termostato.
  • unique_id: Identificador.
  • heater: Indicamos la entidad que activará el ventilador.
  • target_sensor: Indicamos la entidad del sensor de temperatura.
  • min_temp: Mínima temperatura que muestra la tarjeta.
  • max_temp: Máxima temperatura que muestra la tarjeta.
  • ac_mode: Modo del aire acondicionado: true = frio, false = calor.
  • cold_tolerance: Valor de la temperatura para que se enciende el aire acondicionado con respecto a la temperatura seleccionada.
  • hot_tolerance: Valor de la temperatura para que se apaga el aire acondicionado con respecto a la temperatura seleccionada.
  • precision: redondeo que debe mostrar la temperatura ambiente.
  • target_temp_step: saltos en la definición de la temperatura.

Para más información puedes visitar la página oficial.

A continuación nos vamos a nuestro panel de control, Añadir tarjeta - Por tarjeta, buscamos por Termostato, lo seleccionamos y Guardar.


La tarjeta nos muestra, por un lado, la temperatura (sensación térmica - 27,7ºC) y, por otro lado, podemos seleccionar la temperatura objetivo para el aire acondicionado, en este caso, 26ºC. Teniendo en cuenta la tolerancia que hemos indicado, se encenderá cuando supere los 26,5º y lo parará a los 25,5º.

También disponemos de un para de "botones" encender o apagar el termostato. Si se apaga también se apagará el aire acondicionado.

Resumen

Como hemos podido comprobar, es posible, por un lado, crear un termostato virtual que controle un dispositivo externo, en este caso un Shelly Plus Plug S que alimenta un aparato de aire acondicionado y, por otro lado, obtener la sensación térmica en base a los valores de temperatura y humedad de nuestro sensor Shelly BLU H&T.

Si quieres colaborar con el desarrollo del blog puedes hacerlo adquiriendo uno de estos dispositivos en Amazon España a través de los siguientes enlaces:

 

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.