Formation PUB425 : Objets connectés avec Jeedom et Home Assistant, A-2025 Les modèles Home Assistant

38.1 Les modèles dans Home Assistant


Les modèles sont un mécanisme qui permet d'obtenir une valeur à partir d'autres valeurs avec possibilité d'opérations mathématiques, de tests conditionnels, etc.

On peut les comparer à de petits bouts de programmes qui ont accès notamment aux valeurs :

  • des capteurs virtuels que vous pourrez ajuster dans l'onglet Aperçu
  • des capteurs réels
  • de toute autre entité

Grâce à eux, les scripts et les automatisations bénéficient de plus de possibilités. 

Dans cette fiche :

Éditeur de modèles

Le code d'un modèle doit répondre aux règles énoncées ici : https://www.home-assistant.io/docs/configuration/templating/.

Le langage utilisé pour définir un modèle est Jinja2. Sa syntaxe ressemble à celle de Python.

Pour vous aider à valider le code d'un modèle, rendez-vous dans Outils de développement / Modèle (en anglais : Template).

Modèle

Effacez le contenu de l'éditeur de modèles et remplacez-le par celui que vous désirez tester. Le résultat apparaîtra immédiatement à droite.

Valeur principale d'un capteur

Dans sa forme la plus simple, le modèle pourra retrouver la valeur principale d'un capteur.

Pour travailler avec les valeurs des capteurs, il faut utiliser les objets de type state.

Ici, on utilisera la fonction states() et on lui fournira en paramètre l'identifiant de l'entité, le tout entre doubles accolades.

Modèle

{{ states('input_boolean.porte_virtuelle') }}

Valeur du capteur

Le même résultat est obtenu avec ceci :

Modèle

{{ states.input_boolean.porte_virtuelle['state'] }}

ou encore avec :

Modèle

{{ states.input_boolean.porte_virtuelle.state }}

Cependant, selon la documentation officielle de Home Assistant1:

Avoid using states.sensor.temperature.state, instead use states('sensor.temperature'). It is strongly advised to use the states(), is_state(), state_attr() and is_state_attr() as much as possible, to avoid errors and error message when the entity isn’t ready yet (e.g., during Home Assistant startup).

Capteur avec attributs

Certains capteurs ont plusieurs attributs.

Pour le savoir, utilisez un modèle qui constiste en le mot states suivi d'un point puis de l'identifiant du capteur.

Cette syntaxe ne doit pas être utilisée dans une automatisation mais elle est utile dans les outils de développement.

Modèle

{{ states.weather.forecast_maison }}

ou, si vous préférez travailler avec OpenWeatherMap :

Modèle

{{ states.weather.openweathermap }}

states.sensor.maison

On voit d'un coup tous les attributs disponibles.

Il est possible de demander à voir seulement les attributs.

Modèle

{{ states.weather.forecast_maison.attributes }}

attributs

Retrouver un attribut particulier

Pour travailler avec un attribut particulier :

Modèle

{{ state_attr('weather.forecast_maison', 'humidity') }}

state_attr

Conditions

La fonction is_state() retourne true si un capteur correspond à la valeur passée en paramètre :

Modèle

{{ is_state('sun', 'rising') }}

Avec is_state_attr(), on peut vérifier si un attribut a une valeur donnée :

Modèle

{{ is_state_attr('weather.forecast_maison', 'temperature', 20 ) }}

Le test conditionnel combiné à states(), state_attr(), is_state() ou is_state_attr() offre des possibilités intéressantes :

Modèle

{% if is_state('input_boolean.porte_virtuelle', 'on') %}
  ouverte
{% else %}
  fermée
{% endif %}

Travailler avec des valeurs numériques

Dans le cas où le modèle doit effectuer un test entre une valeur retrournée par states() et une valeur numérique (int ou float),  les bonnes pratiques veulent que le modèle utilise un filtre pour assurer que la valeur est du bon type.

Il s'agit d'ajouter une pipe (|) suivie du type.

Modèle

{% if states('sensor.temperature') | float < 20.0 %}
  Il faut démarrer le chauffage!
{% elif states ('sensor.temperature') | float > 25.0 %}
  Il faut démarrer la climatisation!
{% else %}
  La température est parfaite!
{% endif %}

Parfois, ce n'est pas une question de bonnes pratiques mais bien une question de bon fonctionnement.

Par exemple, si vous tentez de comparer la valeur d'un capteur avec une valeur numérique, vous pourriez obtenir une erreur du genre « TypeError: '<' not supported between instances of 'str' and 'int' ».

Le message est alors clair : il n'est pas possible de comparer une chaîne et un entier.

Type error

La conversion de type est alors une obligation en plus d'être une bonne pratique :

Modèle

{{ states('sensor.5_in_1_pir_motion_sensor_air_temperature') | int < 20 }}

Variables dans un modèle

Afin de rendre le code plus facile à lire, vous pouvez créer des variables que vous réutiliserez plus loin dans le modèle.

Modèle

{% set humidite = state_attr('weather.forecast_maison', 'humidity') %}

{% if humidite > 40 %}
  Humidité élevée
{% else %}
  Humidité normale
{% endif %}

Boucles dans un modèle

