How to list multiple calendar event in a template

EDIT

With the advent of Home Assistant version 2023.09.0, it’s now even easier to use calendar.list_events in a Trigger-based Template Sensor because it now supports an action section.

template:
  - trigger:
      - platform: time_pattern
        minutes: /30
    action:
      - service: calendar.list_events
         target:
          entity_id: calendar.gary
        data:
          duration:
            hours: 24
        response_variable: scheduled_events
    sensor:
      - name: Gary Scheduled Events
        unique_id: gary_scheduled_events
        state: "{{ scheduled_events.events | count() }}"
        attributes:
          scheduled_events: "{{ scheduled_events.events }}"
        icon: mdi:calendar

For historical reference, here’s the original post which used a separate automation for what now can all be done in a Trigger-based Template Sensor.

Original post

Here’s what you can do natively in Home Assistant using the recently added calendar.list_events service call.

Basically, an automation periodically gets upcoming events from your calendar and transfers them to a Template Sensor. Afterwards, you can access the upcoming events directly from the Template Sensor.


Automation

Create an automation that uses a Time Pattern Trigger to poll your calendar every 30 minutes, gets all upcoming calendar events for the next 24 hours, and posts them via a custom Home Assistant Event named gary_scheduled_events.

alias: Get Gary Scheduled Events
description: ""
trigger:
  - platform: time_pattern
    minutes: /30
condition: []
action:
  - service: calendar.list_events
     target:
      entity_id: calendar.gary
    data:
      duration:
        hours: 24
    response_variable: scheduled_events
  - event: gary_scheduled_events
    event_data:
      scheduled_events: "{{ scheduled_events }}"
mode: single

Trigger-based Template Sensor

Create a Trigger-based Template Sensor that uses an Event Trigger to receive your scheduled events, via gary_scheduled_events, and reports them in an attribute named scheduled_events. It also reports the number of scheduled events in its state property.

template:
  - trigger:
      - platform: event
        event_type: gary_scheduled_events
    sensor:
      - name: Gary Scheduled Events
        unique_id: gary_scheduled_events
        state: "{{ trigger.event.data.scheduled_events.events | count() }}"
        attributes:
          scheduled_events: "{{ trigger.event.data.scheduled_events.events }}"
        icon: mdi:calendar

For your TTS macro, it should iterate through the list of calendar events found in the scheduled_events attribute of sensor.gary_scheduled_events.

The template will look something like this:

{% for e in state_attr('sensor.gary_scheduled_events', 'scheduled_events') %}
{{ e.start}}: {{ e.summary }}
{% endfor %}

Reference

From the documentation for calendar.list_events

image


EDIT

Correction.

Changed this:

scheduled_events: "{{ trigger.event.data.scheduled_events }}"

to this:

scheduled_events: "{{ trigger.event.data.scheduled_events.events }}"
5 Likes