community italiana di domotica personale
 
Usare Raspberry Pi come ricevitore audio AirPlay compatibile, con Shairport Sync (con Docker)

Usare Raspberry Pi come ricevitore audio AirPlay compatibile, con Shairport Sync (con Docker)

7 minuti di lettura
SCOPI DELLA GUIDA:
  • Installare e configurare il software “Shairport Sync” con Docker su sistema operativo Raspbian di Raspberry Pi (o più genericamente, su Linux), per utilizzarlo come ricevitore audio compatibile Apple AirPlay (anche con Android)
  • Livello di difficoltà: basso
  • Costo: n/a
CONCETTI AFFRONTATI:
COMPONENTI SOFTWARE UTILIZZATE:
PREREQUISITI:
DISPOSITIVI FISICI UTILIZZATI:
  • Raspberry Pi
  • Un dispositivo o un server in grado di effettuare streaming audio su standard AirPlay
Note e disclaimer
  • qualsiasi eventuale modifica agli impianti domestici dev'essere progettata ed realizzata SOLO da personale qualificato;
  • qualsiasi modifica attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (i contenuti della presenta pagina hanno puro scopo didattico);
  • qualsiasi modifica attuata in proprio a un dispositivo ne fa decadere garanzia, omologazioni e certificazioni di qualità.
Revisione guida: 1.1

Apple Airplay

Abstract

Shairport Sync è un software che rende il computer sul quale è in esecuzione ricevitore per qualsiasi stream audio inviato da un emettitore Apple AirPlay compatibile, vale a dire dispositivi Apple, oppure Android che utilizzino applicazioni in grado di effettuare streaming in questo senso (per esempio l’app AirMusic, o altre).

Collegare questo computer così configurato ad un amplificatore o a delle casse acustiche lo rende quindi implicitamente compatibili Apple AirPlay, standard particolarmente apprezzato perché a differenza di altri standard utilizza come mezzo di trasmissione il Wi-Fi piuttosto che, per esempio, il Bluetooth, oltre ad presentare un livello qualitativo nettamente superiore.

Scopo della presente guida è quello di installare e configurare Shairport Sync istanziato come container Docker presso il sistema operativo Raspbian di Raspberry Pi. La guida è sostanzialmente valida anche per qualsiasi altro sistema Linux.

N.b. Per gli utenti che non volessero utilizzare Docker, è disponibile quest’altra guida che illustra come installare Shairport Sync come applicativo.

Si parte

Assunti

Questa guida è dedicata a chi abbia già un Raspberry in uso con sistema operativo Raspberry Pi OS (aka Raspbian). Per coloro che non abbiano ancora provveduto e si trovino ad avere un Raspberry nuovo, magari acquistato appositamente per realizzare la propria domotica, allora questo passo della guida va smarcato seguendo prima un’altra guida, che spiega passo passo come configurare il sistema operativo Raspbian.

La guida da seguire:

Una volta terminata la configurazione di Raspbian (inclusa la possibilità di collegarvisi tramite SSH) è possibile procedere nella presente guida.

Installare Docker

Installare Docker su Raspberry Pi dotato di sistema operativo Raspbian è piuttosto rapido e semplice: esiste infatti sia una procedura completamente automatica oppure una manuale. Entrambe le procedure sono illustrate in dettaglio in questa breve guida.

Se si dispone già di Docker, va da sé che questo passaggio possa essere saltato.

Istanziare Shairport Sync

A questo punto è possibile provvedere all’istallazione di Shairport Sync, il quale viene eseguito come container Docker tramite un’istanza specifica.

In ambito Docker, l’istanziamento dell’applicazione può essere effettuato tramite esecuzione di un comando manuale (più immediato) oppure tramite una configurazione del tool di gestione Docker Compose, approccio inizialmente più ostico ma che consigliamo per tutta una serie di motivi. Entrambe le scelte sono valide, ma in prospettiva (specie in ottica di aggiornamento) imparare ad usare Docker Compose è altamente consigliato.

ATTENZIONE: affinché i comandi a seguire funzionino, è necessario aver aggiunto Docker al gruppo sudoers, come spiegato in guida d’installazione Docker.

Tramite comando “docker run”

Istanziamo dunque Shairport Sync su Docker tramite il comando che segue via terminale (da CLI, via SSH oppure con control-alt-t da interfaccia desktop):

docker run -d --name shairport --net host --device /dev/snd --restart always orbsmiv/shairport-sync-rpi

Si noti come il campo “device” vada a indicare al software di utilizzare il device “/dev/snd“, ovvero la scheda audio del computer. Tale parametro, come molti altri, può essere variato per ottenere eventualmente configurazioni diverse e particolari, per esempio in presenza di schede audio esterne particolari.

Al termine, verifichiamo che tutto sia andato per il verso giusto:

docker logs shairport

nel log dovremmo trovare qualcosa come:

0.003431802 "shairport.c:1729" Started!
0.000097499 "shairport.c:1756" software version: "x.x.x-libdaemon-OpenSSL-Avahi-ALSA-pipe-soxr-convolution-metadata-mqtt-dbus-sysconfdir:/etc"
0.000041302 "shairport.c:1762" log verbosity is 1.

Congratulazioni: Shairport Sync è ora operativo.

Tramite Docker Compose

Se astutamente si sceglie di utilizzare Docker Compose, allora è semplicemente necessario aggiungere al proprio file docker-compose.yaml la seguente configurazione (sotto il bocco services):

  shairport:
    container_name: shairport
    restart: always
    image: orbsmiv/shairport-sync-rpi
    network_mode: host
    devices:
    - "/dev/snd"

Si noti come il campo “device” vada a indicare al software di utilizzare il device “/dev/snd“, ovvero la scheda audio del computer. Tale parametro, come molti altri, può essere variato per ottenere eventualmente configurazioni diverse e particolari, per esempio in presenza di schede audio esterne particolari.

Una volta salvato il file docker-compose.yaml, eseguire il comando:

docker-compose up -d shairport

il quale provvederà a istanziare il container.
Al termine, verifichiamo che tutto sia andato per il verso giusto:

docker logs shairport

nel log dovremmo trovare qualcosa come:

0.003431802 "shairport.c:1729" Started!
0.000097499 "shairport.c:1756" software version: "x.x.x-libdaemon-OpenSSL-Avahi-ALSA-pipe-soxr-convolution-metadata-mqtt-dbus-sysconfdir:/etc"
0.000041302 "shairport.c:1762" log verbosity is 1.

Congratulazioni: Shairport Sync è ora operativo.

Perfezionamento della qualità audio

Prima di iniziare ad utilizzare Shairport Sync, provvediamo a perfezionare la configurazione in modo da ottenere la massima resa acustica possibile.

Innanzitutto andiamo a modificare il vitale file “/boot/config.txt” per inserire un’impostazione ad hoc.
Eseguiamo quindi l’editor di testo tramite il comando:

sudo nano /boot/config.txt

e, in fondo al file, aggiungiamo la seguente riga:

audio_pwm_mode=2

Usciamo salvando con control+x, Y, invio.
Ora impostiamo come uscita predefinita quella del jack 3.5mm stereo posto sul lato del Raspberry in luogo dell’uscita audio HDMI tramite il comando:

sudo raspi-config

Recarsi quindi alla voce di menu “System Options” > “Audio“, selezionare “Headphones“. Uscire poi con “Finish“.

Infine andiamo a modificare il range in db del volume del segnale in uscita. Entriamo sul terminale del container appena creato col comando:

docker exec -it shairport sh

Entriamo in edit nel file “/usr/local/etc/shairport-sync.conf”:

cd ect
vi /usr/local/etc/shairport-sync.conf

e andiamo a cercare la voce:

// volume_range_db = 60 ;

sostituendola quindi (premendo sulla tastiera la lettera “i” per entrare in modalità edit) con:

volume_range_db = 30 ;

Cerchiamo poi la voce “name” impostando in quella voce il nome che vorremo visualizzare come outpout sui dispositivi Apple, per esempio:

name = "SALA" ;

Usciamo salvando premendo ESC, poi “:wq”, infine invio.
Effettuare un ultimo riavvio:

sudo reboot

Volume di output

Il volume di output del Raspberry influenza anche l’output di Shairport Sync. Si consiglia di impostarlo a 95%-100% tramite il comando:

alsamixer

regolare quindi il volume con le freccette della tastiera e poi uscire tramite ESC.

MQTT

Opzionalmente, dalla versione 3.3 Shairport Sync prevede l’utilizzo di MQTT come veicolo per produrre telemetrie e ricevere comandi specifici.

N.b. Per chiarimenti sul tema MQTT si consiglia di leggere la guida dedicata alla configurazione del protocollo MQTT per la propria domotica. Ovviamente, per procedere nelle configurazioni proposte in questo paragrafo si assume che sulla rete locale sia già stato presente un broker MQTT (eg. Eclipse Mosquitto).

