Calcul Jinja dans un Yaml

Mon problème

Bonjour, cela fais quelques paquets d’heures que j’essaie de comprendre comment fonctionne les fichiers « yaml ». La réaction de bouton et autres ça va ! Le service en faisant des automatisations avec l’interface graphique et en modifiant, j’arrive à mes fins mais je ne suis pas sûr que mes lignes sont bien propres. D’où ma première question, auriez-vous des tutoriels à me conseil de préférence en français ?

Actuellement je bute à essayer de faire des calculs, voici mon code:

message: >
        {{ states('input_number.position_volet_bv') }}
        {% if states('input_number.position_volet_bv') < '20.0' %}
            {{ "Correction des valeur basse" }}
            {# 2+2 #}
            {# states('input_number.position_volet_bv') + 2 #}
            {# 0,0009*states('input_number.position_volet_bv')^3 - 0,0751*states('input_number.position_volet_bv')^2 + 2,878*states('input_number.position_volet_bv') #}
        {% else %}
            {{ "Correction des valeur haute" }}
            {# -0,0024*states('input_number.position_volet_bv')^2 + 1,102*states('input_number.position_volet_bv') + 13,442 #}
        {% endif %}

Si j’ai bien déduit de mes essais ;

{{ xxxx}} Traite l’information normalement comme si c’était sur la même ligne que message ou presque (permettent d’avoir plusieurs lignes)

{%xxx%} Réalise l’opération sens l’afficher

{#xxx#} Commentaire

Pouvez vous confirmer ou infirmer ma déduction ?

Et mon gros problème est que {{2+2}} me renvoit bien 4 mais que je suis incapable de trouver la syntaxe pour faire des calculs avec des valeurs donner par une intégration.
Petite question bonus « | int » me permet d’avoir une valeur entière auriez-vous l’option pour un arrondi ? J’avoue ne pas avoir cherché comme j’arrive déjà pas à calculer. Je vous remercie de l’attention porte à ce poste

Ma configuration


System Health

version core-2021.9.7
installation_type Home Assistant Supervised
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.9.7
os_name Linux
os_version 5.10.63-v7l+
arch armv7l
timezone Europe/Paris
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Raspbian GNU/Linux 10 (buster)
update_channel stable
supervisor_version supervisor-2021.09.0
docker_version 20.10.8
disk_total 109.8 GB
disk_used 7.8 GB
healthy true
supported failed to load: Unsupported
supervisor_api ok
version_api ok
installed_addons Samba share (9.5.1), File editor (5.3.3), MariaDB (2.4.0), Nginx Proxy Manager (0.11.0), Z-Wave JS (0.1.40)
Lovelace
dashboards 1
resources 0
views 2
mode storage
___

Re,

Peux-tu préciser ton besoin ? Parce que les fonctions affines du 2ème et 3ème degré ça me pose pas de souci, mais j’ai juste un peu peur de ce que ça va donner à la fin si par hasard input_number.position_volet_bv qui sert de base au calcul, et lié en retour à la position du volet … On va avoir une belle boucle

PS pour info, cette syntaxe c’est du jinja2 … pas du yaml

1 « J'aime »

Hello,

Oui la syntaxe jinja 2 est celle qui permet de créer des templates (modèle en français) dans un code yaml. Ce n’est pas du YAML.
L’utilisation la plus courante (mais pas que) est justement dans les entities de type template, ou on peut faire un calcul pour retourner une valeur spécifique avec l’entity, en mettant le jina 2 dans le champs value_template.

Jinja 2 n’est pas spécifique à Home Assistant. Pour apprendre la syntaxe, je te conseille de parcourir : Jinja — Jinja Documentation (2.11.x)
Autrement, il y a pas mal d’exemples sur : Value_template - Configuration - Home Assistant Community

Pour faire des essais jinja 2 ou même mettre au point du code jinja 2 un peu complexe, Il vaut mieux aller dans l’outil de développement, section modèle. Puis ensuite seulement copier coller le code dans le yaml.

J’ai très rapidement repris une partie de ton code, recopié dans l’outil de développement, et fait quelques corrections pour créer un exemple. J’ai créé un input number et l’ai mis à 10

Valeur du champs : {{ states('input_number.position_volet_bv') -}}
{% if states('input_number.position_volet_bv')|float < 20.0 %}
{{"Correction de valeur basse : " -}}
  {# states('input_number.position_volet_bv') + 2 -#}
  {{ 0.0009*states('input_number.position_volet_bv')|float **3 - 0.0751*states('input_number.position_volet_bv')|float **2 + 2.878 * states('input_number.position_volet_bv')|float   }}
{% else %}
Correction de valeur haute
...
{% endif %}

Ce qui donne dans l’outil :

Quelques remarques :

  • Il faut mettre |float après state(…) pour convertir l’expression qui précède en float
  • Pas de quote pour les nombres : < '20 ’ ne marchera pas
  • {{… }} pour retourner une valeur et le calcul
  • Pour une puissance, c’est **
  • Attention entre les points et les virgules pour les nombres. Ta machine peut utiliser des points et non des virgules
  • Il est possible de mettre un tiret avant les fermetures d’accolades pour ne pas sauter une ligne
  • Tu pourrais ici créer une variable qui lit la valeur de l’input number, puis l’utiliser n fois…
2 « J'aime »

Merci pour vos réponses extrêmement enrichissantes. Effectivement je ne faisais pas la bonne recherche je n’avais pas trouvé de tutoriel. Pour le moment mon input est une valeur que je détermine pour positionner le volet et non un retour d’information cela devrait venir plus tard mais il faut vraiment que je maîtrise bien ce que je fais pour éviter de faire une boucle. @Argonaute Un gros merci pour ta réponse qui me semble complète je teste tout ça demain. As-tu un outil de développement particulier à me conseiller ?

@Argonaute a déjà anticipé le besoin :

Bonjour, je vous dis à très gros merci. @Argonaute je suis refait impeccable et je n’avais pas vu cette fonctionnalité de l’outil de développement qui me change la vie !