[Aide] Comment empêcher la boucle infinie dans mon automation?

Bonjour tous le monde,

Je suis en train de me prendre la tête avec cette automatisation… J’ai besoin de vos lumières ! :slight_smile:

Ma configuration :
J’ai ouvert ma cuisine sur mon salon pour en faire une grande pièce à vivre. J’ai une enceinte echo dans la cuisine et une barre de son dans le salon. Lorsque j’écoute la même musique sur les 2 appareils (en multiroom), je ne peux pas régler les 2 au même niveau sonore sinon on entends que l’echo de la cuisine.

J’ai donc créé un input_number (input_number.balance_rez_de_chaussee) pour pouvoir indiquer la différence de niveau sonore de l’un en fonction de l’autre.

Le but de l’automatisation :
Le principe de l’automation est assez simple. J’aimerais par exemple monter et descendre le volume du multiroom.

Usecases :
1/ Pour cela je veux pouvoir gérer manuellement le volume sur la bar de son et que l’automation monte aussi le volume de l’echo.
2/ Évidemment, je veux pouvoir faire la même manipulation a partir de m’echo pour que l’automation monte le volume de la barre de son.
3/ Dans tous les autres cas (lancement de la musique, changement de l’input_number), je veux que le volume soit ajusté sur la cuisine en se basant sur le volume de la barre de son

Le problème que je rencontre :
J’ai commencer à rencontrer une boucle infinie car mon trigger d’automation est aussi l’entité que je modifie à l’intérieur. J’ai donc voulu ajouter une condition pour dire que :

SI l’update du trigger est antérieur à la date de trigger de mon automation, Alors c’est un cas passant et j’execute mon automation.

Malheureusement, les résultats ne sont pas probant et le debug des timestamps dans developer-tools/template fait crash mon instance d’HA…

Avez-vous une idée ? :slight_smile:

Et voici le code qui ne marche pas super bien… :

- alias: Balance rez-de-chaussée
  trigger:
    - platform: state
      entity_id: media_player.rez_de_chaussee
      to: 'playing'
    - platform: state
      entity_id: 
        - media_player.rez_de_chaussee
        - media_player.echo_cuisine
        - media_player.barre_de_son
      attribute: volume_level
      for: 5
    - platform: state
      entity_id: input_number.balance_rez_de_chaussee
  condition:
    - "{{ is_state('media_player.rez_de_chaussee', 'playing') }}"
    - "{{ trigger.entity_id not in ['media_player.echo_cuisine', 'media_player.barre_de_son'] or states[trigger.entity_id].last_updated - state_attr('automation.balance_rez_de_chaussee', 'last_triggered') >= timedelta(seconds=10) }}"
  variables:
    percent: "{{ (-1 if trigger.entity_id == 'media_player.echo_cuisine' else 0) + (states('input_number.balance_rez_de_chaussee') | int / 100) }}"
  action:
    - service: media_player.volume_set
      data:
        entity_id: "{{ 'media_player.barre_de_son' if trigger.entity_id == 'media_player.echo_cuisine' else 'media_player.echo_cuisine' }}"
        volume_level: "{{ state_attr('media_player.barre_de_son' if trigger.entity_id == 'media_player.echo_cuisine' else 'media_player.echo_cuisine', 'volume_level') | float(0) + state_attr('media_player.barre_de_son' if trigger.entity_id == 'media_player.echo_cuisine' else 'media_player.echo_cuisine', 'volume_level') | float(0) * percent }}"

Merci beaucoup ! :slight_smile:
Juicy !

Tu devrais partir sur un choose en ajoutant un identifiant pour chaque trigger.

Dans le texte explicatif, tu ne rentre pas dans une boucle… Donc il faut reprendre le code.

Et le meilleur moyen de ne pas s’emmêler et de passer par les choose.