Sensores virtuales y Jinja2 en Home Assistant

Sensores virtuales y Jinja2 en Home Assistant
Índice

Aquí dejo la solución que he implementado ante el problema de crear una nueva entidad en Home Assistant cuyo valor dependa del de otras entidades ya existentes gracias al uso de sensores virtuales y el motor de plantillas de Jinja2.

Creando el archivo de sensores

Antes de seguir adelante es importante tener instalado el complemento File Editor que puedes instalar desde la tienda oficial.

image-01

Abriremos el complemento y a continuación hay que crear un nuevo archivo en la carpeta “/config” con nombre “sensors.yaml”

Abriremos el archivo “configuration.yaml” y lo editaremos añadiendo la siguiente línea

sensor: !include sensors.yaml

Antes de seguir adelante, guardaremos los cambios y comprobaremos que todo funciona correctamente verificando los archivos de configuración desde el apartado “Controles del servidor” en el menú de configuración de Home Assistant.

image-02

Si la configuración es válida podemos seguir adelante con la creación de nuestro nuevo sensor virtual.

El error más habitual es que ya tubieramos creado un sensor dentro del archivo “configuration.yaml”. Deberemos moverlos al archivo “sensors.yaml”

Sensor para el punto cardinal del viento

En mi instalación de Home Assistant hago unos de la integracion de la AEMET para obtener la información del tiempo. El valor de la dirección del viento se obtiene como un valor en grados lo cual no resulta muy intuitivo por lo que me he decidido a crear una nueva entidad que lo transforme en un campo de texto que nos indique si em viento viene del norte, del sur….

En el archivo “sensors.yaml” añadiremos el nuevo sensor

  - platform: template
    sensors:
      aemet_dir_viento_texto:
        friendly_name: "Dirección viento"
        value_template: >-
            {% if ( states('sensor.aemet_wind_bearing') | float < 22.5 ) %}
                Norte
            {% elif ( states('sensor.aemet_wind_bearing') | float < 67.5 ) %}
                Noreste
            {% elif ( states('sensor.aemet_wind_bearing') | float < 112.5 ) %}
                Este
            {% elif ( states('sensor.aemet_wind_bearing') | float < 157.5 ) %}
                Sureste
            {% elif ( states('sensor.aemet_wind_bearing') | float < 202.5 ) %}
                Sur
            {% elif ( states('sensor.aemet_wind_bearing') | float < 247.5 ) %}
                Suroeste
            {% elif ( states('sensor.aemet_wind_bearing') | float < 292.5 ) %}
                Oeste
            {% elif ( states('sensor.aemet_wind_bearing') | float < 337.5 ) %}
                Cierzo
            {% else %}
                Norte
            {% endif %}

Lo hemos nombrado como “aemet_dir_viento_texto” y para calcular su valor se emplea el motor de plantilla Jinja2. El valor del sensor “aemet_wind_bearing” se convierte a un valor numérico y se compara con los distintos rangos cada 45 grados para obtener el punto cardinal desde el que sopla el viento.

Ya sólo resta añadir este sensor en la página que deseemos de home assistant y tendremos la dirección del viento de una forma mucho más amigable.

image-03

Sensor para definir si trabajo

Cuando no se vive solo en casa es un detalle no despertar a todos cuando uno lo tiene que hacer antes de las 5:00 AM. Dentro de los turnos de trabajo, me tengo que levantar a esta hora si trabajo en el turno de “Mañana” o de “Sobrante” lo cual tengo definido en el calendario de google “turno_de_trabajo”.

Vamos a crear un sensor virtual que, en función del calendario devuelva un “On” si tengo que madrugar o un “Off” si no tengo que hacerlo.

En el archivo “sensors.yaml” añadiremos el nuevo sensor

  - platform: template
    sensors:
      madrugo_hoy:
        friendly_name: "Tengo que madrugar hoy?"
        value_template: >-
            {% set turno = state_attr('calendar.turno_de_trabajo','message') %}
            {% set fecha_turno = state_attr('calendar.turno_de_trabajo','start_time') %}
            {% set fecha_hoy = as_timestamp(now())|timestamp_custom("%Y-%m-%d 00:00:00") %}
            
            {% if (fecha_hoy == fecha_turno and (turno == "Mañana" or turno == "Sobrante")) %}
            On
            {% else %}
            Off
            {% endif %}

Y con esto ya puedo definir una automatización en la que, si estoy en casa y tengo que madrugar, se enciendan las luces de forma muy tenue durante unos minutos hasta que me voy de casa.