Per attivare tale supporto è necessario modificare ulteriormente il file di configurazione del software:

docker exec -it shairport sh
cd etc
vi shairport-sync.conf

recandosi sul fondo del file, si troveranno delle voci raggruppate sotto il blocco “mqtt“:

mqtt =
{
//  enabled = "no"; // set this to yes to enable the mqtt-metadata-service
//  hostname = "iot.eclipse.org"; // Hostname of the MQTT Broker
//  port = 1883; // Port on the MQTT Broker to connect to
//  username = NULL; //set this to a string to your username in order to enable username authentication
//  password = NULL; //set this to a string you your password in order to enable username & password authentication
//  capath = NULL; //set this to the folder with the CA-Certificates to be accepted for the server certificate. If not set, TLS is not used
//  cafile = NULL; //this may be used as an (exclusive) alternative to capath with a single file for all ca-certificates
//  certfile = NULL; //set this to a string to a user certificate to enable MQTT Client certificates. keyfile must also be set!
//  keyfile = NULL; //private key for MQTT Client authentication
//  topic = NULL; //MQTT topic where this instance of shairport-sync should publish. If not set, the general.name value is used.
//  publish_raw = "no"; //whether to publish all available metadata under the codes given in the 'metadata' docs.
//  publish_parsed = "no"; //whether to publish a small (but useful) subset of metadata under human-understandable topics
//  Currently published topics:artist,album,title,genre,format,songalbum,volume,client_ip,
//  Additionally, empty messages at the topics play_start,play_end,play_flush,play_resume are published
//  publish_cover = "no"; //whether to publish the cover over mqtt in binary form. This may lead to a bit of load on the broker
//  enable_remote = "no"; //whether to remote control via MQTT. RC is available under `topic`/remote.
//  Available commands are "command", "beginff", "beginrew", "mutetoggle", "nextitem", "previtem", "pause", "playpause", "play", "stop", "playresume", "shuffle_songs", "volumedown", "volumeup"
}; 

le voci da attivare e configurare (come minimo) sono le seguenti:

enabled Impostare a yes per attivare il supporto MQTT
hostname Indicare l’hostname o l’IP del proprio broker (eg. 192.168.1.100)
port Indicare la porta del servizio MQTT (solitamente 1883)
username / password Indicare le eventuali credenziali d’accesso al broker MQTT
topic Il topic MQTT presso il quale telemetrie e comandi faranno capo (lasciare shariport in caso ci sia una sola istaza del software sulla rete domestica, altrimenti personalizzarlo con un distintivo (eg. shaiport-sala)
publish_parsed Impostare a yes. Necessario affinché i payload delle telemetrie siano intelleggibili
enable_remote
Impostare a yes. Necessario affinché Shairport-Sync possa ricevere comandi via MQTT.

Per farlo ovviamente è necessario modificare il file rimuovendo i due caratteri di commento in testa ad ogni riga “//“, oltre a modificare il testo come da proprie esigenze. Per entrare in editing del file, premere la lettera “i”.

Al termine della configurazione, usciamo salvando premendo ESC, poi “:wq”.
infine riavviamo il servizio con:

docker container stop shairport
docker container start shairport

N.b. non usare “restart”: abbiamo notato che tende a bloccare il corretto riavvio del container.

Da qui in poi, telemetrie e comandi verranno rispettivamente inviate ed eseguite da Shairport-Sync.

HOME ASSISTANT

Dopo l’avvenuta configurazione di MQTT, volendo è pensabile di integrare le funzioni AirPlay sull’HUB per domotica personale Home Assistant (o altri dotati di supporto MQTT).

Uso

Ora sarà possibile, collegandosi alla Wi-Fi e durante l’esecuzione di flussi audio (Spotify, messaggi vocali, qualsiasi cosa all’infuori dei suoni di sistema) cliccare sull’icona così fatta (sui dispositivi Apple) 

Apple Airplay Icon

per elencare tutti i dispositivi AirPlay presenti nella rete locale, incluso il nostro Raspberry Pi reso ricevitore AirPlay:

Sui dispositivi Android tramite specifiche app oppure sui server streaming in grado di erogare flussi AirpPlay, basterà “puntare” al nome assegnato all’istanza Shairport Sync e la riproduzione si avvierà automaticamente.

Apple AirPlay widget

   
Telegram News Channel