CCCPaste

ev_tools

ev_tools:
  group:
    # Sikrer, at gruppen er ON, hvis en kalender har en begivenhed.
    alle_aftale_kalendere:
      name: Alle Kalendere med Aftaler
      entities:
        - calendar.broby_it
        - calendar.jacob_lindvig_gmail_com
        - calendar.plejefamilie
        # Tilføj her alle andre kalender-entiteter, der indeholder aftaler med lokationer.

  template:
    - sensor:
        - name: Lokation for næste aftale
          unique_id: 719b694ec3374083a3826a1690ee8eda
          state: >
            {# Hovedtilstanden returnerer lokationen fra den næste gyldige aftale #}
            {% set next_event = state_attr(this.entity_id, 'next_event_data') %}
            {{ next_event.location if next_event is not none else 'unavailable' }}
          attributes:
            has_valid_event: "{{ this.attributes.next_event_data is not none }}"
            event_source: "{{ this.attributes.next_event_data.source if next_event_data is not none else 'N/A' }}"
            start_time: "{{ this.attributes.next_event_data.start_time if next_event_data is not none else 'unavailable' }}"

            # --- AVANCERET LOGIK: FINDER NÆRMESTE EKSTERNE AFTALE ---
            next_event_data: >-
              {# Namespace til at akkumulere gyldige begivenheder #}
              {% set ns = namespace(valid_events = []) %}
              {# Elementer fra ens adresse (gade, nummer, postnummer) #}
              {% set HOME_FILTERS = ['egevej', '17', '7000'] %}

              {# Itererer kalendere og henter starttid/lokation for hver aftale. #}
              {% for entity_id in state_attr('group.alle_aftale_kalendere', 'entity_id') | default([]) %}
                {% set start_time_str = state_attr(entity_id, 'start_time') %}
                {% set location = state_attr(entity_id, 'location') %}

                {# Tjekker om aftalen er ude af huset (True, hvis mindst ét hjemme-filter ikke matcher). #}
                {% set is_external_event = HOME_FILTERS
                  | reject('in', location | lower)
                  | list
                  | length > 0 %}

                {# 1. FØR-FILTER: Validerer rå data (Ikke tomme eller ugyldige) #}
                {% if start_time_str is not none and location is not none and location | trim != '' %}
                  {# 2. HOVEDFILTER: Skal være i fremtiden OG kræve ekstern kørsel #}
                  {% if start_time_str | as_datetime | as_local > now() and is_external_event %}
                    {# AKKUMULERING: Gemmer de rensede aftaledata i namespacen #}
                    {% set ns.valid_events = ns.valid_events + [{
                      'start_time': start_time_str,
                      'location': location,
                      'source': entity_id
                    }] %}
                  {% endif %}
                {% endif %}
              {% endfor %}
              {# 3. FINAL OUTPUT: Vælger den tidligste begivenhed fra listen #}
              {{ ns.valid_events | min(attribute='start_time') }}