Scopi del PROGETTO:
Concetti affrontati:
|
Componenti software utilizzate:
Prerequisiti:
Dispositivi fisici utilizzati:
|
GUIDA INDICATA A UTENTI CON ISTALLAZIONE: |
|
NOTE E DISCLAIMER
|
|
Revisione progetto: 1.2 |
Abstract
Come molti sanno, AirPlay è uno standard per la trasmissione senza fili, via Wi-Fi, di contenuti audio e audio/video. I trasmettitori (ovvero i soggetti che inviano tali flussi) possono essere smartphone/tablet (tipicamente Apple ma anche Android) o computer; i ricevitori possono invece essere amplificatori audio predisposti, piccole unità di ricezione concepite appositamente (utili per effettuare retrofitting di amplificatori o TV non predisposte) oppure TV di nuova generazione, e altro.
Shairport Sync è un piccolo ma versatile software gratuito che, se installato su un computer (solitamente un Raspberry Pi, ma non solo), consente di trasformarlo in ricevitore audio AirPlay: va da se che possa essere collegato, tramite la propria uscita audio, all’ingresso di un amplificatore o a della casse audio, consentendo quindi di trasmettere e riprodurre audio da fonti quali smartphone/tablet (o altri computer) senza fili tramite lo standard AirPlay.
Shairport Sync, oltre alle funzioni previste di riproduzione audio, prevede anche – opzionalmente – di inviare telemetrie in standard MQTT sulla rete locale, nonché accettare comandi sempre via MQTT. Intercettando tali telemetrie e imparando ad inviare tali comandi è possibile, tramite l’HUB per domotica personale Home Assistant, gestire l’esperienza utente audio AirPlay in modo molto efficace e utile.
Tali tecniche sono descritte nel presente progetto.
Si tratta di tecniche semplici ma piuttosto utili in domotica personale. Ipotizziamo per esempio di avere un amplificatore audio integrato a Home Assistant (come Media Player integrabile di suo, oppure utilizzando i raggi infrarossi) collegato al computer con Shairport Sync tramite cavo audio. Bene: tramite l’integrazione tra Shairport Sync e Home Assistant spiegata nel presente progetto, possiamo abilitarci nella definizione di un’automazione che per esempio accenda e spenga automaticamente l’amplificatore non appena si provvede a inviare o interrompere lo stream audio verso Shairport Sync. Ovviamente questo è solo un esempio: sono tali le telemetrie e i comandi da e per Shairport Sync da consentire di effettuare molte azioni automatiche particolarmente utili.
Si parte
Assunti
Si assume, in primis, che Shairport Sync sia già operativo sulla propria rete domestica. A tal proposito abbiamo dedicato delle guide all’installazione:
- Usare Mini PC/Intel NUC/Raspberry come ricevitore audio AirPlay 2 compatibile, con Shairport Sync (su Docker)
- Usare Raspberry Pi come ricevitore audio AirPlay compatibile, con Shairport Sync
- Usare Raspberry Pi come ricevitore audio AirPlay compatibile, con Shairport Sync (con Docker)
Ma ovviamente qualsiasi altra installazione funzionante di Shairport Sync va bene per il presente progetto, purché sia in versione maggiore o uguale della 3.3, versione la quale ha introdotto il supporto MQTT.
In questo progetto si assume altresì che (maggiori spiegazioni a seguire):
- Home Assistant sia installato e funzionante;
- la configurazione del client MQTT su Home Assistant sia operativa;
- il broker MQTT sia operativo.
Per attivare broker e funzionalità MQTT su Home Assistant si rimanda a questa guida specifica.
N.b. Per chiarimenti sul tema MQTT si consiglia di leggere la guida dedicata alla configurazione del protocollo MQTT per la propria domotica. |
Shairport Sync e MQTT
Di base, Shairport Sync presenta la configurazione MQTT non abilitata. Per abilitarla è necessario modificare il file di configurazione shairport-sync.conf modificando il blocco “mqtt“. A tal proposito, vedere qui per le istruzioni per Raspberry o qui per quelle su Raspberry ma usando Docker; le regole comunque valgono per tutti i tipi di installazione, anche su altri sistemi.
TELEMETRIE
Una volta attivato Shairport Sync (con relativa configurazione MQTT), esso ciclicamente pubblica presso il broker una serie di topic telemetrici, per esempio:
Topic | Descrizione |
shairport/client_ip | Il payload contiene l’indirizzo del client AirPlay connesso a Shairport Sync |
shairport/active_start | Indica l’avvenuta connessione in riproduzione da parte di un client |
shairport/active_end | Indica l’interruzione della connessione in riproduzione da parte di un client |
shairport/play_start | Avvio della riproduzione |
shairport/play_end | Termine della riproduzione (la connessione tra client e Shariport e il client è comunque ancora attiva) |
shairport/play_pause | Riproduzione in pausa |
shairport/play_resume |
Riproduzione riavviata dopo una pausa |
shairport/artist | Nome dell’artista in riproduzione |
shairport/title | Titolo del brano |
shairport/album | Titolo dell’album |
shairport/genre | Genere musicale del brano |
shairport/volume | Volume di riproduzione |
UN Esempio.
Poniamo di voler riprodurre un brano dallo smartphone verso Shaiport Sync. Nel momento in cui viene selezionato l’output verso Shairport, immediatamente questo produce le seguenti telemetrie, in sequenza:
shairport/active_start > shairport/play_start > shairport/volume > shairport/artist > shairport/title > shairport/album > shairport/genre
Al cambio di una canzone (oppure di volume, oppure mettendo in pausa eccetera) verranno pubblicati nuovi topic.
Al termine della sessione (cioè disconnettendo il client da Shairport Sync), verrà pubblicato il topic shairport/active_end.
N.b. Tutto questo è facilmente verificabile mettendosi in ascolto sul broker sul topic “shairport/#“. |
COMANDI
Se nella configurazione di Shairport Sync si è provveduto ad attivare anche i comandi remoti (voce di configurazione enable_remote), sarà possibile inviare i seguenti comandi piuttosto auto-esplicativi:
- “command”
- “beginff”,
- “beginrew”
- “mutetoggle”
- “nextitem”
- “previtem”
- “pause”
- “playpause”
- “play”
- “stop”
- “playresume”
- “shuffle_songs”
- “volumedown”
- “volumeup”
In pratica è possibile comandare le logiche di funzionamento del riproduttore multimediale che sta eseguendo lo stream verso Shaiport Sync da quest’ultimo – semplicemente instradando sul broker un topic di comando appropriato. La sintassi dei comandi è elementare: topic/remote payload, dove topic è il nome rappresentante l’istanza Shaiport Sync (tipicamente shairport) e payload è il comando tratto dalla lista di cui sopra.
Per esempio, pubblicando il topic:
shairport/remote stop
si provvede a interrompere l’esecuzione, mentre
shairport/remote volumeup
si provvede ad alzare il volume, e così via.
Integrazione Home Assistant
Capite le logiche di funzionamento MQTT di Shairport Sync, siamo pronti ad integrare il tutto su Home Assistant.
Partiamo dalla definizione di un “Binary Sensor” che comunichi alla domotica l’esecuzione in corso (o meno) di una sessione AirPlay su ShairPort Sync: ci tornerà utile più avanti. Modificando il file di configurazione di Home Assistant, definiamo un’automazione che, alla ricezione dei topic shairport/active_start e shairport/active_end pubblichi un terzo topic “di servizio” che, a sua volta, determini lo stato del nostro binary sensor:
automation: - alias: "Airplay status" trigger: - platform: mqtt topic: "shairport/active_start" - platform: mqtt topic: "shairport/active_end" condition: [] action: - service: mqtt.publish data: topic: shairport/active retain: true payload: > {% if trigger.topic == 'shairport/active_start' %} started {% elif trigger.topic == 'shairport/active_end'%} ended {% endif %} binary_sensor: - platform: "mqtt" name: "AirPlay" state_topic: "shairport/active" payload_on: started payload_off: ended device_class: "connectivity"
In pratica, il così creato sensore binary_sensor.airplay varierà di stato alla ricezione dei due topic telemetrici, sfruttando il topic di servizio “shairport/active“. Si noti come nell’automazione venga impostata la retain a true in fase di pubblicazione del topic di servizio: questo serve ad evitare che il sensore assuma valori sbagliati in fase di eventuale riavvio di Home Assistant.
Ora, tornando all’esempio spiegato nell’abstract, ipotizziamo di voler scrivere un’automazione che, a fronte dell’inizio o della fine di una sessione AirPlay provveda automaticamente all’accensione/spegnimento dell’ipotetico amplificatore media_player.amplificatore.
Basterebbe qualcosa del genere:
automation
- alias: "Airplay"
trigger:
platform: state
entity_id: binary_sensor.airplay
condition: []
action:
- choose:
- conditions:
- condition: template
value_template: "{{ trigger.to_state.state == 'on' }}"
sequence:
- service: media_player.turn_on
entity_id: media_player.amplificatore
- conditions:
- condition: template
value_template: "{{ trigger.to_state.state == 'off' }}"
sequence:
- service: media_player.turn_off
entity_id: media_player.amplificatore
Ovviamente questo è solo uno dei tanti esempi. La fantasia e le esigenze dell’utente faranno sì che le telemetrie disponibili possano essere utilizzate per le proprie esigenze in molteplici modalità.
COMANDI
Immaginiamo di voler utilizzare poi i comandi disponibili su Shariport Sync da Home Assistant. Anche in questo caso è ovvio che tutto dipenda dalla propria fantasia e dalle proprie esigenze, ma anche in questo caso poteremo un esempio.
Ipotizziamo di avere integrato Alexa come “voce” della propria domotica (o Google Nest, è uguale). Non è improbabile che, mentre stiamo ascoltando la musica tramite AirPlay/Shairport Sync, le notifiche pronunciate dallo smart speaker possano non essere udibili causa volume troppo alto. Bene: scriveremo un’automazione che metta temporaneamente in pausa la riproduzione AirPlay così da dare modo allo smart speaker di “dire la sua”, per poi continuare la riproduzione.
Ipotizziamo ovviamente di avere a disposizione l’entità media_player.alexa (data dall’integrazione come Media Player di Alexa) e di avere ovviamente un proprio trigger per l’innesco dell’automazione:
automation:
- alias: "Notifica Alexa"
trigger: [] #trigger proprio
condition: []
action:
- choose:
- conditions:
- condition: template
value_template: "{{ binary_sensor.airplay == 'on' }}"
sequence:
- service: mqtt.publish
data:
topic: shairport/remote
payload: 'playpause'
retain: true
- service: notify.alexa_media
data:
target: media_player.alexa
data:
type: tts
message: "questa è la mia notifica"
- delay:
seconds: 1
- service: mqtt.publish
data:
topic: shairport/remote
payload: 'playresume'
retain: true
default:
- service: notify.alexa_media
data:
target: media_player.alexa
data:
type: tts
message: "questa è la mia notifica"
Capire l’automazione è semplice. In pratica, alla sua esecuzione viene verificato se sia in corso la riproduzione AirPlay della musica (tramite il sensore binary_sensor.airplay) e, in caso positivo, si mette in pausa (tramite la pubblicazione del comando MQTT shairport/remote playpause), si fa pronunciare ad Alexa la notifica dopodiché si fa ripartire la musica.
Laddove invece la riproduzione AirPlay non sia in corso, viene direttamente eseguita la notifica.
⚠️ Se di Home Assistant ne sai poco ma sei interessato a capirne di più, ti suggeriamo di partire da qui. |
Questa pagina è redatta, manutenuta e aggiornata dallo staff di inDomus, un gruppo di persone molto diverse tra loro che trovi, per domande e supporto, sul forum e sulla chat del sito. Alcuni link sono taggati in qualità di affiliati Amazon e riceviamo un compenso dagli acquisti idonei, utile al sostenimento del sito, ma le nostre recensioni sono tutte indipendenti e non sponsorizzate. Se ti sei perso, a tua disposizione c'è la mappa. |