Problème de portée de variable

Bonjour à tous et toutes,
J’ai un problème tout simple mais que je n’arrive pas à résoudre, je voudrais que ma variable event_summary puisse être utilisé hors de la porté de la boucle for pour la transmettre à ma variable
v_summary, auriez vous une idée ou alors faire autrement ?
Merci

  script:
    notif_calendar_poubelle:
      alias: Calandar - Notif poubelle lendemain
      icon: mdi:trash-can
      mode: single
      sequence:
        - variables:
            v_summary: "TEST"
        - service: calendar.get_events
          target:
            entity_id:
              - calendar.test  # Adjust to your actual calendar name
          metadata: {}
          data:
            start_date_time: "{{ now().replace(hour=0, minute=0, second=0) + timedelta(days=1) }}"
            end_date_time: "{{ now().replace(hour=0, minute=0, second=0) + timedelta(days=2) }}"
          response_variable: cal

        - condition: >-
            {% for event in cal["calendar.test"]["events"] %}
              {% set event_summary = event.summary.lower() %}
              {% if event_summary | regex_search('poubelle|poubelles') %}
              true
              {% break %}
              {% endif %}
            {% endfor %}

        - service: notify.mobile_app_nilmoty_oppox3
          metadata: {}
          data:
            title: "Poubelle"
            message: "{{ v_summary }}"

Pas certain que ça puisse se faire. Dans tous les cas, il faudrait déjà rendre ta variable accessible en dehors de ta boucle « for », pour cela il faut passer par un namespace.

Le code devrait ressembler à qqc comme cela (mais je n’ai pas pu tester) :

       - condition: >-
            {% set ns = namespace(event_summary="") %}
            {% for event in cal["calendar.test"]["events"] %}
              {% set ns.event_summary = event.summary.lower() %}
              {% if ns.event_summary | regex_search('poubelle|poubelles') %}
              true
              {% break %}
              {% endif %}
            {% endfor %}

Ensuite il faudrait voir si « ns.event_summary » est connu plus bas dans l’action (mais j’ai de sérieux doutes).

Bon en fait cela ne marche pas comme je l’avais prévu. Tu peux dupliquer le code se trouvant dans la condition …

        - condition: >-
            {% for event in cal["calendar.test"]["events"] %}
              {% set event_summary = event.summary.lower() %}
              {% if event_summary | regex_search('poubelle|poubelles') %}
              true
              {% break %}
              {% endif %}
            {% endfor %}

        - service: notify.mobile_app_nilmoty_oppox3
          metadata: {}
          data:
            title: "Poubelle"
            message: >-
               {% for event in cal["calendar.test"]["events"] %}
                {% set event_summary = event.summary.lower() %}
                {% if event_summary | regex_search('poubelle|poubelles') %}
                       {{ event_summary  }}
                {% break %}
                {% endif %}
              {% endfor %}

Merci de ton retour, je viens de tester mais comme tu le pensais ns est hors de porté !

Stopped because an error was encountered at February 23, 2024 at 17:26:36 (runtime: 0.01 seconds)
Error rendering data template: UndefinedError: ‹ ns › is undefined

  - condition: >-
      {% set ns = namespace(event_summary="") %} {% for event in
      cal["calendar.test"]["events"] %}
        {% set ns.event_summary = event.summary.lower() %}
        {% if ns.event_summary | regex_search('poubelle|poubelles') %}
        true
        {% break %}
        {% endif %}
      {% endfor %}
  - service: notify.mobile_app_nilmoty_oppox3
    metadata: {}
    data:
      title: Poubelle
      message: "{{ ns.event_summary }}"

Oui donc tu peux dupliquer le code, c’est moche mais ça devrait marcher :slight_smile:

L’autre solution c’est de créer un sensor avec le « résultat » de ton « for » que tu mets à jour toutes les x minutes et utiliser ce sensor dans ton automation.

Salut,

ça me semble bien compliqué pour tester la présence d’un truc dans le calendrier.

1 - la regex est trop compliquée, si ça matche pour poubelles, ça matche forcement pour poubelle aussi…
2 - on est pas obligé de boucler sur un tableau en yaml

Donc une truc du genre

{{ cal["calendar.test"]["events"] | lower | regex_search('poubelle') }}

ça retourne true dans les mêmes conditions à mon avis

Après je ne sais pas si ça marche avec le calendrier local, mais avec google faire plusieurs calendrier à partir d’un seul en se basant sur un mot clé xxx, ça permet d’avoir directement des calendar.xxx qui est on/off si l’evenement est là

Salut,
Alors j’ai trouvé un bon compromis je pense voilà le résultat:

  script:
    notif_calendar_poubelle:
      alias: Calandar - Notif poubelle lendemain
      icon: mdi:trash-can
      mode: single
      sequence:
        - service: calendar.get_events
          target:
            entity_id:
              - calendar.poubelle_sicoval
          metadata: {}
          data:
            start_date_time: "{{ now().replace(hour=0, minute=0, second=0) + timedelta(days=1) }}"
            end_date_time: "{{ now().replace(hour=0, minute=0, second=0) + timedelta(days=2) }}"
          response_variable: cal
        - condition: "{{ cal['calendar.poubelle_sicoval']['events'] | lower | regex_search('poubelle') }}"
        - variables:
            var : "Ramassage {{ ' ' }} {{ cal['calendar.poubelle_sicoval']['events'][0].summary }} {{ ' ' }} demain"
        - service: tts.google_say_fr
          data:
            cache: false
            entity_id: media_player.gh_salon
            message: "{{ var }}"
        - service: notify.mobile_app_nilmoty_oppox3
          metadata: {}
          data:
            title: "Poubelle"
            message: "{{ var }}"

Merci à tous

1 « J'aime »