Un recente aggiornamento dell’app Sonos mi ha portato a fare una scoperta fantastica: Music Assistant! Ed è stata una vera e propria benedizione, specialmente per un problema che avevamo da tempo.
Ricordate la funzione “auto sleep” di Sonos? Quella che, una volta attivata, spegneva la musica dopo un certo periodo? Era super comoda, soprattutto per noi genitori che la usavamo per aiutare i bambini ad addormentarsi, specialmente in quelle serate in cui serviva un po’ di calma extra. Il problema? La mia dolce metà a volte si dimenticava di impostare il timer e la musica andava avanti tutta la notte!
Per aumentare il WAF (o HAF, come preferite) ho deciso di prendere in mano la situazione. Visto che in Music Assistant la funzione di auto sleep non c’è, mi sono rimboccato le maniche e ho creato un’automazione su misura. E ho cercato di renderla ancora più “smart” rispetto all’opzione di Sonos, facendo sì che la musica si spenga solo alla fine della canzone in riproduzione. Così non c’è il rischio di spegnimenti bruschi a metà brano!
Ecco come funziona:
Trigger: Il media player è in riproduzione da 1 ora e 15 minuti.
Condizione: L’ora attuale è tra le 19:30 e le 07:00 del mattino.
Azioni:
Attendere un massimo di 15 minuti che la canzone finisca (cambio di titolo).
Spegnere la musica!
Codice automazione#
E per i più tecnici, ecco il codice YAML dell’automazione:
description: ""
mode: parallel
triggers:
- alias: nessie_play
trigger: state
entity_id:
- media_player.nessie
for:
hours: 1
minutes: 15
seconds: 0
id: nessie_play
enabled: true
to: playing
conditions:
- condition: time
after: "19:30:00"
before: "07:00:00"
enabled: true
actions:
- wait_for_trigger:
- trigger: state
entity_id:
- media_player.nessie
attribute: media_title
timeout:
hours: 0
minutes: 15
seconds: 0
milliseconds: 0
- action: media_player.media_stop
metadata: {}
data: {}
target:
device_id: 9bcc2148607323743c51c688b54a7e8d
max: 10
Resilienza in caso di reboot: la soluzione con un “timer aiutante”#
La soluzione che vi ho mostrato è un buon punto di partenza, ma c’è un dettaglio importante da considerare: cosa succede se Home Assistant si riavvia? Purtroppo, il timer del trigger basato sullo stato del media player andrebbe perso, vanificando la nostra automazione. Per rendere la nostra soluzione veramente robusta e a prova di riavvio, possiamo ricorrere a un “timer aiutante” (o helper).
Gli helper di Home Assistant, in particolare i timer, ci permettono di gestire i tempi in modo più indipendente e, soprattutto, di mantenere lo stato anche dopo un riavvio. L’importante è ricordarsi di attivare l’opzione “Ripristina stato al riavvio” nelle impostazioni del timer helper che andremo a creare.
Questo significa che la nostra automazione avrà ora due “eventi” principali (trigger) da monitorare. Il primo sarà l’avvio della musica sul player, che darà il via al nostro timer helper. Il secondo trigger sarà lo scadere di questo timer, che ci segnalerà il momento di spegnere la musica. Per mantenere tutto pulito e gestibile in un’unica automazione, useremo gli id dei trigger, permettendoci di differenziare le azioni in base a quale evento ha attivato l’automazione.
Ecco come si presenta il codice YAML della nostra automazione migliorata:
alias: Auto Sleep Timer Sonos
description: ""
triggers:
- alias: nessie_play
trigger: state
entity_id:
- media_player.nessie
id: nessie_play
enabled: true
to: playing
- trigger: event
event_type: timer.finished
event_data:
entity_id: timer.timer_sleep_nessie
id: Timer-nessie
conditions:
- condition: time
after: "19:30:00"
before: "07:00:00"
enabled: true
actions:
- choose:
- conditions:
- condition: trigger
id:
- nessie_play
sequence:
- if:
- condition: state
entity_id: timer.timer_sleep_nessie
state: idle
then:
- action: timer.start
metadata: {}
data: {}
target:
entity_id:
- timer.timer_sleep_nessie
- conditions:
- condition: trigger
id:
- Timer-nessie
sequence:
- wait_for_trigger:
- trigger: state
entity_id:
- media_player.nessie
attribute: media_title
timeout:
hours: 0
minutes: 15
seconds: 0
milliseconds: 0
- action: media_player.media_stop
metadata: {}
data: {}
target:
device_id:
- ff2bbd4dc403c6f1cc829328f8dc5022
mode: parallel
max: 10