Home Guide Annunciare il calendario del giorno con Alexa e Home Assistant: guida

Annunciare il calendario del giorno con Alexa e Home Assistant: guida

109
0

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:

  1. Recupera gli eventi del giorno dal calendario (locale) configurato.
  2. Genera una frase parlata in linguaggio naturale.
  3. 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.