In questo articolo ti mostro come funziona uno dei miei automations preferiti in Home Assistant: una routine che, quando invocata tramite Alexa, legge ad alta voce tutti gli eventi in calendario (locale) per la giornata.
Il risultato è un annuncio naturale, costruito dinamicamente in base a quante voci ci sono e agli orari di ciascun impegno.
Di seguito ti spiego passo per passo il codice YAML dell’automazione e la logica che genera il testo finale.
Obiettivo dell’automazione
Quando chiedo “Alexa, calendario di oggi”, Home Assistant:
- Recupera gli eventi del giorno dal calendario (locale) configurato.
- Genera una frase parlata in linguaggio naturale.
- Invia il testo ad Alexa usando il servizio TTS.
Tutto avviene con una singola automazione, sfruttando template, response_variable e il servizio calendar.get_events.
Requisiti
Per il corretto funzionamento della guida è necessario installare l’integrazione “Calendario locale”, aver “Alexa Media Player” configurato e funzionante e ovviamente aver configurato l’integrazione di Alexa con Home Assistant.
Installazione del calendario locale
Per prima cosa dobbiamo installare il calendario locale in Home Assistant: dal menu impostazioni andiamo in “Dispositivi e servizi”

Quindi dalla sezione Integrazioni clicchiamo su “Aggiungi integrazione” e cerchiamo il calendario locale

Si aprirà una nuova finestra per assegnare un nome al calendario. In questo articolo il nome utilizzato sarà “calendario”

Una volta confermato, il calendario apparirà in automatico nel menu principale di Home Assistant:

Preparazione dello script
Incollate il seguente codice in scripts.yaml
# invocato dalla routine alexa app, con:
# calendario di oggi
tts_calendario_oggi:
alias: TTS Calendario di oggi
sequence:
- service: alexa_media.update_last_called
data: {}
- delay: '00:00:0.5'
# Ottieni gli eventi di oggi dal calendario
- service: calendar.get_events
target:
entity_id:
- calendar.calendario
data:
start_date_time: "{{ now().replace(hour=0, minute=0, second=0).isoformat() }}"
end_date_time: "{{ (now().replace(hour=23, minute=59, second=59)).isoformat() }}"
response_variable: eventi_oggi
- variables:
testo_finale: >
{% set ns = namespace(lista=[]) %}
{% set eventi_list = eventi_oggi["calendar.calendario"]["events"] %}
{% for e in eventi_list %}
{% set titolo = e.get('summary') | default('Evento senza nome') %}
{% set start_raw = e.get('start') %}
{% if start_raw and 'T' in (start_raw|string) %}
{% set start_dt = start_raw | as_datetime(default=none) %}
{% if start_dt %}
{% set ns.lista = ns.lista + ['alle ' ~ start_dt.strftime('%H:%M') ~ ' ' ~ titolo] %}
{% else %}
{% set ns.lista = ns.lista + [titolo] %}
{% endif %}
{% else %}
{% set ns.lista = ns.lista + [titolo ~ ' tutto il giorno'] %}
{% endif %}
{% endfor %}
{% if ns.lista | count > 0 %}
{% set n = ns.lista | count %}
{% if n == 1 %}
Oggi hai 1 evento: {{ ns.lista[0] }}.
{% else %}
{% set tutti_ma_ultimo = ns.lista[:-1] | join(', ') %}
{% set ultimo = ns.lista[-1] %}
Oggi hai {{ n }} eventi: {{ tutti_ma_ultimo }}, e {{ ultimo }}.
{% endif %}
{% else %}
Nessun evento in calendario per oggi.
{% endif %}
- service: notify.alexa_media_last_called
data:
message: "{{ testo_finale }}"
data:
type: tts
icon: mdi:calendar
mode: single
Aggiornamento dell’ultimo dispositivo Alexa chiamato
- service: alexa_media.update_last_called
Questo passaggio dice al componente Alexa Media Player di aggiornare quale dispositivo Echo è stato usato più di recente.
Serve per permettere al servizio TTS finale di parlare proprio da quel dispositivo, senza doverlo specificare manualmente.
Un breve delay di mezzo secondo garantisce che il valore sia aggiornato.
Recupero degli eventi del giorno
- service: calendar.get_events
target:
entity_id:
- calendar.calendario
data:
start_date_time: "{{ now().replace(hour=0, minute=0, second=0).isoformat() }}"
end_date_time: "{{ (now().replace(hour=23, minute=59, second=59)).isoformat() }}"
response_variable: eventi_oggi
Qui Home Assistant interroga l’entità calendar.calendario e chiede tutti gli eventi che iniziano o terminano fra la mezzanotte e le 23:59 dello stesso giorno.
Il risultato viene salvato nella variabile eventi_oggi, accessibile dopo questo step.
Costruzione del testo da far pronunciare ad Alexa
Questa è la parte più interessante: un template Jinja che trasforma l’elenco grezzo degli eventi in una frase gradevole da ascoltare.
Estrazione degli eventi
Qui estraggo solo l’array di eventi relativo al calendario richiesto.
{% set eventi_list = eventi_oggi["calendar.calendario"]["events"] %}
Preparazione della lista leggibile
Si utilizza un namespace per costruire una lista dinamica:
- Se l’evento ha un orario, il testo diventa: “alle HH:MM Nome evento”
- Se è un evento “tutto il giorno”, diventa: “Nome evento tutto il giorno”
Perchè usare un namespace? Perchè altrimenti la variabile per costruire il testo, all’interno del loop, rimarrebbe confinata nel suo scope e all’uscita del loop non verrebbe aggiornata la variabile globale, con conseguente lista degli eventi “vuota”!
Invio del TTS ad Alexa
- service: notify.alexa_media_last_called
data:
message: "{{ testo_finale }}"
data:
type: tts
A questo punto Alexa pronuncia il testo generato.
Grazie all’uso di alexa_media_last_called, l’annuncio parte automaticamente dal dispositivo che ho utilizzato pochi secondi prima.
Risultato
Con questa automazione, Alexa diventa molto più utile nella gestione quotidiana degli impegni.
Apro la giornata chiedendo “calendario di oggi” e ottengo subito un riepilogo chiaro e ben formattato, senza dover guardare l’app di home assistant.
La logica è completamente personalizzabile: puoi cambiare la frase iniziale, aggiungere dettagli (luogo, descrizione), oppure generare annunci separati per calendari diversi.







