Google Kalender Eintrag als Bedingung in einer Automatsierung

Hallo,

scheinbar immer noch Anfänger bzgl yaml und jinja2…

Die Google Calendar Integration lief nach Anleitung problemlos.

Nun möchte ich in einer Automation mit einer Bedingung abfragen, ob ein bestimmter Eintrag im Kalender gesetzt ist.

Mit der States Abfrage

states.calendar.schulferien_bayern.attributes.message

funktioniert das nicht, da dort immer der nächste Kalendereintrag drinsteht (das ist genau ein Entrag, keine Liste). Möglich wäre hier evtl. start bzw. end mit dem aktuellen Datum zu vergleichen.

Also bin ich zu calendar.get_events übergegangen und habe mir folgendes zusammengereimt:

- id: '1713214510275'
  alias: "Google Kalender Termin Reminder"
  description: "Experiments"
  trigger:
    - platform: time
      at: "17:20:00"
  action:
    - service: calendar.get_events
      data:
        entity_id: calendar.schulferien_bayern
        start_date: "{{ now().date().isoformat() }}"
      duration:
        hours: 24
        minutes: 0
        seconds: 0
  variables:
    event_title: "Dummyferien"
  condition:
    - condition: template
      value_template: "{{ event_title in trigger.event.data }}"
  action:
    - service: notify.mobile_app_sm_a336b
      metadata: {}
      data:
        message: Test Google Calendar Integration
  mode: single

Hier fangen die Probleme aber schon beim Eingeben an. Wenn ich den Ausschnitt mit dem Fileeditor in der automations.yaml eintrage, wird er nicht zum angegebenen Zeitpunkt getriggert und unter “Einstellungen/ Automatisierungen & Szenen” erscheint eine alte dort erstellte Version.

  1. Frage: Wo schreibe ich die Automation hin?

  2. Frage: Kann das oben funktionieren?

P.S.: Finales Ziel ist eine Automatisierung für Rollos, die in der Früh die Rollos unten lässt, wenn etwas mit Ferien im Kalender steht…

Hallo, ich stehe gerade vor dem selben Problem.
Hast Du hier eine Lösung gefunden?
Ich möchte schauen, ob an einem von mehreren Einträgen im Googlekalender calendar.familie ein Eintrag Urlaub enthält und dann einen boolean einschalten.
Ich schätze es ist egal, ob es ein Googlekalender oder ein lokaler Kalender ist, oder?

(Bisher habe ich mehrere lokale Kalender, bei denen dann halt immer nur ein Ereignis zur gleichen Zeit stattfindet.)

Yaml muss nach Änderungen neugeladen werden —> Dev Tools —> Yaml —> Automationen

Probier’s mal mit


value_template: "{{ state_attr(trigger.entity_id, 'message') is search('urlaub', ignorecase=true) }}"

Hallo Kitty,
Bisher mache ich das so: Sobald niemand daheim ist, startet die Automation, aber nur, wenn im Kalender ein Termin mit Name Urlaub vorhanden ist. In diesem Kalender gibt es bis jetzt immer nur einen aktiven Termin zur selben Zeit, weil halt immer nur der nächste beachtet wird.

Wo genau baue ich Dein Template ein?

Schau mal, das ist meine Automatisierung:

alias: 👨‍👩‍👦‍👦 Urlaubserkennung basierend auf jemand.daheim
description: >-
  Aktiviert Urlaub nur, wenn niemand zu Hause ist und ein Termin 'Urlaub'
  enthält
triggers:
  - entity_id:
      - binary_sensor.jemand_daheim
    trigger: state
    from: "on"
    to: "off"
conditions:
  - condition: template
    value_template: "{{ 'Urlaub' in state_attr('calendar.urlaub', 'message') }}"
actions:
  - target:
      entity_id: input_boolean.urlaub
    alias: Schalte Urlaub an
    action: input_boolean.turn_on
    data: {}
mode: single

in Deinem Template vermisse ich den Kalendereintrag :thinking:

Ich ging davon aus, dass du einen Kalender-Trigger verwendest. Mein Code wäre die Bedingung für weitere Aktionen.

Bei der von dir geposteten Automation muss man, denke ich, anders herangehen und - wie auch der Themenersteller gemacht hat -zunächst die Kalenderdaten abrufen.
Ich versuch mal, was zusammenzubasteln.

EDIT: Ok, probier es mal aus:


actions:
  - action: calendar.get_events
    data:
      start_date_time: "{{ today_at() }}"
      duration:
        hours: 24
    target:
      entity_id: calendar.test
    response_variable: freizeit
  - if:
      - condition: template
        value_template: |
          {% set urlaub = freizeit['calendar.test'].events |map(attribute='summary') |list %}
          {{ urlaub is search('urlaub', ignorecase=true) }}
    then:
      - action: notify.persistent_notification
        data:
          message: Urlaub!

Hei Kitty,
vielen Dank! Das funktioniert!
:raised_hands: