Formation PUB420 : Système domotique DIY, 2020 Home Assistant

6.45 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.

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

Les valeurs que les modèles utilisent peuvent provenir de :

  • un capteur virtuel dont vous pourrez ajuster la valeur dans l'onglet Aperçu
  • un capteur réel
  • toute autre entité

É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/.

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.

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.

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'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.

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'] }}

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 plus de souplesse :

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 avec 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.

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 #}

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