Automatisation qui ne s'execute qu'une fois sur deux

Mon problème

Bonjour a tous.
J’ai créé deux automatisations destinées a effectuer des actions sur receptions de codes IR de télécommandes.
Les messages IR sont receptionnés via un dongle IR Flirc.
Le Dongle est bien reconnu et les messages bien recus. Il est configuré comme suit dans configuration.yaml

keyboard_remote:
- device_descriptor: '/dev/input/event3'
  type: 'key_down'

La premiere autoatisation me sert a recevoir le code de la touche sur laquelle j’appuie et la mettre dans un input_text; elle ne sert qu’à « decoder »

alias: find out Key codes
trigger:
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event3
action:
  - service: input_text.set_value
    data:
      value: "{{ trigger.event.data.key_code }}"
    target:
      entity_id: input_text.mykeycode

La deuxième automatisation me sert a declencher des actions en fonction du code recu (allumer ou eteindre des light, dans un certain mode).

alias: lumières selon keycode 2
description: ""
trigger:
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event3
condition: []
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "15"
          - condition: state
            entity_id: input_text.mykeycode
            state: "20"
        sequence:
          - service: scene.turn_on
            data: {}
            target:
              entity_id: scene.mode_home_lumieres_salon
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "38"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_off_lumieres_salon
            metadata: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "99"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_films_lumieres_salon
            metadata: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "44"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_tv_lumieres_salon
            metadata: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "57"
        sequence:
          - service: rest_command.mode_reading_yeelight1
            data: {}
          - service: rest_command.mode_reading_yeelight2
            data: {}
          - service: rest_command.mode_reading_yeelight3
            data: {}
          - service: rest_command.mode_reading_yeelight4
            data: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "19"
        sequence:
          - service: rest_command.mode_teatime_yeelight1
            data: {}
          - service: rest_command.mode_teatime_yeelight2
            data: {}
          - service: rest_command.mode_teatime_yeelight3
            data: {}
          - service: rest_command.mode_teatime_yeelight4
            data: {}
mode: restart

En fait tout fonctionne bien sauf que…la deuxième automatisation ne se déclenche qu’une fois sur deux ou 3… alors que la première se declenche bien a chaque fois…!
Elles ont pourtant le meme trigger…
Lorsque mes lights sont allumées par exemple et que j’appuie sur le bouton de la telecommande pour les eteindre, la premiere automatisation recoit bien le message et change bien le input_texte.mykeycode, mais la deuxième automatisation ne se declenche QUE si j’appuie une deuxième ou troisième fois sur le bouton…
J’ai testé avec tout les modes possible l’automatisation 2 (redemarrage, file d’attente, parallèle…)
…idem…
Je sui preneur de conseils!
Merci!

Ma configuration


[center]## System Information

version core-2023.4.6
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.10.10
os_name Linux
os_version 6.1.24
arch aarch64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 5000
Installed Version 1.32.1
Stage running
Available Repositories 1338
Downloaded Repositories 25
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 10.0
update_channel stable
supervisor_version supervisor-2023.04.1
agent_version 1.5.1
docker_version 23.0.3
disk_total 27.9 GB
disk_used 10.0 GB
healthy true
supported true
board odroid-n2
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.7.0), File editor (5.6.0), TasmoAdmin (0.24.1), Studio Code Server (5.5.7), Mosquitto broker (6.2.1), Node-RED (14.1.5), InfluxDB (4.6.0), ESPHome (2023.4.2), Grafana (8.2.2), Samba Backup (5.2.0)
Dashboards
dashboards 3
resources 19
views 7
mode storage
Recorder
oldest_recorder_run 18 avril 2023 à 11:45
current_recorder_run 27 avril 2023 à 12:10
estimated_db_size 411.68 MiB
database_engine sqlite
database_version 3.38.5
Sonoff
version 3.5.1 (122751c)
cloud_online 0 / 2
local_online 2 / 2
[/center]

Hello

pourquoi tu mets restart sur ta seconde ?

Parce que là l’automatisation est en mode restart, mais j’ai essayé mode parrallèle et file d’attente et idem…

J’ai testé en integrant l’automatisation 1 a l’automatisation 2 mais la ca ne fonctionne plus du tout…
le input_text.mykeycode est bien changé, mais les actions suivantes ne s’effectuent pas

alias: lumières selon keycode 2
description: ""
trigger:
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event3
condition: []
action:
  - service: input_text.set_value
    data:
      value: "{{ trigger.event.data.key_code }}"
    target:
      entity_id: input_text.mykeycode
  - choose:
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "15"
          - condition: state
            entity_id: input_text.mykeycode
            state: "20"
        sequence:
          - service: scene.turn_on
            data: {}
            target:
              entity_id: scene.mode_home_lumieres_salon
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "38"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_off_lumieres_salon
            metadata: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "99"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_films_lumieres_salon
            metadata: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "44"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_tv_lumieres_salon
            metadata: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "57"
        sequence:
          - service: rest_command.mode_reading_yeelight1
            data: {}
          - service: rest_command.mode_reading_yeelight2
            data: {}
          - service: rest_command.mode_reading_yeelight3
            data: {}
          - service: rest_command.mode_reading_yeelight4
            data: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "19"
        sequence:
          - service: rest_command.mode_teatime_yeelight1
            data: {}
          - service: rest_command.mode_teatime_yeelight2
            data: {}
          - service: rest_command.mode_teatime_yeelight3
            data: {}
          - service: rest_command.mode_teatime_yeelight4
            data: {}
