community italiana di domotica personale
 
Integrare AirPlay con Home Assistant via Shairport Sync e MQTT

Integrare AirPlay con Home Assistant via Shairport Sync e MQTT

Scopi del PROGETTO:
  • Integrare le funzionalità legate allo streaming audio AirPlay (per Apple e Android) a Home Assistant
  • Livello di difficoltà: medio/basso
  • Categoria d’integrazione: Local Push
Concetti affrontati:
  • Configurazione software
Componenti software utilizzate:
Prerequisiti:
Dispositivi fisici utilizzati:
  • Il computer sul quale è in esecuzione Home Assistant
  • Uno o più componenti Apple o Android in grado di effettuare streaming audio via Apple Airplay
GUIDA INDICATA A UTENTI CON ISTALLAZIONE:
Ambienti Home Assistant HassOS-Supervised-Core
NOTE E DISCLAIMER
  • qualsiasi eventuale modifica agli impianti domestici dev'essere progettata e realizzata SOLO da personale qualificato;
  • qualsiasi modifica non prevista attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (i contenuti della presenta pagina hanno infatti puro scopo didattico) e fa decadere garanzia, omologazioni e certificazioni di qualità; dei dispositivi interessati;
  • tutte le tecniche descritte si intendono applicate a software e firmware aggiornati alle ultime versioni disponibili;
  • gli articoli di inDomus sono totalmente indipendenti e non sponsorizzati. Se mai questo cambiasse, verrà segnalato chiaramente sulle pagine oggetto di sponsorizzazione;
  • questa pagina è materialmente scritta e manutenuta da più individui: non ci si aspetti né si pretenda un supporto personale. In caso di difficoltà, chiedere supporto alla community sul nostro forum o sulla nostra chat;
  • se hai bisogno di orientarti, c'è la mappa.
Revisione progetto: 1.2

Airplay - Home Assistant

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.

SintoamplificatoreShairport 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:

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 topicshairport/#“.
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.