Usi Home Assistant ed ordini cibo da asporto da Deliveroo, Glovo o JustEat? Allora questo articolo ti sarà molto utile!
Ti sei mai trovato nella situazione che mentre stai tornando a casa dal lavoro il rider è arrivato e ti chiama mentre sei alla guida? A quel punto devi chiamare chi è è casa per avvisare di uscire a prendere la consegna. Oppure mentre sei a casa dimentichi il tuo telefono da qualche parte e il rider arriva prima che tu sia pronto ad uscire perchè non hai letto le notifiche di avvicinamento…
Non sarebbe comodo essere avvisati tramite gli assistenti vocali di casa e che la notifica arrivi sullo smartphone anche degli altri componenti della famiglia?
E’ esattamente così che è nato questo package!
Se hai letto altri miei articoli sai che colgo l’occasione per mostrarti “un metodo“, oltre che il package stesso. Così potrai applicarlo a molti altri contesti di utilizzo in cui potrebbe essere utile integrare delle notifiche di app che non sono integrabili.
Sommario
Principio di funzionamento
Con questo package integriamo le notifiche dei tre principali servizi di delivery service in Home Assistant: Deliveroo, Glovo e Justeat. Ma come è possibile farlo? Inviano solo la notifica sul tuo smartphone tramite la loro app… Non ci sono API da integrare. Non esiste niente!
E allora utilizziamo proprio le notifiche che le app inviano sul tuo smartphone, le inviamo ad Home Assistant che le divulgherà tramite lo script multinotify agli altri smartphone e ai dispositivi Alexa!
Configuriamo l’app Home Assistant Companion sul tuo Smartphone
Configuriamo l’app Home Assistant Companion per intercettare le notifiche delle app che ci interessano. Segui questi semplici passi.
A questo punto tutte le notifiche che le app che hai selezionato mostreranno sul tuo smartphone verranno inviate in un nuovo sensore di Home Assistant!
Rendiamo le notifiche di Deliveroo, Glovo, JustEat e Home Assistant affidabili
Per default le versioni moderne di Android effettuano una ottimizzazione energetica delle app al fine di aumentare la durata della batteria.
Per default, normalmente, lasciano in esecuzione i servizi in background delle app fintanto che le utilizziamo di frequente ma, quando non lo facciamo, i servizi in background vengono sospesi.
Questo comporta l’interruzione della ricezione di notifiche puntuali (e altro, come una geolocalizzazione non costante ed altro ancora).
A titolo puramente esemplificativo sul mio Samsung S8 per effettuare questa opzione devo andare nelle informazioni dell’app da Configurazione di Android -> Applicazioni e cliccare su Home Assistant:
Verificare che le attività in background siano consentite e premere su Ottimizza uso batteria, scegliere l’elenco di tutte le app e disabilitare l’ottimizzazione batteria per l’app. In tal modo i processi in background saranno sempre permessi.
E’ spesso presente anche uno switch che determina il permesso di effettuare operazioni in background, cosa che ovviamente è fondamentale per ricevere le notifiche.
Ripetere questa operazione per le app che devono aggiornarci sullo stato degli ordini di delivery: Deliveroo, Glovo, JustEat, oltre che Home Assistant.
Verifica in Home Assistant
Verifichiamo ora il sensore che è stato creato in Home Assistant.
Lo accediamo da Configurazioni -> Dispositivi e servizi -> App per dispositivi mobili: clicca sul tuo telefono -> 1 dispositivo -> clicca sulla riga del tuo dispositivo.
Nella sezione Sensori compare il sensore sensor.NOME_TELEFONO_ultima_notifica che conterrà sempre l’ultima notifica ricevuta, tra le app abilitate che abbiamo selezionato precedentemente.
(chiaramente all’inizio il valore sarà vuoto)
Il package per le notifiche da Deliveroo, Glovo, JustEat in Home Assistant
Scarica il file zip premendo il tasto sopra, estrai il file contenuto app_notifications.yaml e copialo nella cartella dei tuoi package di Home Assistant.
A questo punto aprilo con il tuo editor di testo preferito (ti consiglio VSCode!) e dopo l’intestazione modifica la seguente voce:
# Modifica la stringa sensor.tel_henrik_ultima_notifica con il nome del sensore ultima_notifica della tua app homeassistant: customize: package.node_anchors: entity_id: ¬ify_entity_id sensor.tel_henrik_ultima_notifica
Nell’ultima riga, dopo ¬ify_entity_id, sostituisci la stringa sensor.tel_henrik_ultima_notifica con l’entity id del sensore ultima_modifica che abbiamo abilitato prima nell’app companion.
Finito 🙂 Buone appetito!
…ma come al solito non finisce qui: spiego anche il principio di funzionamento, resta ancora un po’ con me!
Come funziona il package?
Gli anchor
All’inizio del package troviamo il seguente codice yaml:
homeassistant: customize: package.node_anchors: entity_id: ¬ify_entity_id sensor.tel_henrik_ultima_notifica
La sezione homeassistant -> customize -> package.node_anchors è una sezione dummy, ovvero non ha alcun effetto, e serve solo per dichiarare delle chiavi in cui definire gli anchor.
Gli anchor sono la definizione di un frammento di yaml che possiamo in seguito richiamare più volte nel codice e ci permette di non dover scrivere più e più volte lo stesso codice. Se ad esempio cambierai telefono ti basterà modificare l’entity id definito nell’anchor affinché venga utilizzato da tutte le automazioni senza far altro.
In questo caso il nome dell’anchor è ¬ify_entity_id
ed è seguito dal valore, intervallato da uno spazio.
Per richiamarne il valore sarà sufficiente richiamare l’anchor con il suo nome preceduto dall’asterisco: *notify_entity_id
. Sarà esattamente come aver scritto il suo valore: sensor.tel_henrik_ultima_notifica
.
Le automazioni per le notifiche da Deliveroo, Glovo, JustEat in Home Assistant
Prendiamo per esempio la prima automazione, riguardante Deliveroo.
automation: #Ricezione notifiche da Deliveroo - id: 50188629-f6d0-4120-bef3-704ec7d7b561 alias: 'App - Notifica - Deliveroo' description: "Notifica gli aggiornamenti sugli ordini di Deliveroo tramite Alexa e tutte le app" variables: ultima_notifica: *notify_entity_id trigger: - platform: state entity_id: *notify_entity_id attribute: post_time condition: - alias: "Solo se l'app è Deliveroo" condition: state entity_id: *notify_entity_id attribute: package state: "com.deliveroo.orderapp" action: - alias: "Invia notifica ad Alexa e tutte le app" service: script.multinotify data: message: "Notifica da Deliveroo: {{state_attr(ultima_notifica, 'android.title')}}. {{states(ultima_notifica)}}" notify_app: notify.all_devices channel: meal group: meal icon: meal critical: true alexa_target: media_player.ovunque
Come prima cosa ho definito la variabile ultima_notifica
contenente il valore dell’anchor definito sopra come variable.
Questo ci permette di usare il valore ultima_notifica
nei template di condizioni ed action, senza bisogno di referenziare direttamente l’entità, definita nell’anchor.
Il trigger
Il trigger è semplicemente il cambio di stato dell’attributo post_time dell’entità definita in ultima_notifica
.
trigger: - platform: state entity_id: *notify_entity_id attribute: post_time
Uso l’attributo post_time
e non semplicemente lo stato (che contiene il testo della notifica) per evitare il (raro) caso in cui due notifiche con stesso testo siano generate consecutivamente. Verificando invece post_time
(che contiene la data/ora di generazione della notifica in formato unix timestamp) questo valore cambierà ad ogni notifica, indipendentemente dal testo.
La condizione
Ok, il trigger scatta ad ogni notifica intercettata ma ora dobbiamo filtrare per la specifica app:
condition: - alias: "Solo se l'app è Deliveroo" condition: state entity_id: *notify_entity_id attribute: package state: "com.deliveroo.orderapp"
La condizione verifica quindi che l’attributo package
dell’entità definita nell’anchor notify_entity_id
sia quello dell’app da noi desiderata.
Attenzione che package non corrisponde al nome dell’applicazione che vediamo nello store ma è un identificativo interno univoco definito dal creatore dell’app.
La notifica con multinotify
Per inviare la notifica a tutti i dispositivi Alexa di casa ed a tutte le app companion ci affidiamo allo script multinotify:
action: - alias: "Invia notifica ad Alexa e tutte le app" service: script.multinotify data: message: "Notifica da Deliveroo: {{state_attr(ultima_notifica, 'android.title')}}. {{states(ultima_notifica)}}" notify_app: notify.all_devices channel: meal group: meal icon: meal critical: true alexa_target: media_player.ovunque
Per ulteriori informazioni sullo script multinotify e per installarlo, se ancora non ce l’hai, leggi il relativo articolo.
Il messaggio viene composto inserendo l’attributo android_title
del sensore ultima_notifica
, contenente il titolo della notifica di Deliveroo e lo stato del medesimo sensore, contenente il testo della notifica dell’app.
Il messaggio viene inviato a tutte le app per via di notify_app: notify.all_devices che è il servizio che raggruppa tutti i servizi di notifica delle app companion definito nello script multinotify.
La notifica verrà inviata al canale meal (che nel mio caso riproduce il suono dell’azione di mangiare di minecraft…), nel gruppo meal (così che le notifiche di questo tipo siano tutte raggruppate tra loro) e con icona meal (presente nell’articolo su multinotify).
La notifica verrà inviata immediatamente tramite il parametro critical: true
(che può essere omesso: è il default).
Lo stesso messaggio sarà riprodotto da tutti i dispositivi Alexa presenti in casa per mezzo del parametro alexa_target: media_player.ovunque
.
Conclusione
Questo package dimostra quanto sia semplice utilizzare i sensori dell’app companion e nello specifico utilizzare le notifiche di app che non sono integrabili in Home Assistant.
Tale metodo può essere utilizzato per qualunque condizione: l’app della banca che notifica un avvenuto pagamento, un’app di messaggistica come Whatsapp, l’app di una piattaforma di trading, ecc.
Spero di averti fornito di qualche ulteriore strumento che ti possa ispirare per creare nuove e meravigliose automazioni 🙂
Ti va di darmi una mano?
Il contenuto di questo sito è completamente gratuito senza pubblicità invasive e il fine non è certo guadagnare …ma mantenere un sito ha un costo. Se ti va di darmi una mano per sostenere le spese o ti va di sostenere questo progetto hai le seguenti modalità:
- Donazione con Paypal:
- Regalami un caffè su Buymeacoffee:
- Effettua i tuoi acquisti Amazon a partire da QUESTO LINK (o tramite i prodotti sotto)
- Acquistare i tuoi prodotti Shelly usando QUESTO LINK
- Effettuare i tuoi acquisti AliExpress usando QUESTO LINK
Ciao, ho letto con molto piacere questa guida e sto cercando di fare funzionare tutto anche se sono ancora alle prime armi.
Se volessi una notifica anche da altre app basterebbe modificare il file app.notifications.yaml duplicando l’automazione e cambiando i parametri relativi all’app?
L’ID numerico alla prima riga a cosa si riferisce? (id: 43b64b8a-1757-4745-9703-56c1a62b45bb).
M piacerebbe fare delle prove, magari puoi aiutarmi.
Grazie mille
Roberto
Ciao, si certo! Ricorda di attivare l’invio delle notifiche di quell’app dal sensore come spiegato nell’articolo però 🙂
L’id è una stringa che identifica univocamente l’automazione tra tutte le altre, per questo trovo molto comodo usare un GUID generato con un click da un plugin di VSCode. Dovrai pertanto modificare tale valore con uno univoco (puoi anche scriverci “paperino”, per intenderci, basta che non sia usato da più parti).
Puoi anche non specificarlo l’id ma io lo faccio sempre perchè senza tale parametro HA non memorizza il debug dell’esecuzione delle automazioni.
Ciao, volevo complimentarmi con te per l’ottimo lavoro, segue sempre molto le tue guide/consigli, in tal senso vorrei chiederti un info, nell automazione sopra delle notifiche ricevo il seguente errore:
UndefinedError: ‘ultima_notifica’ is undefined
mi sai dire come mai?
grazie
Ciao Damiano, grazie per i complimenti e scusa il ritardo nella risposta. Nel frattempo hai risolto? Sembrerebbe che non hai attivato il sensore del tuo telefono come indicato o non l’hai specificato in testa al package nell’anchor notify_entity_id.
Ciao Henrik
scusa la risposta solo ora…
ecco come ho chiamato il sensore:
package.node_anchors:
entity_id: ¬ify_entity_id sensor.mi10_last_notification
ma lo stato è ancora unknown.. non riesco a capire.
Cioè intendi che lo stato del sensore sensor.mi10_last_notification è sempre unknown? L’hai attivato sull’app del tuo telefono? Hai attivato le app che devono mandarti gli aggiornamenti come indicato nell’articolo? Deliveroo ogni tanto non manda proprio le notifiche di consegna (ma te ne accorgi perchè non ti arriva nessuna notifica dalla loro app…) puoi provare a includere Whatsapp e farti mandare un messaggio, per fare una prova.
si resta sempre cosi anche attivando le notifiche di altre app…lo stato non cambia..
Può essere che non stai ricevendo gli aggiornamenti dall’app Android. Se usi Android devi abilitare i permessi per l’esecuzione in background e l’avvio in automatico dell’app e disabilitare l’ottimizzazione batteria per l’app. Non so guidarti meglio perchè ogni produttore si personalizza dove mettere e sotto che forma mostrare tali opzioni…
Se usi iOS ci sono opzioni simili ma non so dirti dove sono perchè non lo uso.
Ho la MIUI dello Xiaomi, l’app è già abilitata in background e disabilitato risparmio energetico per quest ultima…tutti i sensori posizione ed altri si aggiornano e sono funzionanti tranne questo..strano..
Non che sia una incompatibilità con la MIUI… Ma mi sembra strano. Cmq se gli altri sensori si aggiornano e questo no non è questione di impostazioni come poteva essere.
Farò una prova con uno Xiaomi che ho e ti faccio sapere (non so quando riuscirò però)
Ciao Henrik complimenti per il lavoro, una domanda, magari banale, ma se volessi avere 2 dispositivi da cui recuperare l’ultima notifica. come faccio ad inserirlo in yaml?
homeassistant:
customize:
package.node_anchors:
entity_id: ¬ify_entity_id sensor.a52s_mirko_last_notification
entity_id: ¬ify_entity_id sensor.2109119dg_last_notification
Al momento così mi da errore. dove sbaglio?
Ciao Mirko, grazie! Se vuoi usare due trigger devi cancellare la parte in alto in customize: e scrivere direttamente i tuoi trigger nell’automazione. Ma poi devi usare l’oggetto trigger nelle azioni per recuperare la notifica da dove è arrivata. Se faccio in tempo te la scrivo più tardi
Nell’app companion non mi compare “consenti elenco” quindi non riesco ad andare avanti…….
Come no? Ho appena verificato (mica che avessero cambiato le schermate riportate nell’articolo) ma sono ancora tutte corrette. Stiamo parlando dell’app Companion su Android, non mi risulta che su iOS sia presente il sensore “Ultima notifica”, confermi che stai usando Android?
Non è che hai una App Companion non aggiornata? Verifica sul Play Store che sia aggiornata.
Hai scrollato verso il basso? La schermata è lunga e la penultima voce è proprio “consenti elenco” che cliccando ti apre l’elenco delle app installate sul telefono che puoi spuntare per dire quali notifiche ricevere su HA.
Ciao Henrik, seguendo la tua guida ho abilitato il sensore ed homassistant riceve regolarmente le notifiche dall’app che a me interessa (nello specifico telegram). E’ possibile filtrare ulteriormente le notifiche a seconda delle parole in essa contenute? grazie
Ciao Giuseppe, dal trigger no, non è possibile. Ma dall’automazione che crei per recepire la notifica assolutamente si. Basta fare, ad esempio, una condizione dove con un semplice template fai eseguire l’automazione solo se nel messaggio è contenuta una delle parole che vuoi filtrare.
Ciao Henrik, magnifica guida. Ho un problema con il trovare le stesse corrispondenze in Iphone, sapresti aiutarmi?
Ahi, non l’ho specificato nell’articolo (rileggendo) ma mi risulta che su iPhone non sia possibile alle app accedere alle notifiche di altre app. Per questo motivo non è possibile effettuare questa cosa su iphone.
Aggiungo anche che l’app di deliveroo da un po’ di tempo a questa parte sembra che non invii più le notifiche quando il rider si avvicina a casa, purtroppo… Sto contattando il supporto ma senza esito finora.