Création d'un template avec deux conditions

Mon problème

Impossible de créer un template avec deux conditions.

Ma configuration


[center]## System Information

version core-2022.10.2
installation_type Home Assistant Supervised
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.10.5
os_name Linux
os_version 5.10.0-17-amd64
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 4867
Installed Version 1.28.0
Stage running
Available Repositories 1122
Downloaded Repositories 21
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 Debian GNU/Linux 11 (bullseye)
update_channel stable
supervisor_version supervisor-2022.10.0
agent_version 1.3.0
docker_version 20.10.18
disk_total 48.0 GB
disk_used 17.3 GB
healthy true
supported failed to load: Unsupported
supervisor_api ok
version_api ok
installed_addons Duck DNS (1.15.0), ESPHome (dev) (dev), FTP (4.6.1), File editor (5.4.1), Glances (0.16.0), Grafana (8.0.2), Log Viewer (0.14.0), MariaDB (2.5.1), Mosquitto broker (6.1.3), Portainer (2.15.1), SSH & Web Terminal (12.0.2), Samba Backup (5.1.2), Samba share (10.0.0), motionEye (0.18.0), phpMyAdmin (0.8.1), Simple Scheduler (0.64), Nginx Proxy Manager (0.12.2)
Dashboards
dashboards 1
resources 17
views 17
mode storage
Recorder
oldest_recorder_run 13 septembre 2022 à 20:24
current_recorder_run 10 octobre 2022 à 20:09
estimated_db_size 384.89 MiB
database_engine mysql
database_version 10.6.8
[/center] ___

Bonjour à tous,

Je souhaite créer un template et y mettre deux conditions, j’ai gratté tout l’après midi et je ne suis arrivé à rien. Je vous joins ce que j’ai pu faire mais avec un message d’erreur.

{% if is_state('sensor.watermeter_erreur' != 'error') or is_state('sensor.watermeter_valeur')|float(0) < 159000 %} 
{{ states('sensor.watermeter_valeur')}}
{% else %} 
{% endif %}

Je souhaiterai que si les deux conditions sont réunies la valeur du sensor.watermeter_valeur soit validé. Mais quand je copie ce template dans « modele » j’ai cette erreur:
« TypeError: is_state() missing 1 required positional argument: ‹ state › »

Sinon j’ai essayé une autre config qui fonctionne un peu mieux:

{{ states('sensor.watermeter_erreur') != 'error' 
and states('sensor.watermeter_valeur')|float(0) < 159000
}}

Le problème avec celle ci c’est qu’elle ne m’affiche pas de valeur mais true ou false.

En vous remerciant pour votre aide.

Hello
Ce n’est pas la bonne forme is_state(entity, valeur de l’état)

Et la deuxième tu fais juste une comparaison donc il t’indique si elle est vrai ou fausse

{% if is_state(‹ sensor.watermeter_erreur ›,‹ error ›) or states(‹ sensor.watermeter_valeur ›)|float(0) < 159000 %}
{{ states(‹ sensor.watermeter_valeur ›)}}
{% else %}
{% endif %}

Merci pour ton aide, je viens de recopier ta correction mais j’ai un message d’erreur.
« TemplateSyntaxError: unexpected char ‹ ‹ › at 15 »

Oui il faut mettre des « ' » c’est le site qui les converti en < >

Mais la doc home assistant tu as des exemples

J’ai fait la modif des caractères, maintenant ça m’affiche la valeur du sensor.watermeter_valeur mais si je change l’état des deux autres sensor ça n’a aucune incidence.

Poste ton nouveau code

J’ai testé ça mais toujours une errreur, j’ai egalement cherché sur la page templating de HA mais je m’y perds, je suis une quiche lol

{% if is_state('sensor.watermeter_erreur' != 'error') or states('sensor.watermeter_valeur')|float(0) < 159000 %} 
{{ states('sensor.watermeter_valeur')}}
{% else %} 
{% endif %}

J’ai ce message d’erreur :
TypeError: is_state() missing 1 required positional argument: ‹ state ›

Car ce n’est pas comme ceci que s’utilise is_state.

Ton code doit être celui ci :

{% if ( 
  not is_state('sensor.watermeter_erreur', 'error')
  ) or (
  states('sensor.watermeter_valeur')|float(0) < 159000
  )
%} 
  {{ states('sensor.watermeter_valeur')}}
{% else %} 
{% endif %}