Un modèle peut effectuer une boucle pour réaliser une opération un nombre défini de fois ou encore pour effectuer une opération sur chaque entité qui répond à un critère.

Par exemple, pour effectuer une opération sur chacun des capteurs virtuels booléens (ici, on ne fait qu'afficher l'identifiant) :

Modèle

{% for state in states.input_boolean %}
  {{ state.entity_id }}
{% endfor %}

Pour boucler un nombre défini de fois (ici, on ne fait qu'afficher l'index) :

Modèle

{% for index in range(0,10)%}
  {{ index }}
{% endfor %}

Commentaires dans un modèle

J'aime bien conserver dans l'éditeur de modèles de Home Assistant une série de tests que je réalise.

Pour mieux m'y retrouver, j'y ajoute des commentaires.

Les commentaires dans les modèles sont entourés de {# et de #}.

Modèle

{# Ceci est un commentaire #}

Identifiants d'objets non conformes

Si, lorsque vous testez un tel modèle dans l'éditeur, vous obtenez un message du genre « TemplateSyntaxError: expected token 'end of print statement', got '... », c'est peut-être parce que l'identifiant de l'objet (ce qui suit le point dans l'identifiant de l'entité) débute par un caractère non autorisé, par exemple un chiffre.

Template syntax error

Pour régler ce problème, vous pouvez utiliser cette syntaxe (remplacez sensor par le domaine et identifiant_objet_problematique par l'identifiant de l'objet) :

Modèle

{{ states.sensor['identifiant_objet_problematique'] }}

Template syntax error

Remarquez les différentes syntaxes et leur résultat. Dans cet exemple, j'ai utilisé un identifiant d'objet qui ne pose pas de problème.

Les deux premiers modèles donnent le même résultat mais pas le troisième.

Dans tous les cas, il est conseillé de travailler avec states() plutôt qu'avec states..

syntaxes

Résumé des syntaxes

Syntaxe Description Résultat

{{ states('weather.forecast_maison') }}

Syntaxes équivalentes à éviter :

{{ states.weather.forecast_maison['state'] }}

{{ states.weather.forecast_maison.state }}

Donne la valeur principale d'une entité. cloudy

Autre exemple :

{{ states('input_boolean.porte_virtuelle') }}

 

  on 

{{ states.weather.forecast_maison }}

Syntaxe équivalente :

{{ states.weather['forecast_maison'] }}

Donne la valeur principale d'une entité de même que de tous ses attributs.

À utiliser seulement dans les outils de développement. 

La première syntaxe ne fonctionne pas si l'identifiant de l'objet débute par un chiffre.

<template TemplateState(<state weather.forecast_maison=partlycloudy; temperature=4.5, dew_point=3.7, temperature_unit=°C, humidity=95, cloud_coverage=71.1, uv_index=0.1, pressure=1025.2, pressure_unit=hPa, wind_bearing=217.2, wind_speed=9.4, wind_speed_unit=km/h, visibility_unit=km, precipitation_unit=mm, attribution=Weather forecast from met.no, delivered by the Norwegian Meteorological Institute., friendly_name=Forecast Maison, supported_features=3 @ 2025-10-25T08:45:35.357881-04:00>)>

Autre exemple : 

{{ states.input_boolean.porte_virtuelle }}

  <template TemplateState(<state input_boolean.porte_virtuelle=off; editable=False, icon=mdi:door, friendly_name=Porte virtuelle @ 2025-10-22T19:27:16.228318-04:00>)> 

{{ states.weather.forecast_maison.attributes }}

Syntaxe équivalente :

{{ states.weather['forecast_maison'].attributes }}

Donne la valeur de tous les attributs d'une entité.

À utiliser seulement dans les outils de développement. 

La première syntaxe ne fonctionne pas si l'identifiant de l'objet débute par un chiffre.

{'temperature': 4.5, 'dew_point': 3.7, 'temperature_unit': <UnitOfTemperature.CELSIUS: '°C'>, 'humidity': 95, 'cloud_coverage': 71.1, 'uv_index': 0.1, 'pressure': 1025.2, 'pressure_unit': <UnitOfPressure.HPA: 'hPa'>, 'wind_bearing': 217.2, 'wind_speed': 9.4, 'wind_speed_unit': <UnitOfSpeed.KILOMETERS_PER_HOUR: 'km/h'>, 'visibility_unit': <UnitOfLength.KILOMETERS: 'km'>, 'precipitation_unit': <UnitOfPrecipitationDepth.MILLIMETERS: 'mm'>, 'attribution': 'Weather forecast from met.no, delivered by the Norwegian Meteorological Institute.', 'friendly_name': 'Forecast Maison', 'supported_features': <WeatherEntityFeature.FORECAST_DAILY|FORECAST_HOURLY: 3>}
{{ state_attr('weather.forecast_maison', 'humidity') }} Donne la valeur d'un attribut de l'entité. 79

{{ is_state('sun', 'rising') }}

Vérifie si l'état correspond à une valeur. False

{{ is_state_attr('weather.forecast_maison', 'temperature', 20 ) }}

Vérifie si un attribut correspond à une valeur. True

Source

1. « Templating ». Home Assistant. https://www.home-assistant.io/docs/configuration/templating/

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre