La lista della spesa di casa è una nota di Google Keep, e Home Assistant ci scrive da tre parti: un messaggio WhatsApp come «spesa latte, pane», un vocale trascritto in locale, e le voci dette ad Alexa, che un'automazione travasa in Keep. Funzionava, ma creava doppioni. Se il latte era già in lista e qualcuno lo chiedeva di nuovo, comparivano due «Latte».

C'era anche un secondo caso, più sottile. Keep non cancella le voci comprate: le spunta e le sposta in fondo. Quindi il latte comprato ieri c'era ancora, spuntato, e chiederlo di nuovo ne creava un altro invece di rimettere in circolo quello che c'era già.

Tre casi, una sola regola

Per ogni voce che arriva, la decisione ora è questa:

  • se è già da comprare, non la aggiungo e rispondo che è già presente;
  • se c'è ma è spuntata, le tolgo la spunta e torna in lista;
  • se non c'è, la aggiungo.

Il confronto ignora maiuscole e spazi doppi, così «latte», «Latte» e «latte » sono la stessa voce. E se nello stesso messaggio una voce compare due volte, conta una volta sola.

Un solo script per tutti

Le aggiunte prima erano sparse in tre punti, ognuno con il suo todo.add_item. Il travaso da Alexa aveva già un controllo dei doppioni, ma guardava solo le voci da comprare e non quelle spuntate; WhatsApp e i vocali non ne avevano nessuno.

Ho messo la logica in un solo script, spesa_aggiungi, che riceve l'elenco delle voci e restituisce cosa ha fatto. Chi lo chiama usa la risposta per scrivere il messaggio di conferma.

- action: script.spesa_aggiungi
  data:
    articoli: ["acqua", "asparagi", "carciofi"]
  response_variable: esito

La risposta ha tre elenchi: nuovi, presenti e ripristinati. Su WhatsApp diventa:

🛒 LISTA DELLA SPESA
➕ Carciofi
♻️ Asparagi (era spuntato, rimesso in lista)
✅ Acqua (già presente)

Leggere anche le voci spuntate

Il punto chiave è chiedere a Keep entrambe le categorie, non solo quelle da comprare:

- action: todo.get_items
  target:
    entity_id: todo.google_keep_spesa
  data:
    status:
      - needs_action
      - completed
  response_variable: voci

Per rimettere in lista una voce spuntata basta cambiarne lo stato. Prima di scriverlo ho controllato nel codice dell'integrazione Keep che l'aggiornamento togliesse davvero la spunta, e non si limitasse a cambiare il testo:

- action: todo.update_item
  target:
    entity_id: todo.google_keep_spesa
  data:
    item: "{{ voce.uid }}"
    status: needs_action

Uso l'identificativo della voce e non il nome, perché con i doppioni già presenti nella lista il nome da solo poteva indicare la voce sbagliata.

Il ritardo di Keep

L'integrazione di Keep in Home Assistant sincronizza ogni quindici minuti. Se una voce è stata spuntata nell'app un minuto fa, Home Assistant può non saperlo ancora, e il controllo lavorerebbe su dati vecchi. Per questo lo script, prima di leggere la lista, chiede un aggiornamento dell'entità. Riduce il problema; non lo annulla del tutto, perché l'aggiornamento non è garantito istantaneo.

Cosa resta fuori

Le voci dette a Google Assistant passano direttamente da Google a Keep, senza Home Assistant in mezzo. Lì un doppione resta possibile: non c'è un punto in cui intervenire. Per tutto quello che passa da Home Assistant, cioè WhatsApp, vocali e Alexa, la regola vale sempre.

La prova

Ho provato i tre casi in un solo messaggio. Nell'app Keep ho spuntato gli asparagi; l'acqua era già da comprare; i carciofi non c'erano. Poi su WhatsApp: «spesa acqua, asparagi, carciofi». Risultato: acqua segnalata come già presente, asparagi tornati in lista senza spunta, carciofi aggiunti una volta sola.

In sintesi

  • Una lista con le voci spuntate va letta tutta, non solo la parte da comprare.
  • Quando più strade scrivono nello stesso posto, la regola va messa in un punto solo.
  • Uno script che restituisce cosa ha fatto permette a ogni canale di rispondere in modo preciso.
  • Per modificare una voce si usa il suo identificativo, non il nome.