mode: restart

Le problème est à mon avis multiple :

  • Le mode restart ça veut dire que l’automatisation s’arrête et repart de 0 quand il y a un nouveau déclencheur
  • Tu as une unique valeur de input_text.mykeycode pour l’ensemble donc le dernier code reçu ecrase le précédent, donc même en paraléllisant ça va coincer
  • Tu as mis plein de choose (et des conditions) dans la même automatisation. Donc techniquement tu ne mins facilement pas jouer en parallèle 2 commandes avec cette organisation. C’est d’autant plus vrai que potentiellement si le temps d’exécution est long.

Perso je ferai autant d’automatisations que de choose avec des conditions qui se basent sur la valeur trigger (qui elle est spécifique à l’automatisation courante)

Justement c’et ce que je veux…

C’est ce que je voulais aussi. L’automatisation commande un groupe de lumière, qui ne peut être que dans un seul et unique etat à la fois. Donc un seul input_text…Et ca coince quelque soit le mode…

Alors oui je me suis demandé si le code n’était pas trop « lourd » ou « long », et que le temps d’execution impactait le changement de valeur de l’input_text. Mais il y a un comportement etrange de l’automatisation 2 : meme si j’attends plusieurs minutes pour appuyer a nouveau sur un bouton l’input_text change bien, l’automatisation 1 est lancée avec la bonne valeur de l’input_text; l’automatisation 2 est lancée mais l’input_text n’a pas changé! (uniquement dans cette automatisation…)

J’y ai pensé mais je trouve ca un peu lourd de faire 6 ou 7 automatisations là ou on peut n’en faire qu’une seule… d’autant plus qu’elle n’a pas l’air si lourde.

Avoir un seul et unique état à l’instant X c’est pas exactement pareil que de dire : j’ai pas fini de tout faire (donc arrivé dans un état stable/connu) et je demande déjà à faire autre chose. Je dirais même que c’est l’inverse puisque potentiellement tu es a un moment donné, dans un état complétement différent (un truc à mi-chemin) de ceux que tu as toi-même défini.
Je ne l’utilise pas mais j’ai l’impression que ce que tu veux c’est des scénes

Tu as les traces et donc les durées des actions pour vérifier, mais 4 commandes rest avec un timing de 60s par défaut, ça fait déjà un long temps d’exécution.

C’est une question de point de vue mais 1 grosse automatisation versus 6 ou 7 petites, on ne peut pas dire que c’est plus lourd. Tu as une liste plus longue certes, mais les actions (et les conditions) seront exactement les même. Le gros avantage c’est que comme c’est moins long, c’est plus facile à debugger et plus facile à corriger (comprendre moins d’effet de de bord)

d’ou le mode restart…ca sert bien a ca non? si appel de l’automatisation alors qu’un premier appel n’est pas encore fini, j’arrete le premier et j’execute le deuxième?

j’apelle des scenes justement dans l’automatisation… y a t’il un autre moyen que l’automatisation pour apeller des scenes?

je vais essyaer comme ca pour voir…
Mais vraiment ce que je ne comprends pas c’est pourquoi meme lorsque je laisse le temps a l’automatisation de se terminer, l’input_text change bien sur nouvel appel de bouton SAUF dans l’automatisation 2 ?
Ca ressemble a un bug pour moi…

Oui, c’est pas tellement là le souci, c’est plus que les actions qui découle de la 1ere action ne sont pas toutes réalisées (certes sont faites/d’autres sont en cours et d’autres ne seront jamais faites). C’est une façon peu conventionnelle de faire dans une environnement évènementiel …

Pas que … rest, c’est pas une scene, et puis ça pourrait même être des actions de groupe puisque tu as 4 fois la même action

Sur le principe, je pense aussi que ça devrait finir. Mais tu as les traces pour vérifier si c’est bien la cas. C’est pas forcement le cas ici, mais le plus souvent le bug c’est l’humain dans l’affaire.

j’ai « allégé » un peu le code; je ne fais plus appel à des commandes REST mais uniquement à des scenes.

alias: lumières selon keycode 2
description: ""
trigger:
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event1
condition: []
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "15"
          - condition: state
            entity_id: input_text.mykeycode
            state: "20"
        sequence:
          - service: scene.turn_on
            data: {}
            target:
              entity_id: scene.mode_home_lumieres_salon
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "38"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_off_lumieres_salon
            metadata: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "99"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_films_lumieres_salon
            metadata: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "44"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_tv_lumieres_salon
            metadata: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "57"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_reading_lumieres_salon
            metadata: {}
      - conditions:
          - condition: state
            entity_id: input_text.mykeycode
            state: "19"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_teatime
            metadata: {}
    enabled: true
mode: restart

