Je vais commencer par exposer mon souhait puis le bout de code comme exemple pour illustrer mon raisonnement. Ce raisonnement je l’utilise dans une dizaine d’automation
Souhait:
Première situation :
Dès que « trigger : » light.declencheur est « ON » et que « conditions : » light.condition est « ON » alors « action : » allume light.action_finale.
Deuxième, troisième et quatrième situation :
Dès que « trigger : » light.declencheur est « ON » et que « conditions : » light.condition est « OFF » alors « wait_for_trigger : » attend « timeout : » de 30 secondes pour que light.condition passe de « OFF » à « ON ».
Avant le « timeout : » de 30 secondes, si le light.condition passe de « OFF » à « ON » alors exécute l’action suivante = allume le light.action_finale.
Après un « timeout : » de 30 secondes et que light.condition reste sur « OFF » alors « continue_on_timeout : false » arrête le programme et ne poursuit pas la prochaine « action : » light.action_finale et attend le prochain « trigger: » light.declencheur.
Codes exemple:
alias: test
description: ''
trigger:
- platform: state
entity_id: light.declencheur
from: 'off'
to: 'on'
condition: []
action:
- choose:
- conditions:
- condition: state
entity_id: light.condition
state: 'on'
sequence:
- conditions:
- condition: state
entity_id: light.condition
state: 'off'
sequence:
- wait_for_trigger:
- platform: state
entity_id: light.condition
from: 'off'
to: 'on'
continue_on_timeout: false
timeout: '30'
default: []
- type: turn_on
device_id: 26dbc1f59051216f858547955c813d24
entity_id: light.action_finale
domain: light
mode: restart
Problème:
C’est ce que j’attendais de la fonction « choose : » avec le « wait_for_trigger : » et « timeout: »,« continue_on_timeout : false » mais cela ne fonctionne pas comme je le souhaite.
Car « continue_on_timeout : » false ou true après le « timeout: » continu d’exécuter les actions suivante
Car toutes mes autres « action: » suivante sont à la suite de la fonction « choose: ». Pour fonctionner il faut que les « action: » suivante soient incluse et copier sous chaque branche de la fonction « choose: »
Code d’exemple avec les actions suivante copiées sous chaque branches de « choose: »
C’est faisable de copier plusieurs fois les actions suivante sous chaque branche de « choose: » mais ça me pose problème car j’ai certaines actions suivante qui sont assez longue et en cas de modification d’une action il faut corriger à plusieurs endroits.
J’utilise certainement la fonction « choose: » d’une mauvaise manière mais je n’ai pas trouver d’autres méthode pour accomplir correctement mes différentes situations de « condition: »
Si quelqu’un a réussi à lire mon explication jusqu’ici, peut-il m’aider à trouver une solution ?
Merci d’avance
Ma configuration
System Health
version
core-2021.8.5
installation_type
Home Assistant OS
dev
false
hassio
true
docker
true
user
root
virtualenv
false
python_version
3.9.6
os_name
Linux
os_version
5.10.17-v8
arch
aarch64
timezone
Europe/Zurich
Home Assistant Community Store
GitHub API
ok
Github API Calls Remaining
4943
Installed Version
1.13.2
Stage
running
Available Repositories
842
Installed Repositories
9
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
Home Assistant OS 6.2
update_channel
stable
supervisor_version
supervisor-2021.06.8
docker_version
20.10.6
disk_total
228.5 GB
disk_used
7.8 GB
healthy
true
supported
true
board
rpi4-64
supervisor_api
ok
version_api
ok
installed_addons
Terminal & SSH (9.1.3), Samba share (9.5.1), NGINX Home Assistant SSL proxy (3.0.2), Duck DNS (1.13.0), Samba Backup (4.5.0)
Je n’ai jamais utiliser la partie script (cela fait que quelques mois que je bidouille HAS) je vais étudier ça de plus près. Pour exécuter un script depuis une automation c’est bien ça ?
Oui les crochets sont de trop, erreur de copier/coller, désolé.
Je vais tester de modifier la partie condition comme vous l’avez écrit mais je ne pense pas que ça changera quelque chose car je pense que le problème est que « continue_on_timeout: » ne fonctionne pas en dehors de la partie « choose: ». Mais je vais essayer dès que possible, si ça fonctionne ça vas m’économiser du temps sur la création de nouveaux script.
Sans le statut ON, après le timeout le programme exécute les actions suivantes. Il faut vraiment que les action: soient dans chaque branches des divers choose:
Donc faut que je me tourne vers les script pour grouper les actions communes…
Ouh ouh avec uniquement le wait_template comme tu la décrit ça fonctionne comme je le souhaite !
C’est la bonne piste.
Merci.
Bon maintenant j’augmente un peu la difficulté
J’ai plusieurs autres automation utilisant aussi la fonction choose, timeout et continu_on_timeout: false avec exactement les même besoin et conditions.
Mais la condition n’est pas avec un état ON ou OFF mais se sont des sondes de température avec des conditions de continu ton programme si la température est au dessus de 23c°, si la température n’est pas encore au dessus de 23c° attend que la température soit au dessus de 23c° mais au maximum le temps du timeout.
Donc exactement le même principe mais avec des état :
« au dessus de » « above: »
ou
« au dessous de » « below: »
Est-ce que le wait_template fonctionne également sous cette forme ?
Faut que je teste les trois versions.
Mais c’est un peu plus compliquer de simuler des températures sur une sonde (un sèche cheveux et un ventilateur) que de faire un ON/OFF sur une lumière.
Sais-tu s’il existe un site qui explique en gros la syntaxe et le langage de ce code ?
J’ai une petite fille de 2 ans donc j’ai l’âge d’un grand-père et bien que je sois dans la technique électronique/informatique le développement n’est pas mon métier. Mais j’aimerai mieux comprendre pourquoi j’écrit ça dans le code.
La premier et la deuxième convertissent la température en intégrer (chiffre sans virgule) et la mienne en float (chiffre avec virgule).
L’intérêt de garder la virgule est si un jour tu souhaites conditionner sur un demi point ou moins (22.5, 22,3 par exemple), chose que tu ne pourras pas faire avec les 2 premières formules (avec le |int).
Ensuite, le > c’est supérieur et >= c’est supérieur ou égal (ça ne répond pas à ta demande de supérieur à 23).
Il faut passer par les Outils de développement puos Onglet ETATS. Là tu sélectionnes l’entité que tu testes et tu change sa valeur dans le champs puis tu cliques sur Définir l'état.
La valeur de l’entité va changer instantanément pour la valeur que tu as renseigner. Puis au prochain événement de réception de données du capteur, sa valeur réelle sera a nouveau renseignée. (pose le sèche cheveux )
Les liens vers la documentations sont présent dans les Outils de développement, onglet MODÈLES.
En fouillant par ci par là j’ai comprit la différence entre int et float ainsi que l’utilisation de >=.
Je te remercie grandement pour tes explications ça consolide ma compréhension. J’apprécie beaucoup.
Je ne sais pas si c’est important mais j’ai vue un peu partout qu’ils ajoutaient un espace, après et avant, à l’intérieur des double crochets alors je les ai ajouté ?
Ca fonctionne et ça fait ce que je veux.
Mes premiers teste je les ai fait avec un sèche cheveux… Je ne connaissais pas la possibilité de simuler un état. Je me répète mais merci encore pour ce tuyaux c’est vraiment plus simple.
Bon il me semble que mon problème est résolu. Merci à toi Clemalex.
Comme mes automations gèrent une vingtaine de lumière, simulation de présence, la fermeture, l’ouverture et la position d’une dizaine de store et du tts sur Google assistant selon les critères : Je suis en vacances ou en congé, c’est un jour férié, les températures intérieur et ou les températures extérieur, la luminosité solaire sur les façades de la maison, le levé, couché et azimute du soleil, si j’ai des invités, si c’est en semaine ou le week-end…
Donc il y a de fort risque que je revienne un jour poser des questions !