Al momento stai visualizzando Multinotify: il package per le notifiche su Alexa e App

Multinotify: il package per le notifiche su Alexa e App

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!

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.

Se non sai cosa sono i packages fai riferimento a questa sezione della documentazione che spiega come utilizzarli oppure al capitolo “I packages” dell’articolo di Vito Antonucci
Il package è presente nel mio repository GitHub. Se vuoi correggere, implementare nuove feature o segnalare un problema utilizza GitHub 🙂
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):

ComuniAlexaApp companion
ParametroDescrizioneObbligatorioDefault
messageTesto da notificare alle app e pronunciare da Alexa (se non specificato diversamente)SI
titleTitolo della notifica inviata alle appNONotifica da casa
ParametroDescrizioneObbligatorioDefault
alexa_messageTesto 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_targetDispositivi 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.ovunqueNOnessuna
alexa_volumeVolume 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.0NO0.6
alexa_forceSe 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.NOfalse
ParametroDescrizioneObbligatorioDefault
notify_appNome del servizio da utilizzare per inviare la notifica alle app companion.NOnessuno
groupStringa 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)
channelStringa 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)
iconNome del file (senza percorso, senza il prefisso notify_ e senza estensione) da visualizzare come icona della notifica in appNO=channel, =group o “info” se nessuno dei precedenti è definito
tagCampo 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.NOnessuno
criticalSpecifica 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)NOtrue

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…

Se non sai come accedere alla casella config per inserire le immagini ti consiglio di installare l’addon Samba che trovi in Configurazioni -> Componenti aggiungitivi, backup e supervisore -> RACCOLTA DI COMPONENTI AGGIUNTIVI

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:

Vai in modalità interfaccia utente

I campi dello script saranno visibili e impostabili semplicemente tramite l’interfaccia utente:

Interfaccia utente dello script multinotify
Nota bene: nella casella Alexa è possibile selezionare soltanto tra i dispositivi Alexa in quanto i selettori di Home Assistant non permettono la versatilità che ho voluto implementare in questo parametro. Se vuoi specificare un elenco o un gruppo dovrai scriverlo a mano in modalità YAML.

Potete vedere il codice YAML corrispondente semplicemente premendo il link in basso

Vai in modalità YAML

In tal modo potrai vedere il codice YAML da richiamare dalle tue automazioni / script con i parametri scelti da interfaccia utente:

Codice YAML generato da Strumenti per sviluppatori dopo aver impostato l'UI dello script multinotify

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.

Nota bene: è necessario aver impostato un gruppo con pari nome per ciascun gruppo altoparlanti – musica multistanza contenente l’elenco dei dispositivi contenuti. Vedi capitolo configurazione iniziale.

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.

Nota bene: è necessario aver impostato il gruppo con nome all_alexa contenente l’elenco di tutti i dispositivi Alexa. Vedi capitolo configurazione iniziale.

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).

Unica eccezione non ancora considerata cono le interiezioni come hey che impiegano meno tempo rispetto a quanto calcolato. In una versione seguente calcolerò anche questo.
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.

Avevo aperto un issue chiedendo che questa operazione avvenisse automaticamente nell’integrazione ma l’autore mi ha risposto, in modo non molto garbato, che non ha intenzione di implementarlo. Ecco perchè il workaround…
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)

  • Effettuare i tuoi acquisti AliExpress usando QUESTO LINK

Henrik Sozzi

Sono un analista programmatore per lavoro e per passione. Amo la domotica, la stampa 3D e la tecnologia in generale. Mastodon: @pixel

Questo articolo ha 143 commenti

  1. Michelangelo

    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?

    1. Henrik Sozzi

      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)

  2. Michelangelo

    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. 😁

    1. Henrik Sozzi

      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.

  3. Federico

    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..

    1. Henrik Sozzi

      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… 😉

  4. Alex

    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?

    1. Henrik Sozzi

      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à…)

      1. Alex

        TANA!!! Trovato grazie!

  5. Federico

    Domanda.. io ho automazioni con un data_template xchè contengono codice nel messaggio ( if is_state.. ecc).. in questo caso come devo comportarmi?

      1. Federico

        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!

    1. Federico

      Ok, risolto bastava eliminare data_template e sostituirlo con data e lasciare il resto del messaggio invariato

  6. Alessio

    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?

    1. Henrik Sozzi

      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

  7. Gino

    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

    1. Gino

      Ho dimenticato di dire che se uso come target “group.all_alexa” funziona.

    2. Henrik Sozzi

      Ciao Gino, sono contento che lo script ti sia di aiuto. Ho in programma diverse migliorie… 🙂
      L’entità media_player.ovunque è la trasposizione del gruppo Ovunque 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 🙂

  8. gfkappa63

    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!

    1. Henrik Sozzi

      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”… 😉

      1. Henrik Sozzi

        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.

      2. gfkappa63

        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 🙂

        1. Henrik Sozzi

          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.

  9. Francesco

    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!

    1. Henrik Sozzi

      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 solo mobile_app_telefono_francesco 🙂

      1. 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

        1. Henrik Sozzi

          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 🙂

  10. Calogero Castronovocalogeri

    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

    1. Henrik Sozzi

      Hai attivato i packages? Hai riavviato il core? Se vai in strumenti sviluppatore in servizi non trovi il multinotify?

  11. Federico

    ciao Henrik, nella sezione di notifica all’app “notify_app:” si possono inserire dei template o solamente il dispositivo target?

    1. Henrik Sozzi

      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) a value. 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.

  12. Federico

    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

  13. Michele

    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.

    1. Henrik Sozzi

      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 la vertical-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!

  14. Michele

    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!

    1. Henrik Sozzi

      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!

  15. Michele

    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!

    1. Henrik Sozzi

      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…

  16. Michele

    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?

    1. Henrik Sozzi

      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… 😉

  17. DVE

    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!!!!

    1. Henrik Sozzi

      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

  18. formatta2003

    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 !!!!

    1. Henrik Sozzi

      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).

    2. formatta2003

      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

      1. Henrik Sozzi

        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.

      2. Henrik Sozzi

        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!

        1. formatta2003

          ti ringrazio moltissimo….. qualcosina ci capisco… anche se non ho mai fatto script ..ma un po di yaml si…. tento di capirci qualcosa…. grazieee!!!!

          1. Henrik Sozzi

            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 🙂

  19. Roberto

    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?

  20. Samele

    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

    1. Henrik Sozzi

      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…

  21. gersav20

    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

    1. Henrik Sozzi

      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

  22. Riccardo Crivellari

    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

  23. Riccardo

    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

    1. Henrik Sozzi

      Grazie 😊
      Leggi bene la sezione dependencies. Uno dei requisiti è il servizio saver (che ti indica l’errore) che va installato da hacs 😉

    2. Riccardo

      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

      1. Henrik Sozzi

        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.

        1. Riccardo

          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.”?

          1. Henrik Sozzi

            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.

  24. giuseppe

    non capisco perchè mi da un errore con alexa

    Invocazione del servizio script.multinotify non riuscita. Unable to find service python_script.set_state

    1. Henrik Sozzi

      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…)

  25. gianfilippo

    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

    1. Henrik Sozzi

      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.

  26. Andrea

    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?

    1. Andrea

      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.”

        1. Andrea

          Avevo installato male, mancava la parte di integrazione su HA oltre che scaricare il repository da HACS

          1. Andrea

            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

  27. Andrea

    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.

    1. Henrik Sozzi

      Perdonami sono all’estero ora, non riesco ad aiutarti. Quando torno ti rispondo

    2. Henrik Sozzi

      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.

      1. Andrea

        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.

  28. Andrea

    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.

  29. Walter

    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?

    1. Henrik Sozzi

      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…

      1. Walter

        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!

        1. Henrik Sozzi

          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.

  30. Walter

    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.

    1. Henrik Sozzi

      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.

  31. Walti

    Confermo che a restart avvenuto di HA le cose si sistemano.. .ma dura poco, 5/6 cicli e siamo daccapo.. 😦

    Ciao

    1. Henrik Sozzi

      È 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

  32. Walti

    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…

  33. Andrea

    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?

    1. Andrea

      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.

    2. Andrea

      Risolto!

      – notify.mobile_app_huawei_patrizia
      – notify.mobile_app_iphone

  34. Michele

    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.

  35. Seb

    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?

    1. Henrik Sozzi

      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.

  36. Sebastian

    Perdonami ho dimenticato di scrivere che avevo già installato da hacs saver e lo vedo sotto dispositivi

    1. Henrik Sozzi

      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.

  37. Massimo

    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

    1. Henrik Sozzi

      Ciao, sembrerebbe che non hai configurato correttamente i packages. Nella mia configurazione (in configuration.yaml) sono configurati così:
      homeassistant:
      packages: !include_dir_named packages

  38. Walti

    Ciao. Ma e` possibile definire come media_player un telefono Android? Il cosiddetto “this_device” non pare funzionare…

  39. Walter

    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.

    1. Henrik Sozzi

      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…

      1. Walter

        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

        1. Henrik Sozzi

          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 🙂

  40. Walter

    Ok. In effetti ha tutte le caratteristiche di un qualunque device… ma sembra un parente di /dev/null 🙂

  41. Patrick Di Giusto

    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!

    1. Henrik Sozzi

      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)

  42. docoscar2014

    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

  43. OSCAR

    Buongiorno, posso chiedere solo se le Fire Stick si comportano come gli Echo dot?

    1. Henrik Sozzi

      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…

      1. docoscar2014

        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

        1. Henrik Sozzi

          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.

  44. Michelangelo

    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?

    1. Henrik Sozzi

      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.

  45. Giuseppe

    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?

    1. Henrik Sozzi

      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…

  46. Giuseppe

    Ciao Henrik ho aggiornato ulteriore versione core ma il problema persiste. Hai avuto modo di controllarlo?

  47. Giuseppe

    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!

  48. giovanni

    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

    1. Henrik Sozzi

      Ciao Giovanni, ci sono due integrazioni Alexa, che all’inizio può confondere (giusto per essere chiari):

      1. L’integrazione che accetta i comandi vocali (quello che hai installato con Home Assistant Cloud aka Nabu Casa), ufficialmente supportato
      2. L’integrazione Alexa Media Player, disponibile da HACS, integrazione non ufficiale che permette di utilizzare i device come riproduttori multimediali e tra le cose riprodurre annunci come vuoi fare te (e che utilizza multinotify)

      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.

  49. Walter Oldoni (walti)

    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?

    1. Henrik Sozzi

      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 😊

      1. Patrick

        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.

        1. Henrik Sozzi

          Se trovate problemi o errori segnalateli tramite issue su GitHub, così li tracciamo e quando ho modo ci lavoro.

  50. Walter Oldoni (walti)

    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?

    1. Henrik Sozzi

      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…?)

  51. Walter Oldoni (walti)

    Si, certamente 🙂

  52. Marco Salvini

    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

    1. Henrik Sozzi

      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!

      1. marcosalvinilivecom

        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.

        1. Henrik Sozzi

          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…

  53. Marco Salvini

    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.

    1. Henrik Sozzi

      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?

  54. Marco Salvini

    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?

    1. Henrik Sozzi

      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

  55. Marco Salvini

    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

  56. Walter Oldoni (walti)

    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…

  57. Marco

    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!

    1. Henrik Sozzi

      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.

  58. gianfilippo

    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!

    1. Henrik Sozzi

      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.

Rispondi

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.