Et la j’ai le meme comportement : l’automatisation se declenche bien avec le trigger « keyboard_remote_command_received », mais elle ne voit pas le changement de valeur de l’input_text qui a changé…pour moi ca ressemble fortement à un bug meme si nos amis informaticiens situent souvent le problème entre la chaise et le clavier!
Je pense que je devrais changer de trigger et mettre comme trigger le changement de valeur de l’input_text.
qu’entends tu par

ou je trouve les traces? dans l’historique d’execution de l’automatisation?

ah mais non je ne peux pas faire comme ca : si j’allume ou eteints les lumières manuellement, l’input_text ne changera pas et au prochaine appui sur la telecommande la valeur de l’input text sera la meme…
De toute facon le trigger n’est pas le problème vu que l’automatisation se declenche à chaque appui. Le soucis c’est VRAIMENT que l’automatisation ne voit pas le changement de valeur de l’input_text une fois sur deux…

En haut à droite des automatisations.

j’ai splitté la configuration : une automatisation par scene. pour l’instant uniquement ON et OFF.
comportement tres etrange:

  • lorsque je clique sur ON de la telecommande, uniquement la scene OFF se declenche. Et comme le keycode ne correspond pas, rien ne se passe. Si j’appuie une deuxième fois sur ON : l’automatisation ON se declenche et pas la OFF. les lumières s’allument…
  • comportement exactement inverse lorsque j’appuie sur le OFF de la telecommande…
    Tres etrange…
    Automatisation OFF :
alias: Lumières Salon OFF keycode
description: ""
trigger:
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event1
condition:
  - condition: state
    entity_id: input_text.mykeycode
    state: "38"
action:
  - service: scene.turn_on
    target:
      entity_id: scene.mode_off_lumieres_salon
    metadata: {}
mode: restart

Automatisation ON :

alias: lumières salon ON keycode
description: ""
trigger:
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event1
condition:
  - condition: state
    entity_id: input_text.mykeycode
    state: "15"
action:
  - service: scene.turn_on
    target:
      entity_id: scene.mode_home_lumieres_salon
    metadata: {}
mode: restart

Si quelqu’un y comprend quelque chose…

Ca fonctionne avec ce code :

alias: Lumières Salon OFF keycode
description: ""
trigger:
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event1
      key_code: 38
action:
  - service: scene.turn_on
    target:
      entity_id: scene.mode_off_lumieres_salon
    metadata: {}
mode: restart

il faut supprimer la condition dans l’automatisation…Mais pourquoi?

Tu es le seul à pouvoir le savoir.
La condition c’est comme un filtre, l’automatisation n’est valable (et lancée) que quand la condition l’est aussi.
Dans ton exemple qui marchote, le code de la condition du trigger est différent (15 ou 38), donc quand ta télécommande envoie la valeur 15, ça doit déclencher l’ automatisation 15 et pas la 38. Quand c’est l’inverse et qu’elle envoie 38, ça doit déclencher l’automatisation 38 et pas la 15.
Bref c’est pas un bug, c’est le comportement demandé, regarde l’état de l’input au moment du déclenchement :wink: Puisque tu mets le code dans l’input APRES (tu l’as même oublié dans l’exemple), c’est normal de déclencher avec 1 tour de retard

Bon j’ai trouvé la solution ici :
https://community.home-assistant.io/t/automation-with-choose-action/394400
En fait il faut spécifier CHAQUE trigger et assigner une ID a chacun d’entre eux. Ensuite c’est l’ID qui declenche l’action dans les conditions de l’option choose.
C’est un peu plus lourd comme code, mais au moins il n’y a qu’une seule automatisation.
Si cela peut servir a quelq’un je partage le code qui fonctionne parfaitement.
@Pulpy-Luke Merci pour tes précieux conseils!

alias: Lumières Salon keycode IR
description: ""
trigger:
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event1
      key_code: 57
    id: "1"
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event1
      key_code: 15
    id: "2"
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event1
      key_code: 20
    id: "3"
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event1
      key_code: 38
    id: "4"
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event1
      key_code: 99
    id: "5"
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event1
      key_code: 44
    id: "6"
  - platform: event
    event_type: keyboard_remote_command_received
    event_data:
      device_descriptor: /dev/input/event1
      key_code: 19
    id: "7"
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id: "2"
        sequence:
          - service: scene.turn_on
            data: {}
            target:
              entity_id: scene.mode_home_lumieres_salon
      - conditions:
          - condition: trigger
            id: "4"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_off_lumieres_salon
            metadata: {}
      - conditions:
          - condition: trigger
            id: "5"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_films_lumieres_salon
            metadata: {}
      - conditions:
          - condition: trigger
            id: "6"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_tv_lumieres_salon
            metadata: {}
      - conditions:
          - condition: trigger
            id: "1"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_reading_lumieres_salon
            metadata: {}
      - conditions:
          - condition: trigger
            id: "7"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_teatime
            metadata: {}
      - conditions:
          - condition: trigger
            id: "3"
        sequence:
          - service: scene.turn_on
            target:
              entity_id: scene.mode_home_lumieres_salon
            metadata: {}
    enabled: true
mode: restart