Merci pour ton aide, je viens de tester ton template et ça ne fonctionne pas, lorsque je modifie l’un ou l’autre des sensor il m’affiche quand même la valeur. J’ai réussi malgré tout, certes de manière pas très académique, à obtenir ce que je voulais. Je m’explique:
J’ai créé un premier sensor qui me renvoie la valeur True ou False et avec un deuxieme sensor, si à True, j’affiche la valeur du sensor.watermeter_valeur.

    - name: watermeter_3 
      unique_id: watermeter_3
      unit_of_measurement: L
      state_class: total_increasing
      state_topic: "compteur_eau/main/value" 
      value_template: "{{ states('sensor.watermeter_erreur') == 'no error' and states('sensor.watermeter_valeur')|float(0) < 159000 }}"
      icon: mdi:water 

    - name: watermeter_4 
      unique_id: watermeter_4
      state_topic: "compteur_eau/main/value" 
      value_template: "{% if is_state('sensor.watermeter_3', 'True') %}{{ states('sensor.watermeter_valeur')}}{% else %}{% endif %}"
      icon: mdi:water 

Je pense que j’ai été très approximatif dans mes explications et surtout ce que je souhaitais faire.

De ce que je comprends c’est un and qu’il faut pas un or dans la condition du code corrigé que je t’ai indiqué.

Le code fonctionne mais ne fais pas ce que tu veux… :innocent:

Je me doutais bien que cela venait de moi, c’est bien pour ça que je l’ai précisé à la fin de mon dernier post :wink:
Je ne connais rien en programmation alors j’y vais à tâtons, j’essaye d’adapter des templates que je trouve au travers des articles. D’ailleurs je souhaiterai faire évoluer ce dernier et lui rajouter deux conditions. J’utilise ce template pour gérer ma consommation d’eau qui se fait à l’aide d’un esp32cam qui lit les chiffres qui défilent, or le « soucis » c’est que parfois la lecture est imparfaite et la valeur enregistrée comporte un N, du style 19257N, je souhaiterai que la valeur ne soit copiée que sur le nombre comporte que des chiffres. Ensuite, et surtout au début, quand la valeur était erronée, je me retrouvais avec des 300 000L de conso journalière, ce qui fausse totalement la BDB, pour éviter cela j’aimerai que la valeur écrite ne dépasse pas les 100L par rapport à la dernière valeur. Et pour finir je souhaiterai également que la valeur ne soit pas inferieure à la valeur précédente. Si toutefois vous pouvez m’apportez une aide, mais je ne vais pas attendre et commencer à chercher de mon coté.

En vous souhaitant une bonne journée :wink:

Voilà le resultat de ma matinée:

{{ states('sensor.watermeter_erreur') == 'no error' 
    and states('sensor.watermeter_valeur')|float(0) < 159000 
	and ('N' not in states('sensor.watermeter_valeur'))
	and states('sensor.watermeter_valeur') >= states('sensor.watermeter_2')
    }}

Il ne me manque plus que la condition comme quoi la valeur ne doit pas être supérieure à 100 par rapport au sensor.watermeter_valeur.

Je continue mes recherches.

Voilà la version finale, testée dans les différents cas et je n’ai aucune remontée erronée:

{{ states('sensor.watermeter_erreur') == 'no error' 
and ('N' not in states('sensor.watermeter_valeur'))
and states('sensor.watermeter_valeur') >= states('sensor.watermeter_2')
and (states('sensor.watermeter_2') | float(0) - states('sensor.watermeter_valeur') | float(0)) <100                       }}
{{ states('sensor.watermeter_erreur') == 'no error' 

Le 'sensor.watermeter_erreur doit avoir comme valeur ‹ no error › si non False

and ('N' not in states('sensor.watermeter_valeur'))

Il ne doit pas y avoit de « N » dans la valeur du sensor.watermeter_valeur si oui False

and states('sensor.watermeter_valeur') >= states('sensor.watermeter_2')

La valeur de sensor.watermeter_valeur doit être supérieure ou égale à la valeur du sensor.watermeter_2 si inferieure alors False

and (states('sensor.watermeter_2') | float(0) - states('sensor.watermeter_valeur') | float(0)) <100
 }}

La différence du 'sensor.watermeter_2 avec le sensor.watermeter_valeur ne doit pas étre supérieure à 100 si supérieure False.

Ce template là me créait un sensor.watermeter_3 qui doit etre à « true », je le reprends dans mon sensor d’origine qui me sert pour mes utility meter pour ma conso.

{% if is_state('sensor.watermeter_3', 'True') %}{{ states('sensor.watermeter_valeur')}}{% else %}{% endif %}

J’espère que cela servira à d’autre, je débute dans les template, je ne doute pas que l’on peut faire plus simple mais pour moi la finalité c’est que ça fonctionne.

Je vous remercie tous pour votre aide.

1 « J'aime »