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
EDIT
Correction.
Changed this:
scheduled_events: "{{ trigger.event.data.scheduled_events }}"
to this:
scheduled_events: "{{ trigger.event.data.scheduled_events.events }}"