ePaper und calendar events aus mehreren Kalendern (Daten-aufbereitung)

Hallo zusammen. Ich bin mir nicht sicher, ob ich das richtige Unterforum getroffen habe. Momentan arbeite ich an einem ePaper Display mit Esphome, welches ein paar Wetterdaten, Zustand der Waschmaschine, Müllabfuhrtage und die nächsten Termine aus Kalendern anzeigt. Jetzt hänge ich an ein paar Punkten allerdings ein wenig fest, da ich tatsächlich neu bei HomeAssistant bin. Etwa vor zwei Monaten damit angefangen. Neu ist mir auch Yaml, neu ist Python und dankenswerterweise ist mir auch C++ für den Esp mehr oder weniger neu. Ich habe lediglich Erfahrung in anderen Programmiersprachen von früher (zum Glück).

Genug des Vorwortes, es warten 3 Fragen darauf, beantwortet zu werden.

Also, das ePaper ab sich ist nicht meint Problem. Das funktioniert gut und zeigt mir alles wunderbar an. Mein Problem ist die Daten-aufbereitung in der Templates.yaml, in der mir die Calendar Events in Attribute eines Sensors für den Esp geschrieben werden. Hier mal ein Ausschnitt aus dem Code, wie das momentan funktioniert:

      - service: calendar.get_events
        target:
          entity_id: 
            - calendar.fxx
            - calendar.kxx
            - calendar.jxx
            - calendar.exx
        data:
          start_date_time: "{{ now().strftime('%Y-%m-%d 00:00:00') }}"
          end_date_time: "{{ (now() + timedelta(days=14)).strftime('%Y-%m-%d 00:00:00') }}"
        response_variable: calendar_events

Und so werden mir die Attribute zusammen gebaut:

        event_count: >
          {% set all_events = calendar_events['calendar.fxx'].events + calendar_events['calendar.kxx'].events + calendar_events['calendar.jxx'].events + calendar_events['calendar.exx'].events %}
          {{ all_events | count() }}
        event_summary1: >
          {% set all_events = calendar_events['calendar.fxx'].events + calendar_events['calendar.kxx'].events + calendar_events['calendar.jxx'].events + calendar_events['calendar.exx'].events %}
          {% if (all_events | count()) >0 %}
            {{ (all_events|sort(attribute='start'))[0].summary }}
          {% endif %}
        event_startdate1: >
          {% set all_events = calendar_events['calendar.fxx'].events + calendar_events['calendar.kxx'].events + calendar_events['calendar.jxx'].events + calendar_events['calendar.exx'].events %}
          {% if (all_events | count()) >0 %}
            {{ ((all_events|sort(attribute='start'))[0].start|as_datetime|as_local).strftime("%d.%m.%Y") }}
          {% endif %}
        event_starttime1: >
          {% set all_events = calendar_events['calendar.fxx'].events + calendar_events['calendar.kxx'].events + calendar_events['calendar.jxx'].events + calendar_events['calendar.exx'].events %}
          {% if (all_events | count()) >0 %}
            {{ ((all_events|sort(attribute='start'))[0].start|as_datetime|as_local).strftime("%H:%M") }}
          {% endif %}
        event_tag1: >
          {% set all_events = calendar_events['calendar.fxx'].events + calendar_events['calendar.kxx'].events + calendar_events['calendar.jxx'].events + calendar_events['calendar.exx'].events %}
          {% if (all_events | count()) >0 %}
            {% set wochentag = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"] %}
            {% if ((all_events|sort(attribute='start'))[0].start|as_datetime|as_local).strftime("%H:%M") == "00:00" %}
              {% set calday = as_timestamp((all_events|sort(attribute='start'))[0].start|as_datetime|as_local) | timestamp_custom('%w',false) | int %}
            {% else %}
              {% set calday = as_timestamp((all_events|sort(attribute='start'))[0].start|as_datetime|as_local) | timestamp_custom('%w',false) | int -1 %}
            {% endif %}
            {{ wochentag[calday] }}
          {% endif %}
        event_summary2: >
          {% set all_events = calendar_events['calendar.fxx'].events + calendar_events['calendar.kxx'].events + calendar_events['calendar.jxx'].events + calendar_events['calendar.exx'].events %}
          {% if (all_events | count()) >1 %}
            {{ (all_events|sort(attribute='start'))[1].summary }}
          {% endif %}
  1. In jedem Attribut wird immer wieder das gleiche ausgeführt: Die events aus den verschiedenen Kalendern werden in eine große Liste addiert. Und das jedes mal neu. Ich glaube nicht, dass das eine elegante Lösung ist. Es muss doch die Möglichkeit geben diese Prozedur einmal zu erledigen und auf die Variable bzw. die große Liste dann aus jedem Attribut zugreifen zu können. Ich hab es bisher nicht geschafft aus einem Attribut auf die Variable eines anderen Attributs zuzugreifen. Wie löst man das? Wo muss das dann hin in der yaml Datei?

  2. Die events in 1) alle in eine große Liste zu packen, mache ich, damit ich in der Lage bin, diese nach Startzeitpunkt zu sortieren und entsprechend an den Esp zu schicken. Wie gesagt, die Events stammen ja aus unterschiedlichen Kalendern. Ich bin mir nicht sicher, ob das die beste Lösung dafür ist, aber es funktioniert. Das Problem dabei: Es geht die Information verloren, aus welchem Kalender das Event stammt. Also welche Person/Kalender der Termin betrifft. Gibt es die Möglichkeit vor dem zusammenfügen zu einer großen Liste für jedes Event ein extra Datenfeld anzulegen, in dem dann neben Summary, Start time etc. eben auch Person/Name oder sowas steht? Hab da schonmal was probiert mit einem For Loop, aber es hat nicht geklappt. Hat da jemand eine Idee, wie man das lösen könnte?

  3. Ich bin dankbar für Tipps, welche Bücher oder Lektüre ich benutzen kann, um in Sachen HomeAssistant yaml und Python etwas fitter zu werden.

Danke und Grüße in die Runde