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.