"timeout: / continue_on_timeout" avec la fonction "choose:"

Mon problème

Bonjour,

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: »

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:
          - type: turn_on
            device_id: 26dbc1f59051216f858547955c813d24
            entity_id: light.action_finale
            domain: light
      - 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'
          - type: turn_on
            device_id: 26dbc1f59051216f858547955c813d24
            entity_id: light.action_finale
            domain: light
    default: []
mode: restart

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)
Lovelace
dashboards 3
resources 7
views 7
mode storage
___

Regroupes les actions communes dans des scripts (c’est leur fonction :wink:)

Les crochets sont de trop pour moi.

En le remplaçant par :

- wait_template: "{{ is_state('light.condition', 'on') }}"
  timeout: 10
  continue_on_timeout: false

ça donne quoi ?

Bonsoir, merci pour votre retour.

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 ?

        sequence:
          - service: script.turn_on
            target:
              entity_id: script.test

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.

Merci encore et bonne soirée.

Comment ça ? Je ne comprends pas la phrase :upside_down_face:

Re,

J’ai testé et le problème est identique si les action suivante sont après la fonction choose:

        sequence:
          - wait_for_trigger:
              - platform: template
                value_template: '{{ is_state(''light.condition'', ''on'') }}'
            continue_on_timeout: false
            timeout: '30'

ni comme ça

        sequence:
          - wait_template: '{{ is_state(''light.condition'', ''on'') }}'
            timeout: '30'
            continue_on_timeout: false

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…

Comment ça ? Je ne comprends pas la phrase :upside_down_face:

Avec un exemple de code j’espère que ce sera plus claire:

        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

après le timeout, le « continue_on_timeout: false » exécute quand même la suite du programme.

        sequence:
          - wait_for_trigger:
              - platform: state
                entity_id: light.condition
                from: 'off'
                to: 'on'
            continue_on_timeout: false
            timeout: '30'
          - type: turn_on
            device_id: 26dbc1f59051216f858547955c813d24
            entity_id: light.action_finale
            domain: light
    default: []

après le timeout, le « continue_on_timeout: false » arrête le programme. Mais nécessite d’ajouter une action à la suite de chaque choose.

C’est un fonctionnement normal… :innocent:

Dans ton scénario demandé, tu n’as pas à utiliser choose, seulement le wait_template que je t’indique.

Pour obtenir ton scénario, cela suffit :

alias: test
description: ''
trigger:
  - platform: state
    entity_id: light.declencheur
    from: 'off'
    to: 'on'
condition: []
action:
  - wait_template: "{{ is_state('light.condition', 'on') }}"
    timeout: 10
    continue_on_timeout: false
  - type: turn_on
    device_id: 26dbc1f59051216f858547955c813d24
    entity_id: light.action_finale
    domain: light
1 « J'aime »

Ouh ouh avec uniquement le wait_template comme tu la décrit ça fonctionne comme je le souhaite ! :star_struck:
C’est la bonne piste. :relaxed:

Merci.

Bon maintenant j’augmente un peu la difficulté :face_with_thermometer:

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 ?

action:
  - wait_template: "{{ is_state('sensor.temperature_condition', 'above: 23') }}"
    timeout: 10
    continue_on_timeout: false
action:
  - wait_template: "{{ is_state(sensor.temperature_condition', 'below: 25') }}"
    timeout: 10
    continue_on_timeout: false

???

Merci encore pour tes bons tuyaux.

tu peux faire un grafcet ? un schéma ? car là textuellement c’est pas le top… :upside_down_face:

et explique l’automatisation que tu veux plutôt que de savoir si la solution est bonne…

c’est plus simple de reprendre de zéro pour expliquer car peut être que tu ne pars pas dans la bonne direction (peut être… mais ça s’est déjà vu :wink: )

Ce code n’est pas correct.

Il faudrait plus utiliser :

{{states('sensor.temperature_condition')|float > 23}}
1 « J'aime »

Salut et merci,

Je n’ai pas eu le temps de faire un grafcet.
En passant du temps de recherche j’ai trouver ces deux bout de code qu’il faut que je teste.

{{ states('sensor.temperature_condition') | int > 23 }}
{{ states('sensor.temperature_condition') | int >= 23 }}

et le tient

{{states('sensor.temperature_condition')|float > 23}}

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. :grimacing:

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.

Bonne journée.

Les trois versions sont très semblables.

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 :upside_down_face: 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 :wink:)

Les liens vers la documentations sont présent dans les Outils de développement, onglet MODÈLES.

Bon courage et n’hésite pas :+1:

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.

J’ai testé ça

wait_template: '{{ states(''sensor.t_h02_bureau_temperature'')|float >= 26 }}'

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. :partying_face:

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 !

1 « J'aime »

Non mais c’est tellement plus lisible, c’est tout.

Je m’en suis douté :sweat_smile: d’où l’explication… :innocent:

giphy

:joy: