Radio Sveglia Domotica con Home Assistant e Google Home
di Antonio Mario Longo
02 Novembre 2020
Home Assistant
Vi ricordate la mitica sveglia di Iron Man creata da Vincenzo Caputo in quel ''grottino'' con Tasker??
Era molto carina, si interfacciava con Android ed era in grado di svegliarci in maniera allegra ma soprattutto era tra le prime forme di 'domotica' Home Made.
Oggi sotto la falsa riga, del progetto sopra menzionato, creeremo un package un pò più avanzato, che sarà in grado di riconoscere i nostri giorni lavorativi, e svegliarci facendoci ascoltare le previsioni meteo, la temperatura e l'umidità nella nostra città e far partire una radio o uno dei 5 files mp3 che abbiamo precaricato in Home Assistant.
Quindi iniziamo a scaricare il package dal link sottostante:
https://drive.google.com/file/d/1W9vuJughGcHgxI1zJtXrHv7f65E8j2gL/view?usp=sharing
Ora analizziamo il codice per capire le parti da modificare e capire come funziona il tutto.
input_boolean:
attiva_sveglia:
name: Attiva Sveglia
icon: mdi:alarm
Con questo codice abbiamo creato un input boolean, chiamato Attiva Sveglia, ovvero un interruttore virtuale, che ci permette di attivare o disattivare la sveglia, con tanto di icona.
binary_sensor:
- platform: workday
country: IT
workdays: [mon, tue, wed, thu, fri]
excludes: [sat, sun]
name: Giorni lavorativi Pippo
Binary sensor work day, lo abbiamo già visto nella guida precedente, per la creazione del sensore turni lavorativi, quindi non ha bisogno di tante spiegazioni ma comunque modificate i seguenti campi:
- workdays: [mon, tue, wed, thu, fri] qui inseriremo i giorni lavorativi ( di default sono dal lunedì al venerdì)
excludes: [sat, sun] al contrario in questa stringa sono indicat i giorni di riposo (di default sono sabato e domenica)
name: Giorni lavorativi Pippo ovviamente questo è il nome del sensore e al posto di Pippo dovrete inserire il vostro nome, che andrà successivamente sostituito ogni qual volta incontrate il binary_sensor.giorni_lavorativi, in modo tale da avere binary_sensor.giorni _lavorativi_vostronome
input_datetime:
orario_sveglia:
name: Orario Sveglia
has_date: false
has_time: true
initial: '19:00'
icon: mdi:clock-outline
Input date time, invece, è un integrazione di Home Assistant che ci permette di inserire in maniera grafica l'orario in cui vogliamo svegliarci. Il componente è così composto:
- name: orario_sveglia ovviamente è il nome che abbiamo voluto dare a questo tipo di integrazione per convenzione
- has_time: true invece, indica che l'integrazione ha bisogno che venga inserito un orario e ovviamente deve essere impostato su true.
input_select:
radio_station: # Slezione radio
name: 'Seleziona Stazione Radio:'
options:
- M2O
- RADIO CAPITAL
- RADIO NORBA
- RADIO 80
- RADIO IBIZA
- RADIO CAFE
- KISS KISS NAPOLI
- RADIO MARTE
- KISS KISS
- KISS KISS ITALIA
- RADIO DEEJAY
- RADIO MATER
- Prima Traccia Mp3
- Seconda Traccia Mp3
- Terza Traccia Mp3
- Quarta Traccia Mp3
- Quinta Traccia Mp3
initial: RADIO NORBA
icon: mdi:radio
Con questa integrazione, sempre nativa di Home Assistant, creiamo un selettore che ci permetterà di cambiare le stazioni radio. Infatti:
- name: indica il nome che vogliamo dare al nostro elemento di selezione, nel nostro caso Selezione Stazione Radio o Traccia Mp3
- options: indica le varie opzioni, che possiamo scegliere dal menù a tendina che si crea automaticamente con questa entità
- initial: indica la prima opzione che si avrà di defualt quando riavviamo Home Assistant ( Radio Norba)
- icon: indica l'icona che vogliamo assegnare all'Input Select.
sensor:
- platform: template
sensors:
tradotto:
friendly_name: "tradotto"
value_template: >-
{% if is_state('weather.casa', 'clear-night') %}
una notte serena
{% elif is_state('weather.casa', 'cloudy') %}
cielo nuvoloso
{% elif is_state('weather.casa', 'partlycloudy') %}
cielo parzialmente nuvoloso
{% elif is_state('weather.casa', 'hail') %}
grandine
{% elif is_state('weather.casa', 'rainy') %}
pioggia
{% elif state_attr('weather.casa', 'fog') %}
nebbia
{% elif is_state('weather.casa', 'clear') %}
un cielo sereno
{% elif is_state('weather.casa', 'lightning') %}
eventi temporaleschi
{% elif is_state('weather.casa', 'lightning-rainy') %}
eventi temporaleschi e pioggia
{% elif is_state('weather.casa', 'lightning-rainy') %}
cielo parzialmente nuvoloso
{% elif is_state('weather.casa', 'pouring') %}
pioggia battente
{% elif is_state('weather.casa', 'pouring') %}
neve
{% elif is_state('weather.casa', 'snowy-rainy') %}
nevischio
{% elif is_state('weather.casa', 'sunny') %}
una giornata soleggiata
{% elif is_state('weather.casa', 'windly-variant') %}
una giornata con venti variabili
{% elif is_state('weather.casa', 'exceptional') %}
una giornata eccezionale
{% else %}
failed
{% endif %}
Passiamo alla creazione di un sensore, che legge lo stato della nostra entità meteo e restituisce la stringa tradotta in italiano delle varie condizioni meteo.
- platform: template Essendo un sensore creato da noi ci avvaliamo della piattaforma template (modello) che ci permette di personalizzarlo a nostro piacimento.
- friendly_name: indica il nome che daremo al sensore, in modo tale da rendere il sensore facilmente identificabile tra la ricerca delle entità.
- value_template: indica il valore (nel nostro caso la stringa) che verrà restituita da Home Assistant leggendo lo stato dell'entità meteo.
{% if is_state('weather.casa', 'clear-night') %}
una notte serena
Soffermiamoci un attimo su questa stringa sulla quale dovremo modificare l'entità meteo. Infatti, presupponiamo che abbiate già configurato, un servizio metereologico e che Home Assistant (io consiglio Metereologisk Institutt ) vi abbia creato un entità ad hoc automaticamente. In questa fase, bisogna sostituire la stringa weather.casa con l'entità meteo che abbiamo creato con Home Assistant. Poiché le condizioni meteo sono tutte uguali, indistintamente dal tipo di servizio, non dovremo preoccuparci di altro. Gli stati sono stati tradotti in modo tale che il Google Home li legga in maniera fluida. Quindi il template è da leggere in questo modo:
Se lo stato dell'entità meteo è clear night il sensore restituirà il valore una notte serena.
script:
radio:
sequence:
- service: media_player.play_media
data_template:
entity_id: media_player.camera_da_letto
media_content_id: >
{% if is_state("input_select.radio_station", "M2O") %} http://radiom2o-lh.akamaihd.net/i/RadioM2o_Live_1@42518/master.m3u8
{% elif is_state("input_select.radio_station", "RADIO CAPITAL") %} http://radiocapital-lh.akamaihd.net/i/RadioCapital_Live_1@196312/master.m3u8
{% elif is_state("input_select.radio_station", "RADIO NORBA") %} http://onair11.xdevel.com:9990/;
{% elif is_state("input_select.radio_station", "RADIO 80") %} http://ice04.fluidstream.net/radio80.mp3
{% elif is_state("input_select.radio_station", "RTS 80s 90s TODAY") %} http://hyades.shoutca.st:9113/;
{% elif is_state("input_select.radio_station", "RADIO IBIZA") %} http://wma08.fluidstream.net:8080/ibiza.aac
{% elif is_state("input_select.radio_station", "RADIO CAFE") %} http://onair11.xdevel.com:8000/;
{% elif is_state("input_select.radio_station", "KISS KISS NAPOLI") %} http://ice08.fluidstream.net/KKNapoli.aac
{% elif is_state("input_select.radio_station", "RADIO MARTE") %} http://onair18.xdevel.com:8212/;
{% elif is_state("input_select.radio_station", "KISS KISS") %} http://wma08.fluidstream.net:8080/KissKiss.mp3
{% elif is_state("input_select.radio_station", "KISS KISS ITALIA") %} http://wma07.fluidstream.net:3616/;stream.nsv
{% elif is_state("input_select.radio_station", "RADIO DEEJAY") %} http://radiodeejay-lh.akamaihd.net/i/RadioDeejay_Live_1@189857/master.m3u8
{% elif is_state("input_select.radio_station", "Prima Traccia Mp3") %} /media/music/1.mp3
{% elif is_state("input_select.radio_station", "Seconda Traccia Mp3") %} /media/music/2.mp3
{% elif is_state("input_select.radio_station", "Terza Traccia Mp3") %} /media/music/3.mp3
{% elif is_state("input_select.radio_station", "Quarta Traccia Mp3") %} /media/music/4.mp3
{% elif is_state("input_select.radio_station", "Quinta Traccia Mp3") %} /media/music/5.mp3
{% endif %}
media_content_type: music
Saltiamo un attimo l'automazione finale e vediamo cosa ci preserva lo script.
- service: media_player.play_media è il servizio che Home Assistant usa per poter riprodurre la musica in streaming tramite web radio o file mp3.
- entity_id: è legato al servizio media_player.play_media, infatti qui dovremo sostituire la stringa media_player.camera_da_letto con il nome della nostra entità legata al google home che vogliamo utilizzare per riprodurre la nostra sveglia.
- media_content_id: indica con delle condizioni che se è selezionata una delle opzioni indicate nell'input select sopra citato riproduce o una web radio specificandone l'indirizzo web oppure riproduce uno dei 5 mp3 caricati nella cartella media/music. Gli Mp3 per essere riconosciuti dallo script devono essere chiamati 1.mp3 / 2.mp3 / 3.mp3 / 4.mp3 / 5.mp3
media_content_type: music invece specifica che il tipo di file che deve essere riprodotto è musicale.
automation:
- alias: Attiva Sveglia
trigger:
platform: time
at: input_datetime.orario_sveglia
condition:
- condition: state
entity_id: input_boolean.attiva_sveglia
state: 'on'
- condition: state
entity_id: binary_sensor.giorni_lavorativi_pippo
state: 'on'
action:
- service: media_player.volume_set
entity_id: media_player.camera_da_letto
data:
volume_level: '0.50'
- service: tts.google_say
entity_id: media_player.camera_da_letto
data:
cache: true
Analizziamo la parte finale ma più importante della radio sveglia, ovvero l'automazione. Vediamo brevemente come funziona e cosa modificare anche qui:
- Appena Home Assistant legge l'input_date_time, lo confronta con il sensore di tempo e quando vede che l'orario è identico passa alle condizioni sotto elencate
- Prima Condizione: Controlla che abbiamo attivato la sveglia con l'interruttore input_boolean.attiva_sveglia (attenzione di default l'interruttore è posizionato su off quindi se riavviamo Home Assistant e volete che la vostra sveglia entri in funzione attivare l'interruttore)
- Seconda Condizione: Controlla che la giornata odierna sia un giorno lavorativo tramite il sensore binary_sensor.giorni_lavorativi_pippo (sostituire pippo con il nome che avete dato nella creazione del binary_sensor)
Dopo che queste tre condizioni sono verificate l'automazione passa all'azione
- Impostando il volume del Google Home a 0.50, quindi anche qui sostituire il nome dell'entità del vostro Google Home da far parlare alla voce entity_id
- Pronunciando la frase del buongiorno sostituendo 'Pippo' con il vostro nome,
- Aggiornandovi sulle condizioni meteo della vostra città, infatti qui dovrete sostituire Foggia con il nome della città in cui risiedete o il nome della Città che avete impostato nel servizio meteorologico
- Inoltre, il servizio vi indicherà anche la temperatura e l'umidità della vostra Città.Per fare ciò sostituite alla voce weather.casa con l'entità del vostro servizio metereologico.
- delay: 00:00:16 indica che l'automazione attende 16 secondi, che è più o meno il tempo necessario per completare la frase del buongiorno con le informazioni meteo.
- Infine dopo aver letto la frase passerà allo script della radio che ci farà ascoltare o la nostra web radio precedentemente selezionata, o il nostro File Mp3
Ovviamente nel package trovate accanto alle stringhe o alle entità da sostituire dei commenti per facilitare l'operato. Vi ricordo che per stoppare la radiosveglia in qualsiasi momento potrete dire semplicemente a Google:
"Ehi Google, stop Musica"
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.