Home Assistant - Audio MultiRoom con Arylic DIY Audio Boards

Home Assistant

Scritto da Luigi Duchi

Solo pochi giorni fa abbiamo testato per voi le fantastiche DIY ARYLIC Audio boards (https://www.arylic.com/). Di seguito il link all'articolo nel caso ve lo siate persi.

Arylic DIY Audio Boards. Streaming MultiRoom Spotify, Airplay, DLNA, Upnp

In quell'occasione, oltre a rendermi conto del grande lavoro che hanno fatto con queste schede, ho anche notato la possibilità di utilizzare le API Pubbliche rilasciate da Arylic per i proprio prodotti.

Sapete cosa sono le API vero?

Come potrete intuire non sono di certo le api intese come insetto (dite la verità ci siete rimasti male eh? heehhehehe)

Nel linguaggio informatico un'API, o Application Programming Interface, viene utilizzata per spostare i dati avanti e indietro tra le app dei software in modo strutturato. Molti servizi offrono API pubbliche che consentono agli utenti di inviare e ricevere contenuti dal servizio. Le API che funzionano con Internet e utilizzano URL http:// sono chiamate API web.

Tutte le vostre app preferite che si collegano a Internet utilizzano le API. Ad esempio, le app dei social media utilizzano le API per consentirti di visualizzare e pubblicare post dalle proprie app mobili. Quando aggiornate il feed, l'app effettua una richiesta API per recuperare tutti i post. Oppure quando mettete “Mi piace” ad un post, l'app effettua una richiesta API per pubblicare quei dati.

Con la capacità di effettuare richieste API in Comandi Rapidi, si può anche andare oltre i dati disponibili localmente sul dispositivo e creare comandi rapidi che interagiscono con qualsiasi servizio web che dispone di un'API pubblica.

Utilizzando questo sistema andremo ad integrare le schede Arylic nell'ambiente Home Assistant

COME FARE

La procedura è piuttosto lunga ma, se seguirete i vari passaggi, non dovreste trovare difficoltà.

Il primo step sarà quello di connettere la vostra scheda ad internet mediante la sua applicazione, come abbiamo visto nella precedente guida. (che potete riguardare QUI)

Dovrete prenotare l'indirizzo ip (ip reservation) della scheda dal vostro router in modo che gli venga assegnato sempre lo stesso.

Ho creato un package per agevolarvi nell'integrazione in Home Assistant.

Se nella vostra configurazione non avete ancora attivato l'utilizzo dei package vi consiglio di farlo, sono molto comodi e rapidi.

Vi ricordo come fare:

Per prima cosa in configuration.yaml dovrete inserire la voce

packages: !include_dir_named packages 

successivamente sarà necessario creare una cartella allo stesso livello dei vari file .yaml chiamata appunto packages 

All'interno di questa cartella create un file .yaml chiamato come più vi piace, nel mio caso l'ho chiamato arylic.yaml

All'interno di questo file dovrete copiare tutto il contenuto che trovate qui sotto, avendo cura di sostituire l'indirizzo ip con quello assegnato alla vostra scheda.

#############################################
###############Sensor########################
#############################################
sensor:
  - platform: rest
    name: volume arylic
    resource: http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:Vol--n
    unit_of_measurement: '%'
  - platform: rest
    name: status arylic
    resource: http://192.168.1.xx/httpapi.asp?command=getPlayerStatus
    value_template: '{{ value_json.status }}'
#############################################
###############script########################
#############################################      
script:
  volume_piu_arylic:
    sequence:
     - service: shell_command.volume_piu_arylic
     - service: homeassistant.update_entity
       data:
         entity_id: sensor.volume_arylic
  volume_meno_arylic:
    sequence:
     - service: shell_command.volume_meno_arylic
     - service: homeassistant.update_entity
       data:
         entity_id: sensor.volume_arylic
  mute_arylic:
    sequence:
     - service: shell_command.mute_arylic
     - service: homeassistant.update_entity
       data:
         entity_id: sensor.volume_arylic
  play_arylic:
    sequence:
     - service: shell_command.play_arylic
     - service: homeassistant.update_entity
       data:
         entity_id: sensor.status_arylic
  pause_arylic:
    sequence:
     - service: shell_command.pause_arylic
     - service: homeassistant.update_entity
       data:
         entity_id: sensor.status_arylic
  stop_arylic:
    sequence:
     - service: shell_command.stop_arylic
     - service: homeassistant.update_entity
       data:
         entity_id: sensor.status_arylic
  previous_track:
    sequence:
     - service: shell_command.previous_track
  next_track:
    sequence:
     - service: shell_command.next_track
  loop_random:
    sequence:
     - service: shell_command.loop_random
  loop_track:
    sequence:
     - service: shell_command.loop_track
  no_loop:
    sequence:
     - service: shell_command.no_loop

###############################################
#################shell command################# 
###############################################
shell_command:
  volume_piu_arylic: 'curl -k http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:Vol%2B%2B5'
  volume_meno_arylic: 'curl -k http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:Vol--5'
  mute_arylic: 'curl -k http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:mute:1'
  play_arylic: 'curl -k http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:resume'
  pause_arylic: 'curl -k http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:pause'
  stop_arylic: 'curl -k http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:stop'
  previous_track: 'curl -k http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:prev'
  next_track: 'curl -k http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:next'
  loop_random: 'curl -k http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:loopmode:3'
  loop_track: 'curl -k http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:loopmode:0'
  no_loop: 'curl -k http://192.168.1.xx/httpapi.asp?command=setPlayerCmd:loopmode:4'

Con questo package andremo a creare due sensori (utilizzando la piattaforma rest), uno che monitora il volume del dispositivo e l'altro che monitora lo stato.

Questi sensori non fanno altro che fare una chiamata http interrogando il dispositivo e riportando i dati letti.

Nel caso del sensore del volume la percentuale, nel caso del sensore dello stato riporterà play, pause, stop.

Questi sensori si aggiornano da soli ma la piattaforma rest ha un piccolo problema di latenza per cui non viene aggiornato immediatamente. Vedremo dopo come risolvere il problema.

Gli shell_command non sono altro che le chiamate http che sfruttano le API per compiere le azioni descritte accanto ad ogni singolo comando.

Per risolvere il problema della latenza ho inserito degli script che richiamano lo shell_command e vanno a forzare l'aggiornamento del sensore.

In pratica eseguendo lo script del volume + il volume si alzerà di 5 step e aggiornerà subito il sensore del volume, gli altri script si comporteranno allo stesso modo.

Ho optato per aumentare di 5 step il volume perchè mi sembra più pratico che aumentarlo di uno step alla volta onde evitare di dover premere il pulsante per aumentare solo di 1% il volume.

Se volete cambiare questo valore sarà sufficiente sostituire il numero 5 finale sui due shell_command riguardanti il volume.

Ricordatevi di riavviare il vostro Home Assistant una volta inserito il tutto.

Configurazione Lovelace

Adesso che abbiamo tutti i componenti, dobbiamo inserirli in una Card di Lovelace.

Questo è il risultato della mia configurazione.

per fare questa card dovrete aggiungere una foto nella cartella locale, che nel mio caso si chiama www 

Nel caso vogliate usare la stessa mia foto, potete prelevare quella che incollo qui di seguito che io ho chiamato amplificatore.jpg

Per questa configurazione ho usato una card picture-elements sulla quale poi ho applicato delle icone.

Questa la configurazione che ho utilizzato, potrete copiarla nel file ui-lovelace.yaml per ottenere il medesimo risultato.

 type: picture-elements
 Title: scheda audio
 image: /local/amplificatore.jpg
 elements:
   - type: state-label
     entity: sensor.status_arylic
     style:
       top: 5%
       right: 10%
       color: rgb(255, 255, 255)
       transform: translate(0%,-50%)
       pointer-events: none
       text-shadow: 1px 1px black
       font-family: Trebuchet MS
       font-size: 90%
       font-weight: bold
       border-right-style: solid
       border-color: rgb(87, 21, 125)
       background-color: rgba(0, 0, 0, 0.8)
       opacity: 0.8
   - type: state-label
     entity: sensor.volume_arylic
     style:
       top: 90%
       right: 60%
       color: rgb(255, 255, 255)
       transform: translate(0%,-50%)
       pointer-events: none
       text-shadow: 1px 1px black
       font-family: Trebuchet MS
       font-size: 90%
       font-weight: bold
       border-right-style: solid
       border-color: rgb(87, 21, 125)
       background-color: rgba(0, 0, 0, 0.8)
       opacity: 0.8
   - type: icon
     icon: mdi:volume-plus
     tap_action:
       action: call-service
       service: script.turn_on
       service_data:
         entity_id: script.volume_piu_arylic
       entity_id: script.volume_piu_arylic
       style:
         color: rgb(87, 21, 125)
         right: 70%
         top: 90%
   - type: icon
     icon: mdi:volume-minus
     tap_action:
       action: call-service
       service: script.turn_on
       service_data:
         entity_id: script.volume_meno_arylic
       entity_id: script.volume_meno_arylic
       style:
         color: rgb(87, 21, 125)
         right: 90%
         top: 90%
   - type: icon
     icon: mdi:volume-off
     tap_action:
       action: call-service
       service: script.turn_on
       service_data:
         entity_id: script.mute_arylic
       entity_id: script.mute_arylic
       style:
         color: rgb(87, 21, 125)
         right: 80%
         top: 90%
   - type: icon
     icon: mdi:skip-backward
     tap_action:
       action: call-service
       service: script.turn_on
       service_data:
         entity_id: script.previous_track
       entity_id: script.previous_track
       style:
         color: rgb(87, 21, 125)
         right: 90%
         top: 5%
   - type: icon
     icon: mdi:stop
     tap_action:
       action: call-service
       service: script.turn_on
       service_data:
         entity_id: script.stop_arylic
       entity_id: script.stop_arylic
       style:
         color: rgb(87, 21, 125)
         right: 80%
         top: 5%
   - type: icon
     icon: mdi:play
     tap_action:
       action: call-service
       service: script.turn_on
       service_data:
         entity_id: script.play_arylic
       entity_id: script.play_arylic
       style:
         color: rgb(87, 21, 125)
         right: 70%
         top: 5%
   - type: icon
     icon: mdi:pause
     tap_action:
       action: call-service
       service: script.turn_on
       service_data:
         entity_id: script.pause_arylic
       entity_id: script.pause_arylic
       style:
         color: rgb(87, 21, 125)
         right: 60%
         top: 5%
   - type: icon
     icon: mdi:skip-forward
     tap_action:
       action: call-service
       service: script.turn_on
       service_data:
         entity_id: script.next_track
       entity_id: script.next_track
       style:
         color: rgb(87, 21, 125)
         right: 50%
         top: 5%
   - type: icon
     icon: mdi:repeat
     tap_action:
       action: call-service
       service: script.turn_on
       service_data:
         entity_id: script.loop_track
       entity_id: script.loop_track
       style:
         color: rgb(87, 21, 125)
         right: 40%
         top: 5%
   - type: icon
     icon: mdi:repeat-off
     tap_action:
       action: call-service
       service: script.turn_on
       service_data:
         entity_id: script.no_loop
       entity_id: script.no_loop
       style:
         color: rgb(87, 21, 125)
         right: 30%
         top: 5%
   - type: icon
     icon: mdi:shuffle-variant
     tap_action:
       action: call-service
       service: script.turn_on
       service_data:
         entity_id: script.loop_random
       entity_id: script.loop_random
       style:
         color: rgb(87, 21, 125)
         right: 20%
         top: 5%

Non mi rimane che lasciarvi al video di fine articolo dove vi mostrerò in funzione il sistema. Buona visione!

Produrre e aggiornare contenuti su vincenzocaputo.com richiede molto tempo e lavoro. Se il contenuto che hai appena letto è di tuo gradimento e vuoi supportarmi, clicca uno dei link qui sotto per fare una donazione.

Luigi Duchi

Nato a Grosseto il 24 Dicembre 1982 perito elettrotecnico che lavora nel mondo della domotica e installazione di impianti elettrici, impianti di allarmi, videosorveglianza e automazioni in genere. Appassionato da sempre di tecnologia e aperto alla conoscenza di nuove soluzioni.


Vai ai commenti