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 :
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
/ (en anglais : Template).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.
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.
{{ states('input_boolean.porte_virtuelle') }}
Le même résultat est obtenu avec ceci :
ou encore avec :
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).
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.
{{ states.weather.forecast_maison }}
ou, si vous préférez travailler avec OpenWeatherMap :
{{ states.weather.openweathermap }}
On voit d'un coup tous les attributs disponibles.
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) :
{{ states.sensor['identifiant_objet_problematique'] }}
Pour travailler avec un attribut particulier :
{{ state_attr('weather.forecast_maison', 'humidity') }}
La fonction is_state() retourne true si un capteur correspond à la valeur passée en paramètre :
{{ is_state('sun', 'rising') }}
Avec is_state_attr(), on peut vérifier si un attribut a une valeur donnée :
{{ 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 :
{% if is_state('input_boolean.porte_virtuelle', 'on') %}
ouverte
{% else %}
fermée
{% endif %}
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.
{% 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 :
{{ states('sensor.5_in_1_pir_motion_sensor_air_temperature') | int < 20 }}
Afin de rendre le code plus facile à lire, vous pouvez créer des variables que vous réutiliserez plus loin dans le modèle.
{% set humidite = state_attr('weather.forecast_maison', 'humidity') %}
{% if humidite > 40 %}
Humidité élevée
{% else %}
Humidité normale
{% endif %}
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) :
{% 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) :
{% for index in range(0,10)%}
{{ index }}
{% endfor %}
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 #}.
{# Ceci est un commentaire #}
1. « Templating ». Home Assistant. https://www.home-assistant.io/docs/configuration/templating/
▼Publicité