Richiami spesso dalle tue automazioni notifiche su Alexa e su App? Ti piacerebbe poter scrivere una volta sola il testo della notifica, che la maggior parte delle volte è identica tra app ed Alexa? Ti piacerebbe che Alexa avesse un volume per le notifiche separato da quello impostato sui device?
Questo e molto altro con il package multinotify!
Lo script è nato originalmente perchè nelle mie automazioni richiamavo molto frequentemente sia notifiche sui dispositivi Alexa che su una o più app companion e trovavo scomodo dover richiamare sempre i servizi con le loro sintassi e duplicare il testo della notifica ogni volta.
Poi l’idea di simulare un volume specifico per le notifiche, che Alexa non ha. Per esempio se stai ascoltando la musica di sottofondo con volume 3 ed arriva una notifica farai molta fatica a capirne il contenuto. Da qui l’idea di alzare il volume prima della riproduzione della notifica e ripristinarlo al termine della stessa.
E’ stata anche una buona palestra per imparare diversi concetti avanzati, iniziando dall’articolo che ne è nato, ancora attuale, che spiegava come creare script con parametri opzionali.
In questo articolo, oltre a mettere a disposizione l’ultima versione del package multinotify, ne spiegherò anche in dettaglio come utilizzarlo ed i principi di funzionamento interni, per chi fosse interessato ad approfondire i concetti più avanzati.
Se l’argomento “notifiche” in Home Assistant ti interessa non aspettare oltre e prosegui la lettura!
Sommario
Caratteristiche del package multinotify
Di seguito quel che lo script Multinotify può fare per te:
- Notifica ad Alexa e/o app companion potendo specificare una sola volta il testo della notifica
- Volume della notifica su Alexa specificabile e separato dal volume corrente, che verrà ripristinato al termine della riproduzione
- Attesa che Alexa termini la pronuncia della notifica. In questo modo le azioni seguenti saranno eseguite a notifica completata. Ad esempio puoi pronunciare “…ora ti alzo le tapparelle” e al termine viene eseguita l’azione.
- Per Alexa potrai specificare a scelta: una singola entità, un gruppo di entità, un gruppo multistanza interno di Alexa, un elenco di entità o l’entità speciale ovunque.
- Se stavi ascoltando la musica multinotify la metterà in pausa per te prima della notifica e ripresa al suo termine (idea di Massimiliano Albani: grazie!)
- Definizione orario in cui Alexa pronuncia le notifiche. Al di fuori dell’orario Alexa non parlerà (a meno che non si forzi la pronuncia con il relativo parametro)
- Mitigati alcuni problemi di Alexa Media Player impostando un volume all’avvio e aggiornando automaticamente il volume impostato di volta in volta, utile per quando il websocket si disconnette.
- Al momento le notifiche app non sono compatibili con iPhone.
Installazione e configurazione di multinotify
Installare il package è semplicissimo. Ma prima di tutto verifichiamo che i requisiti siano soddisfatti.
Requisiti
- Se intendi utilizzare Alexa devi aver installato e configurato Alexa Media Player,
- Se intendi utilizzare le notifiche dell’app companion devi averne installata e collegata almeno una,
- Devi aver installato lo script python set_state.
ATTENZIONE: di script con questo nome ne esistono molte varianti. E’ fondamentale che tu abbia lo script riportato nel mio articolo aggiornato per l’occasione che permette la creazione di entità.
Installazione del package multinotify
Premendo il pulsante sopra scaricherai un file zip contenente il package all’ultima versione.
In tale file zip estrai il file multinotify.yaml ed incollalo nella tua cartella dei packages di Home Assistant.
ATTENZIONE! La versione presente su github è parecchio più avanti rispetto a quella riportata in questo articolo! Ti consiglio di leggere questo testo per capire come funziona (molti principi di base sono gli stessi) ma di usare la versione su github in quanto ha molte features in più!!!
Configurazione del package multinotify
Ora non resta che configurarlo aprendolo con il tuo editor di testo preferito. La sezione da modificare si trova all’inizio del file, dopo le descrizioni iniziali. Ci sono commenti auto esplicativi ma vediamo di seguito cosa modificare:
group: # Gruppo contenente tutti i device Echo presenti (necessario per utilizzare media_player.ovunque come target di multinotify) all_alexa: name: Tutti i device Echo entities: # TODO: modificare l'elenco delle entità del gruppo con i propri dispositivi Alexa - media_player.pian_terreno - media_player.primo_piano - media_player.mansarda
Questo è un gruppo fondamentale se si desidera utilizzare l’entità speciale media_player.ovunque (ma non solo!) in quanto lo script utilizza il gruppo per sapere quali dispositivi Alexa hai.
Inserisci quindi tutti i media_player di Alexa Media Player al posto dei tre indicati come esempio.
# TODO: Definire un gruppo per ogni gruppo interno di Alexa. Per esempio al gruppo media_player.miogruppo dovrà corrispondere # il gruppo group.miogruppo contenente gli stessi dispositivi. Rimuovere l'esempio piani_superiori. piani_superiori: name: Device Echo dei piani superiori entities: - media_player.primo_piano - media_player.mansarda
Questo è un gruppo esemplificativo di un gruppo interno ad Alexa. Per ogni gruppo altoparlanti – musica multistanza creato dall’app Alexa, infatti, sarà necessario creare un gruppo con stesso nome contenente i dispositivi Alexa di cui è composto, visto che l’integrazione Alexa Media Player non dà modo di accedere a questa informazione.
Se hai più gruppi altoparlanti – musica multistanza configurati in Alexa crea un gruppo per ognuno di essi in questa sezione.
notify: # Gruppo notify.all_devices da utilizzare in multinotify per inviare una notifica a tutte le app - name: all_devices platform: group services: # TODO: modificare l'elenco dei servizi con i propri servizi di invio notifica alle app Home Assistant Companion collegate - service: mobile_app_tel_henrik - service: mobile_app_smartphone_antonella
In questa sezione creiamo un servizio di notifica di gruppo che permetterà di specificare l’invio di una notifica a tutte le app senza necessità di elencarle ogni volta che si richiama multinotify. Basterà invece utilizzare notify.all_devices
per inviare la notifica a tutte le app.
Se lo desideri è possibile creare altri gruppi (ripeti il blocco a partire da “-name: all_devices” cambiandone nome e servizi contenuti) se hai tante app e desideri creare dei gruppi nominati.
Finito! Sei ora pronto per utilizzare multinotify per il tuo sistema!
Riavvia Home Assistant e prosegui la lettura.
Sintassi dello script multinotify
Come tutti gli script per richiamare multinotify si possono usare due sintassi: service: script.multinotify
oppure script.turn_on
. La differenza tra i due è che con la prima Home Assistant attende il termine dell’esecuzione dello script, prima di continuare l’esecuzione con l’istruzione successiva. Essendo che una peculiarità di multinotify è che attende il termine della pronuncia da parte di Alexa è consigliato richiamarlo tramite script.multinotify
.
Con la seconda sintassi, invece, Home Assistant avvia lo script e prosegue immediatamente con l’istruzione successiva del chiamante.
I parametri vengono dichiarati tutti all’interno di data:
e sono i seguenti (separati per categoria):
Parametro | Descrizione | Obbligatorio | Default |
message | Testo da notificare alle app e pronunciare da Alexa (se non specificato diversamente) | SI | |
title | Titolo della notifica inviata alle app | NO | Notifica da casa |
Parametro | Descrizione | Obbligatorio | Default |
alexa_message | Testo che Alexa dovrà pronunciare, se differente da message. Utile se si desidera utilizzare le interiezioni così da limitarle solo alla pronuncia su Alexa e non mostrarle nelle notifiche alle app. | NO | =message |
alexa_target | Dispositivi Alexa che dovranno pronunciare il messaggio. E’ possibile specificare una singola entità media_player , un elenco di entità media_player , un gruppo di Home Assistant, un gruppo altoparlanti – musica multistanza di Alexa o entità speciale media_player.ovunque | NO | nessuna |
alexa_volume | Volume con cui i dispositivi Alexa coinvolti pronunceranno la notifica. Al termine il volume sarà comunque ripristinato a quello precedente di ogni dispositivo Alexa. Valori da 0.1 a 1.0 | NO | 0.6 |
alexa_force | Se non specificato o specificato il valore false il i dispositivi Alexa specificati riprodurranno l’annuncio solo se l’orario corrente è tra le 9:00 e le 23:00. Per pronunciare comunque il messaggio al di fuori di tali orari specificare true. | NO | false |
Parametro | Descrizione | Obbligatorio | Default |
notify_app | Nome del servizio da utilizzare per inviare la notifica alle app companion. | NO | nessuno |
group | Stringa identificativa del gruppo di notifiche dell’app. Le notifiche sul telefono verranno raggruppate in base a questo valore. | NO | =channel o “info” (se channel non è specificato) |
channel | Stringa identificativa del canale per le notifiche all’app. Ogni canale, su Android, può avere impostazioni di notifica (compresa la suoneria) personalizzabili. | NO | =group o “info” (se group non è specificato) |
icon | Nome del file (senza percorso, senza il prefisso notify_ e senza estensione) da visualizzare come icona della notifica in app | NO | =channel, =group o “info” se nessuno dei precedenti è definito |
tag | Campo tag della notifica all’app. Se impostata ogni successiva notifica con pari tag sostituirà la notifica precedente. Utile per notifiche il cui stato cambia e non ha senso mantenere i cambi stato precedenti. | NO | nessuno |
critical | Specifica lo stato di notifica critica per l’app. Se true l’app mostrerà la notifica appena possibile. Se false l’app mostrerà la notifica alla prima volta in cui avrà modo, ottimizzando il consumo di batteria (possono passare diversi minuti) | NO | true |
Preparare le icone da utilizzare per le notifiche di multinotify
Nelle notifiche delle app è utile inserire un’icona per diversificare i diversi tipi di notifica. Multinotify, infatti, supporta l’inserimento di un’immagine nella notifica ma per farlo deve essere un file raggiungibile da internet (quindi la tua istanza di Home Assistant deve essere raggiungibile da internet, la soluzione più semplice è usando Nabu Casa).
Nella cartella config crea, se non già presente, una cartella www. All’interno di tale cartella copia i file png che devono chiamarsi notify_xxxx.png.
Ad esempio per utilizzare l’icona warning è necessario che sia presente il file config/www/notify_warning.png.
Consiglio di utilizzare icone png con trasparenza (png a 32 bit) della dimensione di 48×48 pixel.
Di seguito qualche suggerimento…
Come sperimentare l’utilizzo dei vari parametri…
Tra poco vedremo vari esempi di utilizzo. Per imparare ad usare lo script multinotify per fare esperimenti in modo semplice ti consiglio, una volta installato e configurato, di provare a richiamarlo nelle sue varie modalità tramite Strumenti per sviluppatori -> Servizi, scegliere il servizio “Script: Notifica intelligente” (accessibile anche scrivendo script.multinotify) e utilizzare la modalità interfaccia utente cliccando sul seguente link:
I campi dello script saranno visibili e impostabili semplicemente tramite l’interfaccia utente:
Potete vedere il codice YAML corrispondente semplicemente premendo il link in basso
In tal modo potrai vedere il codice YAML da richiamare dalle tue automazioni / script con i parametri scelti da interfaccia utente:
Ma bando alle ciance, vediamo qualche esempio concreto approfittando dell’occasione per mostrare diverse peculiarità dello script.
Esempi delle varie modalità di utilizzo di multinotify
Utilizzare lo script multinotify è molto semplice. Non lasciarti spaventare dai tanti parametri, quasi tutti sono opzionali!
Vediamo con una serie di esempi vari modi di utilizzo dello script.
La modalità base
Vediamo come utilizzare in modo basilare lo script con alcuni esempi:
service: script.multinotify data: message: Questa è una notifica di prova alexa_target: media_player.ovunque notify_app: notify.all_devices
Con questo semplice comando verrà inviato un messaggio da ogni dispositivo Alexa della casa e ad ogni app Companion collegata contenente il messaggio specificato.
Per ogni dispositivo Alexa, solo se l’orario è compreso tra le 9:00 e le 23:00, lo script interromperà la riproduzione della musica, se il caso, imposterà il volume al 60%, riprodurrà il messaggio, attenderà il termine della pronuncia ed in seguito ripristinerà i volumi specifici di ogni dispositivo Alexa ed infine riprenderà la riproduzione della musica, se la si stava ascoltando.
Non male no? 🙂
Essendo message l’unico parametro obbligatorio possiamo usare lo script per pronunciare un messaggio solo ad Alexa o inviare una notifica solo alle app.
Se avessimo voluto, ad esempio, far riprodurre il messaggio precedente solo sui dispositivi Alexa sarebbe stato sufficiente richiamarlo così:
service: script.multinotify data: message: Questa è una notifica di prova, inviata solo ad Alexa. alexa_target: media_player.ovunque
Varie modalità per specificare i dispositivi Alexa
Lo script è stato sviluppato per permettere la massima flessibilità nel modo in cui specificare su quali dispositivi Alexa riprodurre il messaggio. Di seguito un esempio per ogni possibilità:
Singola entità Alexa
service: script.multinotify data: message: Notifica riprodotta da un solo dispositivo Alexa alexa_target: media_player.alexa1
Specificando l’id dell’entità di un singolo dispositivo Alexa, quest’ultimo riprodurrà il messaggio.
Elenco di entità Alexa
service: script.multinotify data: message: "Notifica riprodotta dall'elenco specificato di dispositivi Alexa" alexa_target: - media_player.alexa1 - media_player.alexa2
Specificando un elenco di id entità tutti i dispositivi specificati riprodurranno il messaggio specificato.
Gruppo Alexa di Home Assistant
service: script.multinotify data: message: Notifica riprodotta da un gruppo di Alexa definito in Home Assistant. alexa_target: group.all_alexa
Specificando un gruppo nel parametro alexa_target
, tutti i dispositivi Alexa contenuti in tale gruppo riprodurranno il messaggio.
Questo non è limitato al gruppo all_alexa
ma si può usare qualunque gruppo tu voglia definire contenente dispositivi Alexa.
Gruppo altoparlanti – musica multistanza di Alexa
service: script.multinotify data: message: "Notifica riprodotta da un gruppo di altoparlanti definito nell'app Alexa" alexa_target: media_player.gruppo_alexa1
Specificando il media_player
associato ad un gruppo altoparlanti – musica multistanza di Alexa, tutti i dispositivi che ne fanno parte riprodurranno il messaggio.
Entità speciale ovunque
service: script.multinotify data: message: Notifica riprodotta da un solo dispositivo Alexa alexa_target: media_player.ovunque
L’entità speciale media_player.ovunque altro non è che un gruppo altoparlanti – musica multistanza definito nell’app Alexa per default e contiene tutti i dispositivi Alexa.
Usando tutti i parametri
Vediamo di seguito l’esempio più complesso per richiamare lo script multinotify, utilizzando tutti i parametri presenti:
service: script.multinotify data: title: "Notifica dalla cucina" message: "E' pronto da mangiare!" alexa_message: '<say-as interpret-as="interjection">hey</say-as>, è pronto da mangiare!' alexa_target: - media_player.mansarda - media_player.primo_piano alexa_volume: 0.8 alexa_force: true notify_app: notify.all_devices group: meal-cucina channel: meal icon: meal tag: pronto_da_mangiare critical: true
Con questi parametri stiamo specificando che:
- title: “Notifica dalla cucina”
il titolo della notifica (visibile solo nell’app) sarà “Notifica dalla cucina” - message: “E’ pronto da mangiare!”
il messaggio è “E’ pronto da mangiare!” - alexa_message: ‘<say-as interpret-as=”interjection”>hey</say-as>, è pronto da mangiare!’
per Alexa il messaggio da pronunciare è diverso, così da inserire una interjection che nell’app non sarebbe leggibile - alexa_target:
– media_player.mansarda
– media_player.primo_piano
facciamo pronunciare il messagio ai soli due dispositivi Alexa specificati - alexa_volume: 0.8
l’annuncio di Alexa sarà riprodotto con volume 80% e poi sarà ripristinato il singolo volume che ogni dispositivo coinvolto aveva - alexa_force: true
forziamo la riproduzione dell’annuncio Alexa anche se l’orario è al di fuori della fascia 9:00 23:00 - notify_app: notify.all_devices
il servizio di notifica da usare. In questo caso notify.all_devices definito ad inizio package, per inviare la notifica a tutte le app - group: meal-cucina
questa notifica farà gruppo tra le notifiche di Android con tutte le notifiche aventi pari valore di questo parametro - channel: meal
Il canale della notifica di Android sarà meal. Tramite la configurazione delle notifiche dell’app sarà possibile impostare una suoneria specifica per questo canale, oltre ad impostazioni come il tipo di vibrazione, il colore del led di notifica ed altro ancora. - icon: meal
Visualizza nella notifica l’icona posta in config/www/notify_meal.png - tag: pronto_da_mangiare
Ogni notifica successiva con questo valore di tag sostituisce la precedente eventualmente ancora presente anzi che aggiungersi come altra notifica. Questo fa sì che richiamando più volte di seguito questo script la notifica presente sarà solo una: la più recente. - critical: true
Questo è già il valore di default per cui è omissibile. true significa che l’app mostrerà la notifica immediatamente.
Le notifiche aventi invece critical: false possono arrivare dopo diversi minuti, quando l’app risveglia il telefono dallo stato di standby alla prima occasione per verificare se ci sono notifiche.
Azioni sequenziali
Le notifiche di Alexa Media Player non attendono che i dispositivi Alexa pronuncino il testo specificato per proseguire l’esecuzione delle azioni nell’automazione o script. Multinotify inserisce invece un tempo di attesa calcolato in funzione di quanto pronunciato che effettua l’attesa del tempo più simile possible al tempo impiegato da Alexa per la pronuncia. Questo rende possibile sequenze come la seguente:
- service: script.multinotify data: message: 'Buongiorno! Ora ti alzo le tapparelle!' alexa_target: media_player.pian_terreno alexa_volume: 0.5 alexa_force: true - service: script.tapparelle_apri
Tramite la sequenza sopra il dispositivo Alexa pian_terreno pronuncerà “Buongiorno! Ora ti alzo le tapparelle!” e solo al termine della frase verrà avviato lo script tapparelle_apri. L’effetto è ottimo 🙂
Come funziona lo script multinotify
Finora ho spiegato come installare, configurare ed utilizzare lo script. Spero però davvero che tu colga l’occasione per studiare com’è fatto il package per imparare diverse tecniche che possono diventare molto utili in diversi altri contesti.
Per questo motivo nei capitoli che seguono cercherò di descrivere le parti salienti degli script coinvolti seguendo il flusso di esecuzione, così da capire come funzionano.
Se non l’hai già letto ti consiglio la lettura del precedente articolo sulla prima versione di multinotify, che affronta il tema dei parametri degli script e dei valori di default da assegnare qualora non vengano specificati. Sebbene tale articolo faccia riferimento ad una versione di multinotify superata tutte le nozioni sono utilissime e correntemente utilizzate anche dalle versioni aggiornate: Script con parametri opzionali in Home Assistant
Flusso di funzionamento principale
L’esecuzione dello script multinotify si compone di due parti essenziali: l’invio della notifica alle app e la pronuncia dai dispositivi Alexa.
Notifica alle app
Di seguito il codice che si occupa della notifica alle app:
- alias: "Notifica App" choose: - alias: "notify_app è stato passato dal chiamante?" conditions: "{{ notify_app is defined }}" sequence: - service: '{{notify_app}}' data: title: "{{title | default('Notifica da casa')}}" message: "{{message}}" data: group: "{{group | default(channel) | default('info')}}" channel: "{{channel | default(group) | default('info')}}" tag: "{{tag | default('')}}" icon_url: "/local/notify_{{icon | default(channel) | default(group) | default('info')}}.png" ttl: "{{0 if (critical | default(true)) else 86400}}" priority: "{{'high' if (critical | default(true)) else 'normal'}}"
Il choose
determina, tramite la condizione "{{ notify_app is defined }}"
, che sia stato specificato il parametro notify_app
per procedere alla notifica.
In tal caso tramite service template specifichiamo quale servizio notify utilizzare. Il resto è solo una compilazione dei campi necessari, gestendone i valori di default se non specificati dal chiamante.
Notifiche ad Alexa
Il vero cuore, però, di multinotify è nella pronuncia tramite Alexa, che avviene nel blocco seguente che inizia con alias: "Notifica Alexa"
.
Passiamo in rassegna le varie istruzioni che seguono:
- alias: "Notifica Alexa" choose: - conditions: - alias: "alexa_target è stato passato dal chiamante?" condition: template value_template: "{{ alexa_target is defined }}" - alias: "Orario diurno oppure alexa_force = true" condition: or conditions: - condition: template value_template: "{{ alexa_force | default(false)}}" - condition: time after: '09:00:00' before: '23:00:00' sequence: ........
Anche in questo caso il choose
valuta come prima cosa che alexa_target
sia stato passato dal chiamante per procedere ed, in seguito, valuta se l’orario è diurno (9:00 – 23:00) oppure se è stato passato il parametro alexa_force: true
.
Se queste condizioni sono soddisfatte proseguiamo.
Richiamo script.multinotify_alexa_pre per ogni dispositivo Alexa
# script.multinotify_pre: salvo volume precedente, imposto volume e metto in pausa eventuale musica su tutti i dispositivi Alexa coinvolti - variables: list: > {% set object_id = alexa_target | regex_findall('\\.(\\w+)') | first %} {% if not alexa_target is string %} {# Elenco di entità inline #} {{alexa_target | join(',')}} {% elif alexa_target.startswith('group.') %} {# Gruppo di Echo definito in Home Assistant #} {{expand(states[alexa_target]) | join(',', attribute='entity_id')}} {% elif alexa_target == ('media_player.ovunque') or alexa_target.endswith('media_player.everywhere') %} {# Tutti gli Echo contemporaneamente #} {{expand(states.group.all_alexa) | join(',', attribute='entity_id')}} {% elif alexa_target.startswith('media_player.') and states['group.' ~ object_id] != None %} {# Gruppo di Echo definito in Alexa (necessario un gruppo Home Assistant corrispondente con lo stesso nome!) #} {{expand(states['group.' ~ object_id]) | join(',', attribute='entity_id')}} {% elif alexa_target.startswith('media_player.') %} {# Singola entità Echo #} {{alexa_target}} {% endif %} count: "{{list.split(',') | count}}" - repeat: while: "{{ repeat.index <= count }}" sequence: - variables: entity_id: "{{list.split(',')[repeat.index-1]}}" - service: script.multinotify_alexa_pre data: target: "{{entity_id}}" volume: "{{alexa_volume | default(0.6)}}"
Scopo di questo blocco è quello di richiamare lo script (che analizzeremo in seguito) script.multinotify_alexa_pre
per ogni dispositivo Alexa coinvolto nella notifica. Per farlo, come prima cosa, compiliamo una variabile di nome list
in cui, a seconda di cosa abbiamo passato se un’entità di gruppo, un gruppo altoparlanti, un elenco di entità o l’elemento ovunque, inseriamo l’elenco delle entità Alexa coinvolte, separate da virgola.
La variabile count contiene invece il numero di entità presenti nella lista (tramite il filtro count
).
Preparati questi dati viene eseguito il repeat while
come se fosse un ciclo foreach per tutti gli elementi Alexa presenti nella lista preparata sopra. Per simulare un foreach utilizziamo la variabile speciale repeat.index che contiene il numero di ciclo in cui si è. Attenzione che parte da 0 e non da 1 come si potrebbe essere portati a pensare (ecco perchè la condizione di fine è repeat.index <= count
).
All’interno del repeat viene impostata la variabile entity_id
prelevando l’elemento alla posizione di repeat.index-1
della lista compilata all’inizio e viene passata a script.multinotify_alexa_pre
, insieme al volume desiderato.
Lo script multinotify_alexa_pre si occuperà di salvare il volume corrente del dispositivo, mettere in pausa l’eventuale musica salvando che era in riproduzione e infine impostare il volume specificato, più avanti vedremo nel dettaglio come lo fa.
Notifica vera e propria
A questo punto viene richiamato il servizio notify.alexa_media di Alexa Media Player per pronunciare la notifica desiderata:
# Notifica vera e propria - variables: message: "{{alexa_message | default(message)}}" - service: notify.alexa_media data: message: "{{message}}" data: type: announce target: "{{alexa_target}}"
Attesa che Alexa abbia pronunciato la notifica
Una volta avviata la pronuncia questa è asincrona, ovvero restituisce il controllo immediato al chiamante mentre i dispositivi Alexa ne iniziano la pronuncia. Tramite il codice che segue (che mi è costato tanto sudore e tantissime prove empiriche con frasi di ogni tipo!!!) simuliamo il tempo necessario ad Alexa per pronunciare la frase specificata in message così da attendere mentre è in corso la pronuncia:
- delay: seconds: "{{(5 + (message.count(', ') + message.count('. ') + message.count('! ') + message.count('? ') + message.count(': ') + message.count('; ')) | float * 0.35 + (message | length) * 0.06) | round(default=0)}}"
La base su cui è calcolato questo tempo è la seguente:
- 5 secondi fissi sono i tempi morti generali che mediamente Alexa impiega tra avvio e suono di inizio notifica
- vengono contati i segni di punteggiatura (, . ! ? : 😉 che implicano un aumento del tempo di lettura pari a 0,35 secondi l’uno
- vengono contati i caratteri della frase da pronunciare, moltiplicati per un tempo medio di 6 centesimi di secondo a carattere
Questi valori li ho ricavati facendo davvero tante prove con frasi corte, lunghe, frastagliate da punteggiatura o prive di punteggiatura. Il risultato è molto aderente al tempo impiegato da Alexa (sebbene sia simulato in quanto non c’è modo di attendere il reale termine della pronuncia).
Richiamo script.multinotify_alexa_post per ogni dispositivo Alexa
Al termine della notifica, similarmente a quanto abbiamo fatto prima della notifica vera e propria, richiamiamo script.multinotify_alexa_post
per ogni dispositivo Alexa coinvolto:
# script.multinotify_post: ripristino volume precedente e riproduzione musica, se era in corso, su tutti i dispositivi Alexa coinvolti - repeat: while: "{{ repeat.index <= count }}" sequence: - variables: entity_id: "{{list.split(',')[repeat.index-1]}}" - service: script.multinotify_alexa_post data: target: "{{entity_id}}"
Lo script multinotify_alexa_post
si occuperà di ripristinare il volume precedente del dispositivo Alexa e riprendere la musica in riproduzione (se lo era prima dell’annuncio). Più avanti vedremo nel dettaglio come lo fa.
Lo script multinotify_alexa_pre
Come abbiamo visto sopra lo script multinotify_alexa_pre
viene richiamato per ogni dispositivo Alexa coinvolto nell’operazione. Vediamo il codice per capirne il funzionamento:
# AD USO INTERNO. Viene chiamato per ogni entità Alexa PRIMA del messaggio di notifica multinotify_alexa_pre: alias: "Gestione singola Alexa PRE" description: "Processa la singola Alexa nel ciclo di Multinotify prima dell'annuncio. Non è pensata per l'utilizzo da parte dell'utente" fields: target: name: "Entità Alexa" description: "Entità singola di Alexa da processare" volume: name: "Volume da impostare" description: "Volume da impostare (sarà impostato 0.6 se non specificato)" sequence: - alias: "Imposto prev volume" service: python_script.set_state data: entity_id: "tmp.alexa_{{ target | regex_findall('\\.(\\w+)') | first }}_prev_volume" state: "{{state_attr(target, 'volume_level')}}" was_playing: "{{states[target].state == 'playing'}}" allow_create: true - alias: "Alexa era in riproduzione?" choose: - conditions: "{{states[target].state == 'playing'}}" sequence: - alias: "Metto in pausa Alexa" service: media_player.media_pause target: entity_id: "{{target}}" - alias: "Imposta volume desiderato" service: media_player.volume_set target: entity_id: "{{target}}" data: volume_level: "{{volume | default(0.6) | round(2)}}" - alias: "Workaround per aggiornare sempre volume_level di Alexa" service: python_script.set_state data: entity_id: "{{target}}" volume_level: "{{volume | default(0.6) | round(2)}}"
Lo script ha come parametri di ingresso target, contenente l’entità di Alexa da processare e volume, contenente il volume desiderato per Alexa.
Come prima cosa nella sequence lo script effettua un backup del volume creando un’entità temporanea nominata tmp.alexa_NOME_prev_volume (dove NOME è il nome dell’entità passata senza dominio). Val la pena analizzare bene questo passaggio:
- alias: "Imposto prev volume" service: python_script.set_state data: entity_id: "tmp.alexa_{{ target | regex_findall('\\.(\\w+)') | first }}_prev_volume" state: "{{state_attr(target, 'volume_level')}}" was_playing: "{{states[target].state == 'playing'}}" allow_create: true
Viene utilizzato lo script python set_state per creare o aggiornare l’entità temporanea. Questi i parametri passati a set_state:
- entity_id. Nome dell’entità da creare. La Regex serve per estrarre dall’entity_id presente in target la sola componente del nome senza dominio. Per esempio per “media_player.mia_alexa” restituirebbe “mia_alexa”. Così viene composto il nome come tmp.alexa_NOME_prev_volume
- state. Qui memorizziamo semplicemente l’attributo volume_level contenuto nell’entità passata in target.
- was_playing. In questo attributo memorizziamo true se lo stato dell’entità passata in target era “playing” oppure false in caso contrario
- allow_create. Viene usato true per specificare che se l’entità non esiste va creata.
A questo punto se il dispositivo Alexa stava riproducendo musica questa viene messa in pausa:
- alias: "Alexa era in riproduzione?" choose: - conditions: "{{states[target].state == 'playing'}}" sequence: - alias: "Metto in pausa Alexa" service: media_player.media_pause target: entity_id: "{{target}}"
Questo perchè alzando il volume prima dell’annuncio e abbassandolo dopo l’annuncio è impossibile sincronizzarsi con la musica, risultando in un aumento improvviso del volume della musica che risulta particolarmente sgradevole. In questo modo, invece, tutto avviene correttamente.
Ora viene impostato il volume passato da multinotify (oppure 0.6 se non era stato specificato come parametro):
- alias: "Imposta volume desiderato" service: media_player.volume_set target: entity_id: "{{target}}" data: volume_level: "{{volume | default(0.6) | round(2)}}"
Infine viene forzato l’attributo volume_level dell’entità di Alexa al volume impostato, così che sia sempre corrispondente con il reale volume:
- alias: "Workaround per aggiornare sempre volume_level di Alexa" service: python_script.set_state data: entity_id: "{{target}}" volume_level: "{{volume | default(0.6) | round(2)}}"
Perchè viene fatta questa operazione? Alexa Media Player si basa su un Websocket costantemente attivo con i server Alexa che aggiorna Home Assistant con gli aggiornamenti di stato dei dispositivi Alexa. Normalmente, quindi, il volume viene aggiornato automaticamente dall’integrazione. Ma capita, purtroppo, che il websocket si disconnetta e l’integrazione non è più in grado di riattivarlo (senza un riavvio di Home Assistant…) e in tal caso il volume non si aggiorna più. Con questo workaround, invece, l’attributo sarà aggiornato sia che il websocket sia in funzione che nel caso contrario.
Lo script multinotify_alexa_post
Al pari dello script multinotify_alexa_pre anche questo script multinotify_alexa_post viene richiamato una volta per ogni dispositivo Alexa coinvolto ma al termine dell’esecuzione di multinotify.
# AD USO INTERNO. Viene chiamato per ogni entità Alexa DOPO il messaggio di notifica multinotify_alexa_post: alias: "Gestione singola Alexa POST" description: "Processa la singola Alexa nel ciclo di Multinotify dopo l'annuncio. Non è pensata per l'utilizzo da parte dell'utente" fields: target: name: "Entità Alexa" description: "Entità singola di Alexa da processare" sequence: - variables: object_id: "{{target | regex_findall('\\.(\\w+)') | first}}" prev_vol: "tmp.alexa_{{object_id}}_prev_volume" was_playing: "{{state_attr(prev_vol, 'was_playing')}}" - alias: "Imposta volume precedente" service: media_player.volume_set target: entity_id: "{{target}}" data: volume_level: "{{states(prev_vol)}}" - alias: "Workaround per aggiornare sempre volume_level di Alexa" service: python_script.set_state data: entity_id: "{{target}}" volume_level: "{{states(prev_vol)}}" - alias: "Se era in riproduzione precedentemente ripristino la riproduzione" choose: - conditions: "{{was_playing}}" sequence: - alias: "Attesa per lasciare applicare il volume ad Alexa" delay: 2 - alias: "Ripristina riproduzione" service: media_player.media_play target: entity_id: "{{target}}"
Questo script ha come solo parametro di ingresso target
contenente, come è facile intuire, l’entity_id del dispositivo Alexa.
La prima cosa che fa questo script è preparare delle variabili da usare in seguito tramite il blocco variables
:
- variables: object_id: "{{target | regex_findall('\\.(\\w+)') | first}}" prev_vol: "tmp.alexa_{{object_id}}_prev_volume" was_playing: "{{state_attr(prev_vol, 'was_playing')}}"
In object_id
viene messo il nome dell’entity_id senza dominio del dispositivo Alexa. Ad esempio per l’entità media_player.alexa1
object_id conterrà alexa1
. La regex, infatti, preleva il contenuto del parametro target a partire dal carattere che segue il punto.
In prev_vol
recuperiamo l’entity_id temporanea che avevamo creato dove abbiamo salvato il volume del dispositivo Alexa prima di modificarlo.
In was_playing
preleviamo l’attributo was_playing
dell’entità temporanea in cui abbiamo salvato se il dispositivo stava riproducendo musica.
Siamo ora pronti a ripristinare il volume precedente all’annuncio:
- alias: "Imposta volume precedente" service: media_player.volume_set target: entity_id: "{{target}}" data: volume_level: "{{states(prev_vol)}}"
Unica nota vediamo che qui preleviamo lo stato dell’entità il cui entity_id è memorizzato in prev_vol
tramite la funzione states
.
Come anche nello script precedente anche qui applichiamo il workaround per assicurarci che il volume dell’entità Alexa sia coerente con il volume che abbiamo impostato, anche se il websocket di Alexa Media Player dovesse cadere:
- alias: "Workaround per aggiornare sempre volume_level di Alexa" service: python_script.set_state data: entity_id: "{{target}}" volume_level: "{{states(prev_vol)}}"
Ultimo step è quello di riprendere la riproduzione di musica, qualora prima dell’annuncio il dispositivo lo stesse facendo:
- alias: "Se era in riproduzione precedentemente ripristino la riproduzione" choose: - conditions: "{{was_playing}}" sequence: - alias: "Attesa per lasciare applicare il volume ad Alexa" delay: 2 - alias: "Ripristina riproduzione" service: media_player.media_play target: entity_id: "{{target}}"
Il choose esegue la sequenza solo se la variabile was_playing
è true. In tal caso ci sarà una pausa di 2 secondi, per assicurarci che il cambio volume sia stato eseguito sul dispositivo, e verrà richiamato il servizio media_player.media_play
sul dispositivo memorizzato in target. Questo farà riprendere la musica da dove era rimasta.
I workaround per Alexa Media Player
Nello script applico due workaround per degli annosi problemi che affliggono Alexa Media Player e che l’autore dell’integrazione non sembra intenzionato a risolvere.
Il primo lo abbiamo già visto applicato negli script multinotify_alexa_pre
e multinotify_alexa_post
, ovvero ogni volta che impostiamo un volume su un dispositivo Alexa richiamiamo la seguente azione per assicurarci che l’attributo volume_level
dell’entità Alexa rispecchi il volume impostato anche se il websocket di aggiornamento dovesse essersi interrotto (cosa che capita piuttosto frequentemente e non viene più ripristinato fino al riavvio…):
- alias: "Workaround per aggiornare sempre volume_level di Alexa" service: python_script.set_state data: entity_id: "{{target}}" volume_level: "{{states(prev_vol)}}"
Questo l’issue dove l’avevo segnalato all’autore si Alexa Media Player.
Il secondo è rappresentato dall’automazione in fondo al package:
automation: # Risolve il bug di attributo volume_level non presente all'avvio di Home Assistant # Ref: https://github.com/custom-components/alexa_media_player/issues/1394 - id: 2d897264-e05c-46bd-ba23-772fbeeab7be alias: "Alexa - Evento - Reimposta volume all'avvio di Home Assistant" trigger: - platform: homeassistant event: start action: - alias: "Imposta il volume al 60%" service: media_player.volume_set target: entity_id: group.all_alexa data: volume_level: 0.6
Alexa Media Player, quando Home Assistant si avvia, non aggiorna lo stato del volume nelle entità Alexa, ovvero l’attributo volume_level di tali entità non viene valorizzato. Questo non permette a multinotify di conoscere il volume dei dispositivi Alexa, dopo un riavvio di Home Assistant (che come sappiamo è una cosa che capita di frequente).
Di conseguenza al riavvio di Home Assistant imposto il volume di ogni dispositivo Alexa al 60%. Questo fa si che il volume venga impostato negli attributi volume_level
e permetta il regolare funzionamento successivo.
Questo l’issue in cui è stato segnalato il problema e io stesso ho dato il mio appoggio.
Conclusione
Spero di non averti annoiato a morte con questo articolo!
Il mio intento è sempre quello di prendere spunto da qualche lavoro per spiegare le tecniche usate e aiutare ad incrementare la capacità di realizzare script ed automazioni sempre più avanzati, piuttosto che la mera diffusione e utilizzo a scatola chiusa, senza capirne i principi di funzionamento.
Se poi non hai avuto tempo o voglia di andare oltre il capitolo “Come funziona lo script multinotify” spero almeno che troverai utile questo package tanto quanto lo trovo utile io! (e chissà che approfondirai il principio di funzionamento un domani)
Una cosa è certa: se sei arrivato fin qui hai tutto il diritto di darti una pacca sulla spalla!
Buone notifiche a tutti 🙂
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
Bellissimo package, usavo già da tempo la prima versione (modificata) con un Google Chromecast e due Google Nest mini, ora con questa è bello poter reimpostare il volume precedente.
Mi chiedevo se metterai il supporto ufficiale anche per i Google Nest, con i limiti del caso (ho visto che la musica non viene ripristinata dopo un messaggio e non c’è l’entità media_player.ovunque), che comunque risulta gestibilissimo.
Eventualmente sono disponibile per fare dei test!
P.S.: quelle belle icone PNG 48×48 con trasparenza dove le hai trovate?
Ciao e grazie! Immagino tu sia l’utente GitHub dell’issue. Rispondo anche qui per completezza: ho appena comprato un Google Nest mini per collaudare e supportare anche Google 😜
Ho diverse cose in programma per il multinotify in futuro, più servizi di notifica e una centralizzazione che semplificherà notevolmente l’utilizzo. Stay tuned 😉
PS: le PNG sono prese da varie repository in rete. Alcune sono icone di Windows (r), altre sono di utenti vari e quelle piatte sono mdi icons modificate da me con un glow bianco (non che mi convincano un granché a dire il vero)
Si sono stato io 😊
Su GitHub ti ho allegato il file con le modifiche che ho apportato per farlo funzionare con i Google Nest mini (ho rimesso le entità di esempio originali).
Non vedo l’ora di vedere gli sviluppi.
Attendo anche l’articolo aggiornato sulla posizione delle persone, quello mi è stato davvero utile per attivare altre automazioni. 😁
Ah ecco 🙂 Ho visto il commento all’issue, grazie per il file! Quando mi arriverà il Google Nest Mini e avrò tempo lo implementerò in modo integrato. Sarà una bell’aggiunta agli altri servizi. Ti ringrazio per la collaborazione e per l’entusiasmo! 🙂
Riguardo all’articolo sulla posizione devo trovare il tempo di mettermi ad aggiornarlo… Spero di riuscirci presto.
Ciao e complimenti per il tuo lavoro!! purtroppo avendo iphone non posso usare appieno le potenzialità di questo fantastico strumento! Attendo con ansia la versione compatibile con app companion ios..
Ciao e grazie! Si, mi sono dimenticato di avvisare di questo limite (lo farò appena riesco).
Ma soprattutto ho intenzione di supportare anche iPhone, Google home ed altri servizi… 😉
Ciao Henrik, dopo aver installato il package, quando provo a verificare la configurazione prima del riavvio, Home Assistant mi risponde con “Package multinotify setup failed. Component script has duplicate key ‘alias'” naturalmente non ho modificato nulla sotto la riga “— NON MODIFICARE OLTRE QUESTA RIGA —”
Puoi darmi qualche dritta?
Ciao, può essere che hai il multinotify vecchio in un altro package? Ho scelto di lasciare lo stesso nome quindi o tieni uno o l’altro (questo v2 è MOLTO meglio comunque e molto altro arriverà…)
TANA!!! Trovato grazie!
Pingback: Notifiche da Deliveroo, Glovo e JustEat in Home Assistant • Henrik Sozzi TECH
Domanda.. io ho automazioni con un data_template xchè contengono codice nel messaggio ( if is_state.. ecc).. in questo caso come devo comportarmi?
Quando richiami lo script ogni parametro che passi supporta i template 🙂 Quindi passi in message il template composto come vuoi tu. Dai un occhio a questo articolo dove è usato multinotify proprio con template: Notifiche da Deliveroo, Glovo e JustEat in Home Assistant
Scusa nn avevo notato che bastasse sostituire la voce data_template con data.. 😉 aspetto con ansia l’implementazione per le notifiche su iphone..ancora complimenti!
Ok, risolto bastava eliminare data_template e sostituirlo con data e lasciare il resto del messaggio invariato
Ciao, complimenti per la guida. Non riesco a mergiare però il package: mi dice “Package multinotify setup failed. Component script cannot be merged. Dict expected in main config.”
Qualche idea?
Ciao perdonami mi è sfuggito il tuo commento! Grazie per i complimenti 🙂 Se da quell’errore non hai configurato correttamente i package.
In configuration.yaml devi avere il seguente codice (ammesso di avere una sottocartella “packages” contenente i package):
homeassistant:
packages: !include_dir_named packages
(nei commenti non mantiene gli spazi. Ci sono due blank nella seconda riga davanti a packages:)
Il multinotify è solo da incollare in tale cartella packages e deve funzionare.
Fai riferimento alla doc ufficiale: https://www.home-assistant.io/docs/configuration/packages/ e/o al capitolo dell’articolo di Vito Antonucci: https://www.vitoantonucci.it/2021/03/home-assistant-costruiamo-le-fondamenta/#14
Pingback: Posizione delle persone con Home Assistant • Henrik Sozzi TECH
Ciao Henrik. Complimenti per questa nuova guida. Non sai quanto mi ha aiutato a migliorare le notifiche del mio sistema.
Ho solo un quesito.
Tutto funziona perfettamente tranne se utilizzo l’entità speciale “media_player.ovunque”.
Mi spiego meglio, ho impostato nel gruppo all_alexa il mio unico dispositivo alexa.
Quando richiamo lo script con target alexa uguale a media_player.ovunque, il volume viene impostato correttamente (si sente il beep) ma Alexa non pronuncia alcun messaggio e dopo qualche secondo di nuovo il beep del volume.
Da cosa può dipendere? Potrebbe essere perchè ho un solo dispositivo nel gruppo all_alexa?
Non è un grande problema (nel mio caso, imposto direttamente il mio dispositivo e risolvo) ma è giusto per capire
Ho dimenticato di dire che se uso come target “group.all_alexa” funziona.
Ciao Gino, sono contento che lo script ti sia di aiuto. Ho in programma diverse migliorie… 🙂
L’entità
media_player.ovunque
è la trasposizione del gruppoOvunque
presente in Alexa. Ora mi viene il dubbio se viene creato automaticamente come ero convinto o l’avessi creato io quando ho comprato i primi Echo Dot…Ad ogni modo in entrambi i casi è logico che tu non ce l’abbia, avendo un solo dispositivo.
Se vuoi predisporti per il futuro crea un “gruppo di altoparlanti” dall’app Alexa, dove metti dentro il tuo dispositivo e in futuro metterai gli altri, nominalo Ovunque e sei future proof 🙂
Ciao Henrik, ancora complimenti e ancora grazie per la dettagliatissima spiegazione ed ottima soluzione.
Avevo integrato nel precedente script la notifica su iPhone via companion app, solo icona titolo e messaggio, rinunciando a group, channel e tag:
#————————————————————————————#
# Sezione notifiche app mobile #
#————————————————————————————#
– choose:
conditions:
– condition: state
entity_id: ‘input_boolean.notifiche_mobile_app_iphonegfk’
state: ‘on’
sequence:
– service: notify.mobile_app_iphonegfk
data:
title: ‘{{ states(“sensor.assistente”) }}’
message: “{{icon}} – {{title}} {{ now().strftime(‘%Y-%m-%d %H:%M:%S’) }} – {{message}}”
stessa logica per Telegram e Notifiche persistenti sempre utilizzando una variabile esterna per l’attivazione (ma potrebbe essere sostituita da una variabile di script):
#—————————————————————————————–#
# Sezione messaggio notifica persistente #
#—————————————————————————————–#
– choose:
conditions:
– condition: state
entity_id: ‘input_boolean.notifiche_persistenti’
state: ‘on’
sequence:
– service: notify.persistent_notification
data:
title: ‘{{ states(“sensor.assistente”) }}’
message: “![image](/local/notify/notify_small_{{icon | default(‘info’)}}.png) {{title}} {{ now().strftime(‘%Y-%m-%d %H:%M:%S’) }} – {{message}}”
#—————————————————————————————–#
# Sezione messaggio notifica telegram #
#—————————————————————————————–#
– choose:
conditions:
– condition: state
entity_id: ‘input_boolean.notifiche_telegram_gfk’
state: ‘on’
sequence:
– service: notify.telegram_gfk
data:
title: ‘{{ states(“sensor.assistente”) }}’
message: “{{icon}} – {{title}} {{ now().strftime(‘%Y-%m-%d %H:%M:%S’) }} – {{message}}”
Il mal di testa comincia con l’integrazione delle SONOS che uso al posto di Alexa, qualcosa ancora non mi torna con i servizi sonos.snapshot e restore per salvare il PRE e il POST che non hanno un comportamento lineare o perlomeno non l’ho capito fino in fondo (ma prima o poi riuscirò ad addomesticarli).
Ancora grazie e in attesa del tuo prossimo articolo!
Ciao Gianfranco, ti ringrazio anche qui per la tua generosità, oltre che per le parole gentili. Come ti ho scritto su buymeacoffee è un grande stimolo per me. Non per il denaro in sè (che fa comodo per pagare l’hosting) ma per la prova tangibile che qualcuno ha apprezzato il mio lavoro 🙂
Grazie per il codice che hai mandato, mi piacerebbe integrare questi servizi nel mio multinotify (lo stavo facendo ma ho incontrato un periodaccio al lavoro…) Particolarmente riguardo ad iphone cosa inserisci in {icon}? Del codice HTML con una img per mostrare l’icona? E’ un workaround in quanto iphone non supporta le icone delle notiifche?
Riguardo a Sonos mi spiace ma non posso aiutarti in quanto non ho alcun dispositivo di quel tipo. Ti posso dire che anche ripristinare il volume di Alexa è una cosa scientifica ed ha richiesto parecchio sforzo per funzionare in modo affidabile (e ogni tanto Alexa Media Player perde il websocket e non funziona più bene… Chissà se prima o poi lo risolveranno) quindi… in bocca al lupo.
Ti invito comunque a partire dalla versione su github che è la più aggiornata, magari si può collaborare e arrivare ad una versione che supporta “tutto”… 😉
Da ieri sera c’è su github la versione 3.1 del multinotify che aggiunge il supporto ad iphone (grazie per lo spunto) ed a Pushover.
Ciao Henrik, è un piacere poter contribuire nel mio piccolo. Quando professionalità e ingegno si contaminano con la passione il risultato è sorprendente. Se poi aggiungiamo la voglia di condividere il proprio lavoro con gli altri, bè … chapeau.
Tornando allo script in {icon} passo solo un testo, così come previsto come parametro dal tuo script, sia per iphone che per telegram a quel punto il messaggio completo inviato contiene solo testo come stringa composta da {icon} (esempio alert) – {title} (esempio SYSTEM + data e ora) – {message} (esempio Errore Backup).
Sulle SONOS ci lavoro, devo risolvere un problema quando è attivo il join (multistanza).
Ho però modificato un pò la logica, rispetto al tuo script che utilizza le variabili per dare massima flessibilità, ho preferito creare un pannello di configurazione dove attivo o disattivo gli speaker da usare, imposto i canali da attivare/disattivare (notifiche persistenti, telegram, iphone, ipad) e i volumi: giorno, notte o quando sono in riunione 🙂
Complimenti anche a te, amo vedere quando il mio lavoro ha stimolato e contaminato quello degli altri che lo rivedono secondo il loro punto di vista… E’ proprio il risultato che mi piace vedere perchè significa che non stai applicando passivamente il mio lavoro (che è pur lecito eh!) ma stai prendendo spunto e modificando per adattare il lavoro alle tue esigenze. Bellissimo, grazie di aver condiviso la tua esperienza!
Il mio script è pensato per essere generico e più plug-and-play possibile, ovvero che l’utente medio possa “buttarlo dentro” ai propri package dovendo modificare il meno possibile. Questo porta ovviamente a tanti compromessi in virtù della genericità (e tanti sforzi… Ad esempio i for each, che ora si possono fare nativamente, creando entità temporanee per ogni dispositivo, così che ne hai uno o 100 funziona in modo dinamico).
Chiaro che costruire intorno alle proprie esigenze è diverso e ti permette di entrare nel dettagli dei tuoi dispositivi e delle tue esigenze. Ma a quel punto diventa difficilmente trasportabile al grosso degli utenti. Questo solo per spiegare il “perchè” dei compromessi.
Ad ogni modo i volumi differenti per fasce orarie differenti penso che entrerà anche nel mio script perchè mi è stato chiesto più di una volta. Per me non è un’esigenza ma evidentemente per tanti si.
Ti anticipo che ci sarà anche uno script che lavorerà al di sopra di multinotify dove il tipo ed i parametri delle notifiche saranno centralizzati… Ma non voglio spoilerare troppo… 😉
Spero di arrivare alla fine a creare qualcosa che possa contribuire ed essere utile per tutti. Sarebbe una bella soddisfazione.
Ciao Henrik, bellissimo lavoro, ho già implementato tutto e con alexa funziona alla grande!
Il problema però è che non riesco a farlo funzionare con le app.
Se vado su strumenti per sviluppatori e provo ad inviare una notifica alla mia app il servizio che mi spunta è questo qui:
service: notify.mobile_app_telefono_francesco
Se invoco il servizio questo funziona tranquillamente e mi arriva la notifica sul cellulare.
Quando però vado ad inserirlo in multinotify.yaml, in questo modo:
notify:
# Gruppo notify.all_devices da utilizzare in multinotify per inviare una notifica a tutte le app
– name: all_devices
platform: group
services:
# TODO: modificare l’elenco dei servizi con i propri servizi di invio notifica alle app Home Assistant Companion collegate
– service: notify.mobile_app_telefono_francesco
Dopo aver salvato, vado a convalidare la configurazione, ma mi dice che la configurazione non è valida, con questo messaggio di errore:
Invalid config for [notify.group]: invalid slug notify.mobile_app_telefono_francesco (try notify_mobile_app_telefono_francesco) for dictionary value @ data[‘services’][0][‘service’]. Got ‘notify.mobile_app_telefono_francesco’. (See ?, line ?).
Potresti suggerirmi da cosa dipende? Grazie Mille e buona giornata!
Ciao, la risposta te la sta indicando molto chiaramente l’errore nel log: nel gruppo di notify non devi indicare l’entity_id ma l’object_id ovvero non
notify.mobile_app_telefono_francesco
ma solomobile_app_telefono_francesco
🙂scusami avevo dimenticato ad includere nel precedente commento che avevo già provato ad inserire soltanto: mobile_app_telefono_francesco
Ma così facendo provando lo script da strumenti per sviluppatori, su “Servizio notifica app” mi restituisce:
Non sono state trovate entità corrispondenti.
Hai idea di come posso risolvere?
Grazie mille ancora
Sono due cose che non c’entrano. La sintassi corretta (che trovi nel mio file che hai scaricato) è di inserire solo l’object_id mobile_app_telefono_francesco. E così avrai un servizio notify.all_devices funzionante (lo puoi collaudare per i fatti suoi come proveresti notify.mobile_app_telefono_francesco).
Nel notify mi è rimasto il selettore del campo relativo al nome del servizio per l’app da usare perchè cercavo disperatamente un modo per caricare i servizi di notifica nella casella a discesa ma non c’è modo. Mi è rimasto quindi il selettore, che fa pensare che debba esserci un elenco ma è “normale” che l’elenco non ci sia, purtroppo. E’ un limite di Home Assistant. Devi invece scrivere il nome del servizio che vuoi a mano e vedrai che funziona 🙂
Tutto sommato è una cosa minore perchè Strumenti Sviluppatore lo usi solo per fare le prove, poi dalle automazioni devi comunque scrivere il codice 🙂
Pingback: Notifiche Alexa più personali con Home Assistant • Henrik Sozzi TECH
io ho seguito la guida passo passo ho installato lo script set_state etc etc ma quando vado ad invocare lo script multinotify HA non lo trova
Hai attivato i packages? Hai riavviato il core? Se vai in strumenti sviluppatore in servizi non trovi il multinotify?
ciao Henrik, nella sezione di notifica all’app “notify_app:” si possono inserire dei template o solamente il dispositivo target?
Ciao, si si, puoi usare template in ogni parametro come credi. Questa è una modifica che c’è stata a livello generale in Home Assistant tanto tempo fa quando si è passati dai parametri speciali
value_template
(ed altri) avalue
. In tal contesto hanno abilitato la possibilità di usare template ovunque nei parametri.PS: ti ho eliminato il messaggio doppio. La prima volta che posti sul sito devo approvare il commento e non sempre riesco a farlo subito.
EDIT: dimenticavo. Ti consiglio di utilizzare l’ultima versione (ver. 3.7.0 nel momento in cui scrivo) presente sul repo github. Aggiornerò l’articolo o ne creerò uno nuovo per le novità ma sul repo è tutto descritto per filo e per segno nel readme.
Tutto perfetto e funzionante!! Grande lavoro complimenti!! Ho altri due quesiti ( pensavi fosse finita eh?).. nella card di lovelace inserisco il messaggio ma nn viene riprodotto, si sente solo il suono dell’announce di alexa e basta..il secondo è questo: nella voce attachment se inserisco l’entità della videocamera mi manda un mess con lo screenshot della camera.. fin qui ok se tengo premuta la notifica mi apre la live, ok, ma mi chiedevo se fosse possibile vedere lo snapshot, perche se tappo sulla notifica mi apre home assistant e nn mi fa vedere la foto ( te lo chiedo perche nella mia vecchia automazione avevo da un lato il salvataggio dello snapshot e dall’altro, aprendo la notifica, mi apriva la foto). pensi si possa fare una cosa del genere? tap singolo apro lo snapshot; tap prolungato apro la live
Ciao Henrick. Ci siamo sentiti un po’ di mesi fa (vers. 2) per qualche problema con gli iPhone ma ora vedo che hai risolto e fatto passi giganti. Congratulazioni per il tuo grande lavoro e per continuare a sviluppare Multinotify, rendendolo sempre più completo e performante. Ho aggiornato alla 3.7 e ho notato che usando la Stack-in-card sulla dashboard, come da te previsto su GitHub, nel campo Destination, vengono visualizzate solo max 4 option dalla input_select.multinotify_dest, anche se ne ho inserite di più in “multinotify_ui.yaml”. Ho fatto diverse prove ma nulla da fare, pare che sia un limite intrinseco della Stack-in-card. Infatti usando la normale Stack-in-card fornita da Home Assistant, tutto funziona correttamente. Te lo segnalo perchè, in attesa che lo sviluppatore della “vertical-stack-in-card” risolva il problema, tu lo possa evidenziare nelle istruzioni di installazione del tuo Multinotify, facendo così risparmiare varie ore di prove e mal di testa a chi lo vorrà usare.
Ciao Michele, grazie per i complimenti! Si, ora iphone è un cittadino di serie A in multinotify, grazie all’aiuto dell’amico Francesco Calamita che ha testato le modifiche di volta in volta. Ora anche mia figlia, ahimè, ha un iphone quindi riesco a testarlo in casa.
Si, a quanto pare la
vertical-stack-in-card
taglia il contenuto che eccede il bordo e quindi anche le caselle a discesa vengono tagliate… In realtà volevo aggiungere diverse cose a quella card tale per cui espandendosi dovrebbe diminuire il problema. Ma nel frattempo (bravo!) la soluzione potrebbe essere quella di usare lavertical-stack
compresa nel core, sacrificando un po’ l’estetica.Le card le avevo create un po’ come “segnaposto” per facilitare le prove e quindi lo sviluppo, non pensavo potessero interessare così tanto (non solo a te…). Ci proverò a lavorare un po’ su nelle prossime versioni.
Intanto grazie per la segnalazione!
Grazie per la veloce risposta. Vedo che non prevedi ancora l’uso di icon su piattaforma IOS perchè, giustamente come spieghi, occorrerebbe usare le SF Symbols library. IMHO, sarebbe interessante che Multinotify prevedesse anche quelle, per uniformità d’uso. Penso che interesserebbe anche ad altri. Potrei provare a trovare una soluzione da solo, ma preferisco non discostarmi dalle tue versioni per poter procedere con gli aggiornamenti, senza impazzire, quando li pubblicherai, quindi preferisco attendere la tua versione ufficiale. Buon lavoro, ancora!
Hai ragione. Inizialmente pensavo di simulare la cosa allegando l’immagine dell’icona PNG usata anche per Android. Ma il buon Francesco Calamita, che mi ha aiutato a debuggare su iphone, l’ha bocciato perchè espandendo la notifica faceva vedere l’icona grande e sgranata, una schifezza. Avevo pensato allora di mappare in qualche modo i simboli SF Symbols così da non doverli specificare ma è più la complicazione che il guadagno.
Alla fine farò come immagino che tu stia suggerendo: aggiungo un parametro specifico per iphone con il simbolo da usare, così completiamo la cosa.
Ti ringrazio per la fiducia nel non discostarti dalla versione ufficiale, mi riempie di orgoglio 🙂
Grazie per i suggerimenti!
Fiducia ben meritata 😉 Concordo appieno con la soluzione di usare i simboli SF Symbols in modo analogo a come ora si usano le “notify_xxxxxxx.png” per Android. E’ la soluzione più semplice, diretta e future-proof che veda. Ti ringrazio a mia volta e auguro un buon lavoro!
Mi era venuta un’idea di come derivare l’SF Symbol dall’icona di Android ma… dalla documentazione dell’app companion non trovo più traccia delle SF symbols… Mi sa che le hanno rimosse…
Hai ragione. Non trovo più traccia delle icon nella documentazione sulle notifiche IOS di Companion; ne è rimasta però nella sezione “Actionable Notifications”… Forse, in effetti, usare le icon in questo caso ha senso e può essere utile. Tu cosa ne pensi?
Si, spulciando anch’io ne ho ritrovato traccia solo tra le actionable notification. Che strano. Beh, mi sta già dando una mano il buon Francesco Calamita (che non smetterò mai di ringraziare!) per fare delle prove di funzionamento. Così uso il valore di icon anche per iOS. Chiaramente le PNG android dovranno chiamarsi nello stesso modo delle SF Symbols, per chi le vuole usare su entrambi i S.O. L’importante sarà documentarlo bene.
Si si, comunque se funzionano voglio implementarle, è un po’ lo scopo di multinotify andare a coprire tutte le possibilità con minor difficoltà di utilizzo… 😉
ciao e grazie…ho letto quasi tutti i tuoi articoli e visto anche i video di youtube, mi piace moltissimo la semplicita e la chiarezza con cui spieghi tutto…..grazie
avrei bisogno di un piccolo aiutino…anzi per me grosso perchè non ci riesco sembra una banalita ma non ci riesco…
ho messo in piedi un piccolo anitufurto domestico con un po di sensori di movimento e alcuni contatti per blindata e finestra …. 2 lettori multimediali come sirena e le notifche via telegram… fin qui tutto ok…. ma non riesco a far riprodurre un file mp3 (beep) per 30 secondi quando inserisco l’antifurto… i 30 secondi che mi permettano di chiudere la blindata e uscire…. e la stessa cosa quando rientro 30 secondi prima che suoni effettivamente la sirena…
se puoi aiutarmi ti ringrazio gia in anticipo e ancora complimenti!!!!
Ciao, manca qualche dettaglio, se vuoi un aiuto. Su cosa vuoi riprodurre il bip? Alexa? Google Home? Altro? Vuoi che faccia bip ogni secondo per 30 secondi o un bip lungo che dura 30 secondi? (immagino la prima)
Ad ogni modo dovrebbe essere una sequenza piuttosto semplice dove usi il counted repeat e in ogni ciclo riproduci il bip. Se usi Alexa non credo che ce la faccia a riprodurre un suono per minuto cmq. usa le informazioni qui per individuare un suono che possa andar bene: https://henriksozzi.it/2022/08/notifiche-alexa-in-home-assistant-piu-personali/#Libreria_audio_Amazon
ciao e grazie ho letto molto su questo blog e ho visto molti tuoi video di youtube ma ho bisogno di un aiutino…
ho integrato in home assistant un antifurto con qualche sensore (porta, movimento, etc) e 2 google nest come sirena oltra alle notifiche su telegram… fin qui tutto bene… ho usato ALARMO (molto semplice per quello che serve a me e per le mie bassissime competente)
adesso pero non riesco a creare un automazione che faccia suonare un file .mp3 (beep) per i 30 secondi di innesco dell’allarme, quindi quando lo inserisco e mi da il tempo di uscire e chiudere la porta blindata… e idem quando rientro (apro la blindata) ci sono 30 secondi di ritardo prima che suoni la sirena (google nest) il tempo per mettere il codice e disinserire l’allarme…. questo beep deve andare da 0 a 30 massimo ….se disinserisco prima smette…se no smette quando inserisco il codice…
potresti aiutarmi??? o con il codice yaml che poi io ovviamente modifico con le mie entità o come preferisci……grazie ancora !!!!
Ok, sei il “DVE” di prima suppongo. Quindi il fatto che debba smettere prima, giustamente, nel caso in cui disinserisci l’antifurto mi fa pensare ad un ciclo while (paragrafo while loop) dove attendi un secondo e riproduci il beep. Nella condizione del while usi
repeat.index
(il numero di cicli) per uscire dopo 30 ma anche le altre condizioni di fine (antifurto disinserito, ecc).ciao si sono sempre io dve o formatta2003…scusa non avevo visto la pubblicazione nemmeno prima della moderazione credevo di essere finito in qualche meandro del web… scusami il dopione
ho un file mp3 che fa 2o 3 bip…quindi andrebbe messo quello in loop fino a che l’automazione non si ferma
i lettori multimediali collegati come gruppo sono un google home e un nest…niente alexa
sinceramente la risposta del repeat.index non ci ho capito nulla … come detto sono a livelli molto basilari
grazieeeee per l’aiuto
Ciao, figurati, non sei il primo e non sarai l’ultimo 😀 Se hai un file fatto così allora l’approccio sarà leggermente diverso ma sempre con un loop. Proverò a stendere lo yaml da darti quando avrò tempo perchè mi incuriosisce.
Mi sono divertito a stendere questo yaml ed ho imparato anch’io delle cose facendolo. Ho scritto due script uno per google home e l’altro per alexa. Riproducono in loop il suono finché scattano 30 secondi o un’altra condizione (tipo attivazione/disattivazione antifurto, per test ho usato un input_boolean). Funzionano entrambe bene.
Qui il codice: https://pastebin.com/4x66U5BH
Se non capisci nulla del codice contenuto tienilo lì e riguardalo quando ti sarai fatto un po’ di ossa in yaml.
Ciao!
ti ringrazio moltissimo….. qualcosina ci capisco… anche se non ho mai fatto script ..ma un po di yaml si…. tento di capirci qualcosa…. grazieee!!!!
Prego 🙂 Di solito non scrivo yaml su richiesta ma in questo caso mi sono intrippato e ho scoperto anche un bug di HA sul percorso che devo segnalare perchè mi ha fatto perdere un sacco di tempo… Buon lavoro 🙂
Ciao ho preparato uno script che mi legge i dati della stazione meteo, siccome ho una decina di echo (divisi in più abitazioni) è possibile far rispondere solamente il dispositivo a cui ho rivolto la domanda?
Ciao Henrik! complimenti per i tuoi articoli, sono veramente molto chiari e utili!
Vorrei utilizzare il Multinotify con google home (ho un vecchio mini) e ho letto in un precedente commento che ci stavi iniziando a lavorare qualche mese fa… per caso hai gia’ qualcosa di utilizzabile che puoi condividere con la community? ciao e grazie mille
Ciao grazie per le belle parole! ❤️ Si, se guardi la versione GitHub è molto più avanti rispetto all’articolo che purtroppo al momento non ho tempo di aggiornare: https://github.com/energywave/multinotify
Ho scritto un readme molto completo, spero che tu conosca l’inglese (altrimenti usa il traduttore)
Prima o poi lo aggiorno l’articolo cmq…
Ciao, volevo chiederti se voglio indicare solo alcuni telefoni app è corretto che nel campo: “Servizio notifica app” non vedo l’elenco dei telefoni che ho inserito per ricevere le notifiche, mentre nel campo: “Target Alexa”.
Questo vuol dire che tutte le volte devo inserire a mano i dispositivi in modalità yaml, non c’è un altro modo ?
grazie 1000 per l’aiuto
Ciao Saverio, purtroppo si, è corretto. Questo perché non esiste un selector in Home Assistant che permetta di far selezionare i nomi dei servizi (in quanto ogni app ha un servizio di notifica apposito differente, che è quello che indichi a mano). Per la destinazione di Alexa, invece, è possibile specificare l’entità di destinazione e, in questo caso, il selector è disponibile.
Se non sai cos’è il selector, è l’indicazione che dai ad Home Assistant per ogni parametro di come mostrarlo nella UI, nello specifico da dove prelevare le voci da mettere nella lista.
In sostanza non è possibile in alcun modo far apparire una casella dove selezioni il telefono a cui vuoi mandare la notifica, purtroppo. L’ho chiesto agli sviluppatori ma per ora tutto tace…
Tieni presente, comunque, che è utile solo in fase di prova quando usi “Strumenti sviluppatore” ma nelle automazioni che scrivi nulla cambia… Devi specificare tutto in modo scritto comunque 😉
PS: se già non lo stai facendo ti consiglio l’ultima versione sul repo github di multinotify, che è molto più avanti: https://github.com/energywave/multinotify
Ciao, grazie intanto per il lavoro che fai!
Ho installato la terza versione trovata su github, ma le automazioni mi riportano questo errore:
L’automazione “Media players – Event – Backup volume at shutdown” (automation.media_players_event_backup_volume_at_shutdown) ha un’azione che chiama un servizio sconosciuto: saver.set_variable.
Questo errore impedisce il corretto funzionamento dell’automazione. Forse questo servizio non è più disponibile, o forse lo ha causato un errore di battitura.
Per correggere questo errore, modifica l’automazione e rimuovi l’azione che chiama questo servizio.
Fai clic su INVIA di seguito per confermare di aver corretto questa automazione.
Credo dipenda dal files script python set_state, ma ho usato i due files da te creati in cima a questa guida…hai dei suggerimenti? Ti ringrazio molto
Ciao, grazie intanto per il lavoro che fai!
Ho installato la terza versione trovata su github, ma le automazioni mi riportano questo errore:
L’automazione “Media players – Event – Backup volume at shutdown” (automation.media_players_event_backup_volume_at_shutdown) ha un’azione che chiama un servizio sconosciuto: saver.set_variable.
Questo errore impedisce il corretto funzionamento dell’automazione. Forse questo servizio non è più disponibile, o forse lo ha causato un errore di battitura.
Per correggere questo errore, modifica l’automazione e rimuovi l’azione che chiama questo servizio.
Fai clic su INVIA di seguito per confermare di aver corretto questa automazione.
Credo dipenda dal files script python set_state, ma ho usato i due files da te creati in cima a questa guida…hai dei suggerimenti? Ti ringrazio molto
Grazie 😊
Leggi bene la sezione dependencies. Uno dei requisiti è il servizio saver (che ti indica l’errore) che va installato da hacs 😉
Questo è il log nel registro di sistema:
Media players – Event – Backup volume_level: Error executing script. Service not found for call_service at pos 2: Unable to find service saver.set_variable
Più chiaro di così… 😜 Torno sullo stesso consiglio: leggi bene la sezione Dependencies nel readme di GitHub, lì ti dice cosa è necessario affinché Multinotify funzioni correttamente. Lì trovo istruzioni e link per il servizio saver.
Ciao Henrik, grazie mille per la dritta, risolto! ultima domanda, è normale che se entro nelle automazioni create, ad es:” Media players – Event – Backup volume_level” mi ritrovo come errore:” Questa automazione non può essere modificata dall’interfaccia utente, perché non è memorizzata nel file automations.yaml o non ha un ID.”?
Ottimo! 🙂 Riguardo alla scritta: si, è normale. Tutte le automazioni create in yaml da configuration.yaml o packages da esso richiamati possono essere viste (da poco…) dall’UI ma non possono essere modificate.
non capisco perchè mi da un errore con alexa
Invocazione del servizio script.multinotify non riuscita. Unable to find service python_script.set_state
Perchè non hai attivato lo script set_state. Se stai seguendo questo articolo leggi il paragrafo Requisiti, oppure, se stai installando l’ultima versione dal repository Github, leggi bene il paragrafo Dependencies.
Nota: consiglio la versione su github, molto più aggiornata di questo articolo (dannazione, non trovo il tempo di aggiornarlo…)
Pingback: Impostare lo stato di un’entità in Home Assistant [aggiornato] – Henrik Sozzi TECH
ciao. Volevo chiedere e capire se sono io a sbagliare o non lo hai impostato.
Ma dalla lovelace non posso selezionare l’app telefono o il player google a cui mandare un messaggio? è fatto solo per alexa?
grazie
Ciao, diciamo che ho lavorato TANTO a Multinotify per fornire un servizio che funzionasse al meglio possibile in tutte le combinazioni di dispositivi/tipologie. La UI l’ho fatta più per sfizio che per reale utilizzo quindi è fatta su mio uso e consumo (personalmente uso Alexa tutti i giorni ed ho Google Home per testare Multinotify).
Se vuoi usare Multinotify dalla UI dovrai modificare a tuo uso e consumo lo yaml della UI.
PS: usa il repository su github che è MOLTO più aggiornato.
Ciao Henrik, grazie per il tuo lavoro.
Sto provando a installare ,seguendo questa guida, la versione presente su GitHub. Lu ho solo scaricat oil vile multinotify_v3.yaml, ma sono già bloccato all’inizio perchè non trovo la parte dove configurare i gruppi per i dispositivi echo, che nel file v2 si trova attorno a riga 60. Ho sbagliato file?
Ok, ho capito dopo che hai fatto un file yaml apparte… ora però ho il problema che, anche se ho installato il saver da HACS, HA mi da questo errore: “L’automazione “Media players – Event – Backup volume_level” (automation.media_players_event_backup_volume_level) ha un’azione che chiama un servizio sconosciuto: saver.set_variable.”
Esatto 😊 Hai riavviato dopo aver installato Saver?
Avevo installato male, mancava la parte di integrazione su HA oltre che scaricare il repository da HACS
Fatto un test, sembra che lo script sia stato installato bene ma quando provo a fare uno script di test (da UI) non succede nulla ^^
Questo lo script:
service: script.multinotify
data:
title: Notifica di test
message: Notifica di test
alexa_target: media_player.echo_dot_studio
alexa_volume: 0.5
notify_app: notify.mobile_app_sne_lx1
alexa_type: tts
Questa la configurazione nel group helper yaml:
group:
# TODO: you have to define your Home Assistant groups for every speaker group defined in the “Speakers group” at the
# end of the page “devices” in the Alexa app.
# Rename “ovunque” to your “all speakers” Alexa group name and eventually remove “piani_superiori” if you don’t have other Alexa groups.
# It’s important that every group name must be equal to the corresponding media_player name.
# For example: media_player.all_upstairs_alexa must have a corresponding group.all_upstairs_alexa with the same content.
# This way multinotify can know who is in the speaker group (as Alexa Media Player don’t tell us…)
ovunque:
name: All Echo devices
entities:
# TODO: modify the list with your own entity_id
– media_player.echo_dot_beauty
– media_player.echo_dot_studio
– media_player.echo_show_cucina
– media_player.echo_soggiorno
– media_player.echo_camera_matrimoniale
#piani_superiori:
#name: Upstairs Echo devices
#entities:
#- media_player.primo_piano
#- media_player.mansarda
#google_home_all:
#name: All Google Home
#entities:
#- media_player.google_mansarda
notify:
# notify.all_android_devices group to be used in multinotify to send a notification to all your connected Android apps.
# You can add other notify group as you want.
# IMPORTANT: please create only homogeneous groups between Android and iOS, DON’T create mixed groups (with some Andoird and some iOS)
# If you create iOS groups please remember to add them too to the anchro parameter iphones in the multinotify_v3.yaml file
– name: all_android_devices
platform: group
services:
# TODO: Edit the list of services to reflect your own Android app services you want to send to
– service: mobile_app_sne_lx1
– service: mobile_app_huawei_patrizia
– name: all_ios_devices
platform: group
services:
# TODO: Edit the list of services to reflect your own iOS app services you want to send to
– service: mobile_app_iphone
Allora, alla fine provando con “Force Alexa” è partito, mentre le notifiche via app non sono partite finchè non ho avviato l’app su telefono (l’app è attiva in background). Domani faccio ulteriori test per provare i gruppi.
Perdonami sono all’estero ora, non riesco ad aiutarti. Quando torno ti rispondo
Ciao, scusa il ritardo ma ero all’estero. Se hai dovuto usare Force Alexa significa che eri nel periodo DND (ovvero dopo l’ora configurata nell’helper input_datetime.multinotify_dnd_start mostrato in UI come DND time start o prima dell’helper input_datetime.multinotify_dnd_end mostrato in UI come DND time end).
Il che significa che o stavi provando di sera/notte o non avevi configurato degli orari adeguati nei due helper di cui sopra.
Per la notifica sul telefono probabilmente non hai configurato bene le opzioni di Android sull’app e il sistema operativo stava ottimizzando la batteria con l’app in background sospendendo l’app. Per evitarlo segui le istruzioni a partire da questo bookmark e dovresti risolvere: https://henriksozzi.it/2023/02/posizione-affidabile-con-app-home-assistant/#Configurare_le_opzioni_di_Android
Ricordati di configurare con attenzione i gruppi come indicato nel readme di github, altrimenti funzionerà l’annuncio ma non il ripristino del volume.
Ciao Henrik ,non ti preoccupare.
Per la notifica alexa, si, alvoravo di notte.
Per la notifica via app: avevo già seguito la tua guida per configurare il dispositivo per la posizione. a comunque da noie. Temo sia perchè è huawei, ho letto di diversi utenti che lamentano problemi del genere con questo produttore. Tuttavia, ho riseguito la guida per verificare di aver impostato tutto giusto e non essermi dimenticato nulla, ed ho trovato una impostazione nel menu “Avvio App” che praticamente faceva da secondo ottimizzatore: lasciato in automatico, tale gestione chiudeva l’app se vedeva che non era utilizzata per un po’ di tempo (lo fa anche con ottimizzazione batteria disabilitata). Ho disabilitato, vediamo come va.
Ciao Henrik, non ti preoccupare,
Si, testavo di notte.
Notifica: non c’entra quello perchè avevo già seguito la tua guida. Credo sia dovuto al fatto che ho un huawei, ho letto di tanti utenti che lamentano problemi sull’attività in background delle app con questo produttore. Comunque, riseguendo la guida per verificare di non aver saltato passaggi, ho trovato un’impostazione in “Avvio App” che permetteva ad Android di gestire automaticamente l’avvio, insomma, se vedeva che non usavo l’app per un po’, la spegneva. Questo anche con ottimizzazione batteria disattivata. Ho disabilitato questa funzione, vediamo se va meglio.
CIao Henrik e chapeau per il lavoro fatto. Veramente eccellente.
Sto riscontrando un problema strano con lo script “multinotify_tts_post” (o magari e` il _pre che setta qualcosa di sbagliato, non saprei)
In pratica ed in breve, se un device Alexa era stato in play durante il giorno e poi fermato con comando vocale (tipo “Alexa stop”), alla successiva esecuzione di un annuncio fatto via Multinotify, la musica riprende a prescindere dal fatto che fosse o meno in pausa… questo non dovrebbe accadere, AFAIK. Tra l’altro, riprende con il volume settato da Multinotify, non con quello precedente all’invocazione… eda nche questo non dovrebbe succedere.
Qualche idea di dove e come cercare di debuggare?
Ciao Walter e te lo scrivo anche qui, grazie per la generosità! 🙂
Detto questo quel che descrivi, purtroppo, è un problema dell’integrazione Alexa Media Player. Accade, in maniera totalmente random (a volte va per giorni e giorni a volte succede dopo nemmeno un giorno) che l’aggiornamento dello stato dei dispositivi Alexa dal cloud Amazon si interrompa. A naso da come accade è come se ci fosse un websocket attivo per ricevere gli aggiornamenti che quando si interrompe non viene più ripristinato (ma è solo una speculazione, non conosco gli internal dell’integrazione).
Quando accade il volume e lo stato di “in riproduzione” non vengono più aggiornati dall’integrazione che lascia i dispositivi come erano rimasti. Da Multinotify ci metto una pezza (per quel che è possibile…) forzando l’impostazione dell’attributo del volume ogni volta che lo imposto, simulando quindi quel che avverrebbe nell’integrazione. Purtroppo, però, non c’è modo di risolvere il problema se non lavorando all’integrazione e purtroppo non programmo in Python, altrimenti un pensierino ce l’avrei avuto…
Detto questo come risolvere? Quando succede a me riavvio HA e l’integrazione riprende a funzionare correttamente. Probabilmente è sufficiente ricaricare l’integrazione (andando in Impostazioni -> Dispositivi e servizi -> click su Alexa Media Player, a destra di CONFIGURA clicca i tre puntini e quindi “Ricarica” dal menu che appare) ma se devo essere onesto non ci ho mai provato.
Sarebbe anche bello se ci fosse modo di accorgersene in automatico così quantomeno da emettere una notifica che si è in quella condizione ma non sono riuscito a trovare un modo che non sia quello di impostare un volume e vedere se l’attributo si aggiorna (un po’ brutale come workaround…)
Se scopri qualcosa fammi un fischio che sarei ben contento di migliorare se c’è margine di farlo!
PS: usi la versione 3.8.1 da github, vero? E’ molto più avanti di quella sul sito e non mi ricordo mai di evidenziarlo bene…
Ciao e grazie ancora a te. Si si, uso la versione latest&greatest da github… devo confessare che sono piuttosto ‘fresco’ (aka niubbo) di HA che smanetto da un paio di settimane, ma non di IT (~ 40 anni… 🙁 ) e di programmazione ne ho fatta a quintali, anche se sono oltre 20 anni che non e` piu` la mia occupazione primaria… ho capito quanto spieghi, ed in effetti e` molto randomica la situazione. Sto facendo dei test con un’altra entita` Alexa (un echo 5) ed il comportamento e` piu` o meno il contrario… nel senso che quasi sempre se l’aggeggio e` in play mode e lancio un annuncio, si stoppa, fa l’annuncio e non riprende il play.
Pero` il volume viene SEMPRE ripristinato correttamente… quindi probabilmente quel che ho scritto sopra non e` corretto dal questo punto di vista.
Ho scaricato un kg di debug, vedo se mi fa venire qualche idea…
Puo` esserci una relazione con un paio di “DEPRECATED” che mi ritrovo in multinotify_v3.yaml dopo l’ultimo aggiornamento di HA? Non credo, ma come detto non sono abbastanza skillato in questa roba…
CIao!
Hai provato a riavviare Home Assistant per vedere se il comportamento delle Alexa si normalizza?
Quanto descrivi sull’Echo 5 (che corrisponde a quanto in genere accade a me) è perchè nel momento in cui il websocket (o qualunque meccanismo che sottende all’aggiornamento dei dati in ingresso da Amazon) si interrompe quel dispositivo non stava riproducendo musica quindi resta “freezato” in quello stato.
Il volume viene ripristinato “artificialmente” come dicevo sopra, forzo io da multinotify il volume. Per provare che sia vero quel che dico se il volume viene ripristinato a volume 5, per esempio, prova a metterlo a volume 10 (con comando vocale all’echo stesso), lanciare un annuncio e vedrai che dopo l’annuncio verrà ripristinato a 5, non a 10 come ci si aspetterebbe, ancora una volta perchè non ricevendo gli aggiornamenti da Amazon l’integrazione non sa che Alexa aveva volume 10 prima dell’annuncio.
Comunque dammi retta, prova a riavviare Home Assistant e riprova multinotify 😉
Quali deprecated relativi a multinotify hai??? Non ne ho contezza… Ma non ho ancora aggiornato alla 2023.8… Se mi dai i dettagli verifico.
Domani faccio i test da casa, poi ti dico. Ma sono convinto che sia esattamente cosi`. Ho guardato un po’ di debug, ma non e` banale!
I deprecated… sono tutti figli della 2023.8, appunto.
alexa_target:
name: “Alexa target”
description: “Single Alexa entity_id, list of Alexa entity_ids, Home Assistant group or Alexa speaker group media player where you want to read the announcment”
selector:
entity:
integration: alexa_media <– deprecated
domain: media_player <– deprecated
tts_target:
name: "TTS target"
description: "Google Home or TTS media player single entity, list of entities or media_player group that will play the announcment"
selector:
entity:
domain: media_player <— deprecated
A dopo.
Il debug di Alexa Media Player…? No, non è banale, bisogna conoscere come funziona dentro per comprenderlo… Anche io ci ho rinunciato, lo mandavo al dev per l’issue ma se lo fai scoprirai che il dev che ha in carico Alexa Media Player è un po’ “ruvido”.
Comunque grazie per le info sui deprecated, purtroppo non ho tempo di aggiornare ora per verificare (magari stasera ma non so), però strano perchè nella documentazione domain: ed integration: sono ancora specificati e non trovo alcuna traccia nel changelog… Anche perchè senza di essi come si può selezionare un’entità in base ad integrazione o tipo…? Qui la pagina di documentazione dei selector.
Appena riesco ad aggiornare comunque lo verifico. Intanto grazie mille.
Confermo che a restart avvenuto di HA le cose si sistemano.. .ma dura poco, 5/6 cicli e siamo daccapo.. 😦
Ciao
È random. Probabilmente dipende dal momento, dalla stabilità della tua connessione, dal carico lato server, chissà che altro… Questo cmq è quel che abbiamo. Speriamo che ci lavorino per renderlo più stabile in attesa dell’assistente vocale di HA che, per me, sarà la risposta definitiva e totalmente locale
Ah, per il problema dei deprecated… visto che c’era anche in un paio di altri blueprint, ho fatto una prova idiota: ho riscritto il pezzo di codice (si, riscritto). Problema sparito nei bliueprint ed anche negli script che non ho editato. Compreso il tuo.
Please, don’t ask…
Ciao Henrik, da poco ho preso un Iphone e sto riscontrando alcuni problemi con l’invio delle notifiche su due dispositivi diversi. Finchè avevo tutto android nessun problema, era sufficiente utilizzare il servizio notify.all_android_devices. Ma adesso che ho 2 dispositivi diversi, come posso fare?
Dall’editor visuale di home assistant non trovo il separatore giusto, ne virgola ne punto e virgola. Nemmeno andando a capo senza separatori funziona, in tutti i casi mi scrive un’unica riga come nell’esempio:
service: script.multinotify
data:
title: CORRENTE SALTATA!
message: UPS IN FUNZIONE, CORRENTE SALTATA
notify_app: notify.mobile_app_iphone, notify.mobile_app_huawei_patrizia
Ho tentato anche di aggiungere una riga da editor YAML (sempre in HA):
service: script.multinotify
data:
title: CORRENTE SALTATA!
message: UPS IN FUNZIONE, CORRENTE SALTATA
notify_app: notify.mobile_app_iphone
notify_app: notify.mobile_app_huawei_patrizia
ma senza troppi successi.
Hai altri suggerimenti da darmi?
si, apparte l’ovvia (così ovvia che mi è venuta in mente solo ora) aggiunta di una azione copia della precedente, dedicata all’iphone, nell’automazione.
Risolto!
– notify.mobile_app_huawei_patrizia
– notify.mobile_app_iphone
Buongiorno Henrik. Sono ancora io, Michele. Sto usando Multinotify Ver. 3.8.1.
Quando cerco di usare un template per creare l’alexa_target, usando il carattere pipe (|), per mantenere i corretti newlines e l’indentazione:
alexa_target: |
{% if is_state(‘binary_sensor.finestre_piano_terra_casa’, ‘off’) and
is_state(‘binary_sensor.finestre_piano_superiore_casa’, ‘off’) and
is_state(‘binary_sensor.finestre_piano_terra_ufficio’, ‘off’)
%}
group.ovunque
{% elif is_state(‘binary_sensor.finestre_piano_terra_casa’, ‘on’) and
is_state(‘binary_sensor.finestre_piano_superiore_casa’, ‘off’) and
is_state(‘binary_sensor.finestre_piano_terra_ufficio’, ‘off’)
%}
– media_player.echo_dot_alexa_di_giovanna
– media_player.echo_dot_alexa_di_luca
{% elif is_state(‘binary_sensor.finestre_piano_terra_casa’, ‘off’) and
is_state(‘binary_sensor.finestre_piano_superiore_casa’, ‘on’) and
is_state(‘binary_sensor.finestre_piano_terra_ufficio’, ‘off’)
%}
– media_player.echo_dot_alexa_in_cucina
– media_player.echo_dot_alexa_di_luca
…
{% endif %}
quello che ottengo andando a vedere il trace è:
alexa_target: |-
– media_player.echo_dot_alexa_in_cucina
– media_player.echo_dot_alexa_di_patrizia
dove appaiono dei caratteri ‘spuri’ (es. |- ) e l’indentazione della seconda riga non è corretta. Così, l’alexa_target che ottengo è costruito male e non funziona. Come devo costruire correttamente il template? Ho provato anche con il Developer Tools-Template ma non ne sono venuto a capo. Mi potresti aiutare? Grazie.
ciao Henrik
usavo già la cartella python_script, ho inserito i tuoi file set state ma al riavvio ricevo due errori tipo:
L’automazione “Media players – Event – Backup volume_level” (automation.media_players_event_backup_volume_level) ha un’azione che chiama un servizio sconosciuto: saver.set_variable.
mi sono perso qualche passaggio?
Ciao, deduco che tu stia usando l’ultima versione su github (il che è un bene). Se leggi nella sezione Dependencies vedrai che una delle dipendenze è il componente custom Saver che viene usato per fare il backup/restore dello stato di alcuni attributi del media_player Alexa quando viene effettuato l’annuncio.
Perdonami ho dimenticato di scrivere che avevo già installato da hacs saver e lo vedo sotto dispositivi
Il messaggio lo dice chiaramente: servizio sconosciuto saver.set_variable
O esiste un saver che è un’altra cosa o non hai riavviato dopo averlo installato o c’è altro. Prova ad eseguire da strumenti sviluppatore il servizio in questione.
Salve Henrik
sarò io incapace ma trovo già difficolta in fase di installazione.
Alla verifica della configurazione mi restituisce
expected a dictionary for dictionary value @ data[‘packages’][‘notify’]
credo si riferisca al file multinotify_groups_helpers
se commento l’intera sezione notyfi mi inbatto nelll medesimo errore
expected a dictionary for dictionary value @ data[‘packages’][‘automation’]
stavolta credo si riferisca alle automazioni nel file vocal_assistants
Ti ringrazio per l’assistenza che vorrai fornirmi
Ciao, sembrerebbe che non hai configurato correttamente i packages. Nella mia configurazione (in
configuration.yaml
) sono configurati così:homeassistant:
packages: !include_dir_named packages
Ti consiglio anche di leggere la sezione 14. I packages di questo articolo: https://www.vitoantonucci.it/2021/03/home-assistant-costruiamo-le-fondamenta/#14
Ciao. Ma e` possibile definire come media_player un telefono Android? Il cosiddetto “this_device” non pare funzionare…
Ciao, no come media_player, che io sappia, no. Però tramite l’app (solo Android) puoi inviare notifiche parlanti ovvero che al posto del suono di notifica riproducano un testo TTS. Più info qua: https://companion.home-assistant.io/docs/notifications/notifications-basic#text-to-speech-notifications
Ciao Henrik. E` possibile usare questo package per lanciare uno streaming su un dispositivo Android (telefono) con a bordo l’app di Amazon Alexa e/o l’app companion di HA? perche` usando l’entita` media_player.echoXYZ non ci sono problemi, ma non trovo modo di riferirmi al media player del telefono… credevo che media_player.this_device fosse l’opzione giusta ma in effetti non fa assolutamente nulla… qualche idea in proposito?
Grazie 1000 as usual.
Credo di averti già risposto al commento precedente (notifiche Text To Speech). A dire il vero non ho mai provato a usare this_device… Immagino che funzioni solo se l’app è aperta che non è esattamente ideale…
Si, scusa ma c’e` stato un delay tra la mia domanda e la successiva, credevo non fosse stata postata… e` probabile che funzioni solo ad app aperta, ma qualquadra non cosa: visto che Alexa puo` mandare uno stream all’app anche se chiusa, un modo deve esserci. Purtroppo non trovo documentazione su “this_device” e su come usarlo.
Vabbe`, grazie comunque
No, non è un delay, il primo commento di ogni utente lo devo approvare e finchè non lo faccio non lo vedi comparire nella pagina, so che questo crea a volte confusione e in effetti non è mai arrivato alcun commento che ho rifiutato. Preferisco comunque lasciarlo così per evitare eventuale spamming.
Potrebbe essere che this_device sia presente nell’integrazione per permettere la lettura dei dati rilevati da tale dispositivo senza magari permetterne l’uso come media_player. Ma è pura ipotesi, non avendolo mai provato ad usare.
Beh, se scopri qualcosa aggiornaci 🙂
Ok. In effetti ha tutte le caratteristiche di un qualunque device… ma sembra un parente di /dev/null 🙂
Ciao Henrik, innanzi tutto devo complimentarmi con il lavoro straordinario da te svolto, dopo aver impiegato una giornata intera per capire come configurare il tutto (sono un niubbio di HA), e incredibilmente non so come ma c’è l’ho fatta (è stata davvero un impresa), mi rimane questa notifica di errore nelle impostazioni di HA che non riesco a capire come risolvere:
L’automazione “Media players – Event – Backup volume_level” (automation.media_players_event_backup_volume_level) ha un’azione che chiama un servizio sconosciuto: saver.set_variable.
Il servizio che indica sconosciuto in realtà esiste, lo vedo nei “Servizi” dentro “Strumenti per sviluppatori” con il nome di “Saver: Set variable”
Ho seguito per filo e per segno la guida più volte cercando di eseguire tutti passaggi e giurerei di aver fatto tutto, magari mi scappa qualcosa e non riesco ad individuarlo, mi daresti una mano per cortesia?
Grazie!
Ciao e grazie per le parole gentili. Le prossime versioni di multinotify verteranno a semplificarne la configurazione, spero di trovare il tempo di lavorarci il prima possibile…
Per quanto riguarda il tuo problema credo che ti manchi solo un riavvio (completo, non rapido)
Ciao e complimenti: l’idea è veramente interessante. Ho cercato in giro tanto perchè mi sembra assurdo avere un sistema di domotica e non poterlo utilizzare per la musica nelle diverse stanze. Quindi finalmente ho trovato un progetto che si pone anche questo problema. Ho quindi provato immediatamente a installare il componente che hai progettato. Ho però delle perplessità e alcuni problemi e quindi non ho potuto apprezzare il funzionamento. Più precisamente ti elenco di seguito le mie perplessità:
– la fire stick è come gli echo dot?
– se nelle diverse stanze ho altri tipi di periferiche audio, tipo un pc o lo stesso minipc dove gira la macchina di HA, posso utilizzarlo?
I problemi sono:
– dopo l’installazione e il riavvio nella dashboard panoramica, autogestita da HA mi sono comparse più volte le stesse periferiche (cioè ho 3 icone con il mio echodot, 3 icone con le mie firestick, etc)
– ho capito che nell’interfaccia di Alexa devo creare un gruppo che comprende tutte le periferiche, ma se provo a inserire il gruppo “ovunque” oppure “all_media” etc non me lo fa inserire. Quale gruppo devo creare affinchè corrisponda con la tua automazione?
Spero tu abbia il tempo per darmi un feedback. Nel frattempo ti ringrazio. Saluti
Oscar
Buongiorno, posso chiedere solo se le Fire Stick si comportano come gli Echo dot?
Ciao Oscar, ad essere onesto non le ho mai usate su FireTV quindi ho fatto qualche prova ora per risponderti.
Si, le FireTV si comportano come un dispositivo Echo con qualche eccezione: se usi “Announce” non riproduce nulla mentre con “TTS” si. Se la TV è spenta si accende per riprodurre (e poi resta accesa…)
La mia TV (Samsung Tizen) non fa in tempo ad accendersi e ti perdi le prime 3/4 parole (e questo si potrebbe gestire inserendo una “prefazione” tipo “Notifica dal sistema di domotica: xxx”)
Però immagino dipenda dalla televisione, se è vecchia e non supporta i comandi CEC su HDMI non la può accendere e quindi funzionerà solo se la TV è già accesa.
Sarebbe interessante capire come fa la notifica se stai riproducendo un film…
Ciao e grazie. io non mi ero posto il problema della notifica secca ma della riproduzione della musica. mi spiego meglio: ad oggi il tuo è l’unico progetto che offre la possibilità di riprodurre musica in tutti i dispositivi. Io ho le firestick collegate a delle casse esterne tramite adattatori, quindi non mi interessa che si accenda il PC. Ma l’idea mi era piaciuta. Certo sono ancora perplesso sulla possibilità di mandare la stessa musica sui dispositivi alexa e sul pc o via bluetooth. Nel frattempo spero di riuscire a far funzionare multinotify sul mio HA perchè ancora non ci sono riuscito. Grazie per il tuo feedback e saluti
Ciao, ma no, Multinotify vedilo come un palazzo costruito sulle fondamenta delle singole integrazioni che utilizza. Non permette di fare “cose in più”, ovvero tutto quello che fai con Multinotify lo puoi fare anche con Alexa Media Player, che in effetti prevede la riproduzione multistanza (fatta in un gruppo definito dall’App Alexa). Quel che fa Multinotify in quel contesto è definire i gruppi in HA come li hai definiti nell’app per permettere di sospendere e riprendere la musica quando avvii un annuncio.
Buongiorno, da quando sono passato dalla versione di HA 2024.1.6 alla versione 2024.2.1 ho notato che l’automazione “Media players – Event – Backup volume_level” presente nel file “vocal_assistants.yaml” mi genera non so per quale motivo un AssertionError e siccome quella automazione ha come trigger il cambio di stato di qualunque entità mi sono ritrovato ad avere qualcosa come 7,5GB di database al posto dei “soliti” 400mb senza contare gli oltre 9GB di file di log del Raspberry OS, me ne sono accorto dopo qualche ora quando il conteggio degli errori era oltre 2.500.000, ho dovuto disattivare l’automazione in attesa di capire cosa non gli piace.
La riga incriminata è la seguente: {{ trigger.event.data.entity_id.startswith(‘media_player.’) }} e fino ad ora ha sempre funzionato senza problemi.
Nel changelog della versione di HA 2024.2.0 e .1 non ho trovato nulla di particolare che mi possa indicare la causa.
Hai sperimentato anche tu questo problema?
Ciao, caspita no. Io non ho ancora aggiornato alla 2024.2.x e tu sei il primo che mi segnala questa cosa. Anch’io mi sono spulciato il changelog, come sempre, e non ho notato alcuna modifica inerente… Cercherò di aggiornare e verificare il prima possibile.
Pingback: Template Jinja con Home Assistant • Henrik Sozzi TECH
Ciao Henrik da quanto ho aggiornato home assistant alla versione 12.4 core 2024.07 durante l’esecuzione dello script ho questo codice errore “expected float for dictionary value @ data[‘volume_level’]. Got None” se anzichè inserire il valore 0.6 nel volume inserisco 1 il problema non si pone. Sembra come se home assistant non riesce a rilevare il ” . ” come valore. Ti hanno segnalato qualcosa del genere su ghitub?
Ciao Giuseppe, no, sei il primo 🙁
Purtroppo non ho ancora aggiornato la mia istanza in quanto ho seri problemi di tempo ultimamente… Cercherò di verificare appena possibile ma non garantisco tempi tanto brevi, sicuramente dopo il weekend. Però mi sembra strano che sia l’aggiornamento…
Ciao Henrik ho aggiornato ulteriore versione core ma il problema persiste. Hai avuto modo di controllarlo?
Ciao Henrik sono riuscito ad individuare il problema e lo condivido casomai potesse essere utile agli altri. I dispositivi echo alexa hanno una funzione che, in caso di assenza suoni per un periodo di tempo lungo (oltre 48/70h) li porta ad uno stato di standby identificabile da una “luce gialla fissa fioca” (diversa da quelle delle notifiche su amazon che invece si presenta con intermittenza lenta). Se solo uno di questi dispositivi (nel mio caso 5 echo dot e nel mio caso invio il messaggio su “ovunque”), si trova in quello stato, lo script non riesce a reimpostare il volume “al termine dell’esecuzione” e restituisce errore “expected float for dictionary value @ data[‘volume_level’]. Got None”. Il motivo del perchè non dia quell’errore se inserisco come valore un numero senza decimali non lo conosco e non me lo spiego. Spero mi sia spiegato bene 😉 e che possa essere utile ad altri! Ciau e grazie!
Ciao Henrik, sono nuovo nel mondo di Home Assistant. Ho collegato Home Assistant cloud con la configurazione di Alexa incluso. Vorrei che alexa mi comunicasse la notifica di una automazione ma essendo ancora inesperto in questo mondo non riesco a seguire il tuo articolo Multinotify: il package per le notifiche su Alexa e App.
group:
# Gruppo contenente tutti i device Echo presenti (necessario per utilizzare media_player.ovunque come target di multinotify)
all_alexa:
name: Tutti i device Echo
entities:
# TODO: modificare l’elenco delle entità del gruppo con i propri dispositivi Alexa
– media_player.pian_terreno
– media_player.primo_piano
– media_player.mansarda
mi puoi spiegare per favore mi potresti chiarire meglio rigo per rigo cosa intendi?
i miei dispositivi Alexa si chiamano
echo dot
2° echo dot
Grazie mille
Ciao Giovanni, ci sono due integrazioni Alexa, che all’inizio può confondere (giusto per essere chiari):
Ti consiglio inoltre, come riportato in cima all’articolo, di leggere e basarti sul repo github, più aggiornato rispetto all’articolo e con un help molto articolato, ci ho messo tanto a scriverlo 🙂 https://github.com/energywave/multinotify
Detto questo quel che chiedi si spiega così: sull’app Alexa tu puoi creare un gruppo di dispositivi, diciamo che lo chiami “ovunque”. Alexa Media Player esporrà automaticamente un servizio di riproduzione che ti permette di riprodurre su tale gruppo (utile per le notifiche in tutta la casa, ad esempio). Il problema è che Alexa Media Player non espone ad Home Assistant tale servizio a quali dispositivi corrisponde per cui, visto che multinotify fa backup del volume, lo regola, riproduce l’annuncio e poi lo ripristina com’era prima ed eventualmente fa riprendere la musica PER OGNI DISPOSITIVO COINVOLTO, ha necessità di sapere quel determinato servizio di riproduzione che hai chiesto a quali dispositivi è associato, così che per ognuno di essi possa regolare volume, ecc.
Se leggi le istruzioni su github vedrai che ci sono i prerequisiti tra cui trovi Alexa Media Player, immagino che ti manchi solo quello.
Ciao Henrik, una domanda “retorica”… hai pensato di aggiornare il package con la nuova sintassi YAML (tipo sostituire service: con action: per intenderci) delle versioni >= 2024.10?
Ciao Walter, no non ci avevo pensato francamente. Dall’ultimo articolo il tempo a disposizione è così poco che mi sono sempre immaginato di usare qualche ritaglio per un nuovo articolo. Il tuo suggerimento è giusto ma avendo poco tempo da dedicare penso sarebbe uno spreco usarlo per quello e sarebbe meglio fare contenuti nuovi.
Se non sei d’accordo dimmi la tua 😊
Anche io propendo sull’aggiornarlo.. anche perchè quando mi sono cimentato io l’anno scorso alla configurazione ho trovato qualche discrepanza come il tts.speak sostituito con il tts.google_translate_say e altre cose. Inoltre non sono riuscito a configurare l’interfaccia nella home di lovelace per usare il multinotify con i dispositivi Google, mi piacerebbe usarlo come per quelli Alexa.
Se trovate problemi o errori segnalateli tramite issue su GitHub, così li tracciamo e quando ho modo ci lavoro.
Be’ piu` che altro non vorrei che un giorno la vecchia sintassi venisse abbandonata e di conseguenza il package smettesse di funzionare… potrei cimentarmi io, magari ne sono capace. Scarichero` una versione ‘pulita’ (ovvero senza le mie modifiche) e vediamo… nel caso te la sottopongo, ok?
Ah aspetta, intendi il package multinotify, scusa non avevo visto la pagina di provenienza 😁 Si dai, questo si può fare… Pubblicherò un aggiornamento su GitHub (perchè usi la versione su GitHub vero…?)
Si, certamente 🙂
Ciao Henrik, prima di tutto grazie per aver creato questo utilissimo package con cui mi trovo veramente bene. Ho un problemino (forse sciocco) che non riesco a risolvere: attualmente utilizzo questa notifica quando viene rilevato un movimento in garage e cliccandoci apro l’immagine dell’evento che l’ha scaturita in una vista di HA:
action: notify.dispositivi_mobili
data:
message: Camera garage ha rilevato un movimento.
data:
channel: sicurezza
importance: high
image: /api/image_proxy/image.camera_garage_ultima_immagine_motion
clickAction: /lovelace-mobile/snapshot-garage
Siccome per lo stesso evento utilizzo anche Multinotify per avere l’avviso tramite i dispotivi Alexa di casa, vorrei utilizzare solo Multinotify ma non riesco a farlo. E’ possibile? Grazie
Ciao Marco,
grazie! 🙂
Se leggi bene la documentazione che ho scritto su github (usi il package di github vero??? Non quello vecchio riportato sul sito…) trovi tutte le informazioni per fare notifica su alexa e app in una botta sola: https://github.com/energywave/multinotify
Ad ogni modo ti ho scritto una ipotesi di come chiamare multinotify adattando il mio allarme rilevatori fumo al tuo caso:
- alias: "Notifica"
action: script.multinotify
data:
variables:
title: Movimento in garage!
message: "Camera garage ha rilevato un movimento"
alexa_target: media_player.ovunque
alexa_volume: 1
alexa_force: true
tts_target: media_player.google_mansarda
tts_volume: 1
tts_force: true
notify_app:
- notify.dispositivi_mobili
notify_html5: notify.html5_browser
notify_ha: true
icon: alarm
channel: alarm
group: alarm
critical: true
url: "/lovelace-mobile/snapshot-garage"
attachment: camera.garage
Tramite il codice sopra riproduci un avviso su Alexa, indipendentemente dall’orario di DND, a massimo volume, su tutte le Alexa (gruppo “ovunque”), sul device Google Home “google_mansarda”, stessa modalità (se non hai google home rimuovi tutti i parametri tts*), invii la notifica al tuo gruppo dispositivi_mobili ed anche all’app html5_browser (io lo uso col browser al lavoro, non ti interessa leva notify_html5) e lasci anche una notifica permanente in HA tramite notify_ha.
Icona, canale e gruppo sono impostati su “alarm” (rimando alla doc per capire meglio di cosa si tratta), critical: true fa si che venga riprodotta la notifica anche in caso di telefono silenziato (dipende dalla personalizzazione del telefono però, è il massimo che si può fare), se clicchi sulla notifica ti rimanda a /lovelace-mobile/snapshot-garage, come nel tuo esempio, e alleghi uno snapshot dalla camera con entity_id camera.garage (lo snapshot avviene automaticamente, senza usare image_proxy, basta specificare l’entity_id della camera che vuoi usare).
Una nota: per android e iphone la sintassi e il comportamento è diverso quindi ti consiglio, se nel gruppo dispositivi_mobili hai sia dispositivi android che iphone, di separarli e specificarli singolarmente nel comando dentro a notify_app. In tal modo, se hai configurato il package indicandogli chi è un android e chi un iphone come da doc, viene mandata la sintassi corretta ad ognuno di essi, in automatico, senza preoccupartene dall’action di multinotify.
Una delle differenze è che su android arriva uno snapshot, come nel tuo esempio, ma sugli iphone arriva uno snapshot ma se ingrandisci la notifica si trasforma nella vista live in streaming della camera, senza dover fare altro.
Cmq. ripeto, leggi bene la doc, trovi il 100% delle possibilità.
Ciao!
Grazie per la risposta, mi sono spiegato male io, chiedo scusa. Lo snapshot utilizzando l’entità fotocamera (camera.camera_garage) riesco ad inviarlo, quello che non riesco ad inviare è l’immagine di un entità creata dall’integrazione Ezviz per la mia videocamera che appunto si chiama “image.camera_garage_ultima_immagine_motion” (forse non essendo un entità di tipo camera non viene riconosciuta dallo script e quindi non viene inviata?) Il percorso “/api/image_proxy/” invece, è l’unico modo per inserire quell’immagine nel servizio di notifica standard.
Non per essere pignolo ma ma lo snapshot alla notifica non cattura con precisione l’evento (ad esempio una falena che passa davanti alla videocamera) perchè viene catturato qualche secondo dopo e visto che esiste questa entità di tipo immagine mi piacerebbe utilizzarla.
Ops, ora ho capito. Ho verificato nel codice ed effettivamente ho capito perchè non va! Per determinare se l’attachment è un’entità oppure un file (e di che tipo tra immagine, video o audio) multinotify cerca nel finale del file se c’è l’estensione e da quella rileva il tipo di contenuto per inviarlo nel modo idoneo a seconda del tipo di smartphone.
Ma nel tuo caso non c’è estensione e quindi, non potendo rilevare, non manda niente. Devo fare una modifica per poter gestire questa cosa… Devo un po’ pensare come gestire la cosa però affinché non risulti complicato in linea con la modalità attuale.
Su due piedi (ma fammici ragionare meglio) potrebbe essere che, fugata l’entità camera, fugate le possibili estensioni, anzi che non mandare nulla come last resort la consideri un’immagine. Così se lo fosse, come nel tuo caso, funzionerebbe. Se non lo fosse… non funzionerebbe comunque.
Ti chiedo un piacere, se hai un account github: mi apri un issue sul repo github? Così non mi dimentico…
Ciao di nuovo, per caso ci sono problemi con la versione di HA core 2024.12.0 ed AMP 5.0.1? Perchè il tuo script non funziona più, mentre il servizio notify.alexa_media funziona correttamente.
Ciao Marco, non ho ancora installato la 2024.12 perché ho visto che ha generato diversi problemi tra cui AMP faceva esplodere tutto (alla versione 5.0.0) ma ho letto che la 5.0.1 risolve. Se con la 2024.12 non ti funzione multinotify e il servizio notify.alexa_media funziona potrebbe esserci qualcosa di nuovo in HA che previene multinotify dal funzionare. Ma cosa fa esattamente? Ma prima di aggiornare ti funzionava correttamente invece?
Come non detto scusami. Sono mesi che un echo show 8 gen.1 mi fa diventare pazzo: quando mando una notifica a tutti i dispositivi (sia da script che da servizio) solo su questo non viene riprodotta e va in “palla” cioè dopo non le riproduce più nemmeno se sono mirate e per farlo riprendere devo riavviarlo. Ho ingiustamente pensato a qualcosa legato con il tuo script ma la realtà è che lo avevo riavviato per la centesima volta e non ci pensavo. Il bello è che tutto questo succede da settembre e solo sull’echo show 8 mentre su altri 4 dispositivi (2 dot gen3, 1 dot gen.5, 1 spot gen.1) nessun problema. Ti è mai successa una cosa così strana?
Mi spiace io non ho alcuno show, solo dot di varie generazioni. Ho già letto di inconsistenze sugli show con gli annunci (indipendentemente da multinotify, credo) ma quello che capita a te no, mai sentito. Mi spiace. Potrebbe magari essere il dispositivo a cui è successo qualcosa? Hai provato e resettarlo e raggiungerlo tra i device? Opzione reso? Non so se però sia successo qualcosa con qualche aggiornamento. Prova a fare un post mirato sullo show sul gruppo Home Assistant Italia, qualcuno che risponde lo trovi
Guarda, le ho provate veramente tutte, anche a ripristinarlo e a riaggiungerlo. Il reso è impossibile perchè ormai ce l’ho da da qualche anno. Il bello è che il messaggio compare sullo schermo e se utilizzo il tuo script anche il volume viene impostato all’inizio e ripristinato subito dopo è solo che in mezzo non viene riprodotto alcun suono! Non mi resta che sperare che qualche futuro aggiornamento risolva il problema
My $0.02… io ho un po’ di dot, di show e di spot… devo dire che gli show in quanto a fare schifo surclassano tutti gli altri: ne ho 2 da 5″ che sono assolutamente certi di essere offline da sempre, tant’e` che non mi lasciano modificare nessun settaggio. Ma funzionano perfettamente, in realta`. Diciamo che l’hardware Echo non e` proprio lo stato dell’arte… comunque la tua problematica non mi e` (ancora) capitata, mentre invece l’ho avuta su un echo 4G, e come e` arrivata se n’e` andata…
Ciao Henrik, mi sono deciso finalmente ad avviare il periodo di prova con Nabu Casa, dopo aver visto il tuo video su YouTube, anche per dare un contributo a questo splendido lavoro che fanno queste persone su Home Assistant. A parte questo, l’altro motivo che mi ha spinto a fare questo passo era per l’integrazione dei dispositivi Amazon Alexa. Vengo al dunque della mia domanda diretta: è possibile per esempio agire su un’impostazione di sveglia (o timer) di un dispositivo Alexa, direttamente da HA, senza passare quindi dall’app Alexa? Purtroppo devo dire dalla mia esperienza d’uso di vari dispositivi Echo e dell’app Alexa che sono veramente pieni di difetti e molto confusi. Nel mio caso in questione, non è possibile per esempio usare una routine per impostare tramite istruzioni vocali ad un dispositivo Echo il volume della sveglia ad una soglia di percentuale (es.: 7%) ma solamente in scala di valori da 1 a 10. Dimmi tu se questo non è incredibile! anche perchè per esempio con l’impostazione del volume del dispositivo (che è separato dal volume della sveglia) questo si può fare. Boh? Valli a capire i programmatori di Alexa… Insomma, volevo sapere se tramite HA sarebbe possibile intervenire su queste impostazioni direttamente sul dispositivo senza quindi passare dalla palla al piede dell’app Alexa. Grazie!
Ciao, sono contento che usi anche te Nabu Casa 😊 Alexa è piena di difetti ma allo stato attuale è l’assistente che permette più funzionalità. Escludendo Assist che è un discorso a parte con tutti i suoi pro e contro allo stato attuale ma si evolve in fretta ed è molto promettente.
Per la tua domanda puoi piegare parecchio Alexa al tuo volere usando Alexa Media Player: https://github.com/alandtse/alexa_media_player
Con quella puoi impostare il volume da automazioni al livello che vuoi, con la granularità che chiedi.
Ed esponendoti un sensore next_timer, next_alarm e next_reminder con data/ora del prossimo timer, sveglia e promemoria. Potresti quindi, se lo vuoi, cambiare il volume poco prima della sveglia e reimpostarlo dopo. Come faccio io con Multinotify, d’altronde, con i messaggi di notifica.
Ti ricordo anche, se vuoi far fare cose ad Alexa senza passare dalla sua app, che tramite Alexa Media Player puoi inviare comandi ad Alexa come se fossero stati dettati a voce ma tramite un servizio, potendo quindi fare tutto quello che puoi fare vocalmente.
ciao
action: script.multinotify
data:
message: prova allarme
notify_app: notify.mobile_app_gianfy_phone
data:
ledColor: “red”
se volessi aggiungere il colore o altre opzioni disponibili su app companion si può fare? ci sto provando ma niente da fare!
Ciao, non puoi aggiungere le opzioni che non sono previste. C’è una sintassi precisa ed è ben documentata sulla pagina github a questo indirizzo: https://github.com/energywave/multinotify
Purtroppo non ho implementato il 100% delle possibilità dell’app companion, un po’ perchè diventa spessa, un po’ perchè alcune feature (come il led) sono disponibili solo su Android. Però se ci tieni posso pensare di includerlo nella prossima versione.