Home Assistant - effetto alba tramonto per acquari con script Python

Home Assistant - effetto alba tramonto per acquari con script Python

di Luigi Duchi

25 Maggio 2022

Home Assistant Guide

Luigi Duchi

L'articolo di oggi entra a pieno diritto nella saga delle guide di Home Assistant. 

In realtà è un passaggio non proprio fondamentale ma ho approfittato della richiesta di aiuto di un utente per scrivere una guida.

Parleremo degli Script Python e della loro integrazione in Home Assistant.

In realtà Home Assistant è perfettamente compatibile con l'utilizzo degli script scritti in Python, vanno semplicemente abilitati, vedremo a breve come.

Prima di dedicarmi alla guida vera e propria vi spiego la motivazione che mi ha spinto a scrivere questo articolo.

Prima di dedicarmi a tempo pieno al mondo della domotica, sono stato un grande appassionato di acquariologia, nello specifico ero un grande amante di Plantacquari, quelle vasche colme di piante che affascinano chiunque si fermi ad osservarle. Nel corso dell'articolo vi presenterò alcune delle vasche da me allestite...(non con un po' di nostalgia)

vasca 100 cm

Il mondo dei plantacquari non è sicuramente un Hobby per persone con poca pazienza, precisione matematica nel controllo dei valori dell'acqua ed eventuale correzione con protocollo di fertilizzazione completo. Un precario equilibrio che si bilancia con pazienza e conoscenza degli elementi chimici che si buttano nell'acqua, una forte illuminazione accompagnata da erogazione di co2... insomma niente per sani di mente, ma in fondo, vi sembro normale?

dettaglio piante

No vero?

acquario juwel

all'epoca i dispositivi smart non erano cosi sviluppati come oggi, tuttavia la mia passione per la domotica era già avviata e quindi avevo automatizzato praticamente tutto.

restyling cubo 60x60

Quando si parla di acquariologia a questi livelli si parla di soldi spesi, tanti, e ogni 3 giorni potature su potature insomma, un lavoro che con il tempo mi ha fatto desistere. 

vista dall'alto 2

Porto sempre nel cuore le fantastiche persone che ho conosciuto e le esperienze fatte.

cubo 60x60

Ma torniamo al focus dell'articolo, direte voi "cosa c'entra l'acquariologia con l'articolo di oggi e soprattutto con Home Assistant?"

All'epoca come vi dicevo i dispositivi smart non erano cosi diffusi come adesso, tuttavia c'erano molte persone che si cimentavano per creare un effetto "alba tramonto" per le proprie vasche.

Di solito si poteva impostare un orario di accensione e un orario di spegnimento per le lampade.

Tuttavia le lampade si accendevano alla massima intensità al momento del raggiungimento dell'orario prestabilito effetto che, oltre a spaventare gli ospiti della vasca, rendevano abbastanza sgradevole l'effetto, soprattutto se come me sparavate 1 watt a litro (calcolando che le mie vasche erano dai 200 ai 250 litri l'una, fortunatamente non tutte allestite contemporaneamente altrimenti mi ci sarebbe voluta una centrale nucleare in salotto).

Il fai da te all'epoca era poco sfruttato e comunque non erano alla portata di tutti come oggi, con le varie tecnologie per creare centraline "alba tramonto" e si incappava nell'acquisto di costose centraline pre-assemblate.

vasca 120 cm

Oggi grazie ad uno script in python potremo ottenere l'effetto di transizione crescente dell'intensità di una lampada al momento dell'accensione della stessa e al contrario potremo avere uno spegnimento graduale all'orario stabilito.

Ci faremo poi aiutare da alcune automazioni, non vi preoccupate scriverò tutto il codice all'interno dell'articolo.

vista dall'alto

Dopo questa lunghissima introduzione passiamo con i passaggi veri e propri della guida.

Avviate File editor sul vostro Home Assistant. Do per scontato che, arrivati a questo punto delle guide su Home Assistant, abbiate installato file editor, nel caso contrario vi rimando alle precedenti guide che potete trovare su questa playlist YouTube (per ogni video c'è il relativo articolo sul Blog QUI.)

Aprite il file configuration.yaml

Dovrete andare ad aggiungere la voce python_script:

come nella foto di esempio

python script

Successivamente salvate il file configuration.yaml con l'apposito pulsante rosso in alto a destra

tasto salva

Sempre da File editor andate a creare una nuova cartella premendo il pulsante in alto (quello che nella foto trovate cerchiato di rosso).

cartella python scripts

La cartella creata la dovrete chiamare appunto python_scripts

Successivamente riavviate Home Assistant.

(vi ricordo che con gli ultimi aggiornamenti il pulsante per riavviare è in strumenti per sviluppatori->YAML)

Al riavvio potrete finalmente andare ad inserire gli script python nella cartella precedentemente creata. Raggiungete la cartella python_scripts sempre con l'ausilio di file editor e apritela 

dentro la cartella

Create un nuovo file premendo l'apposito pulsante (circondato nella foto in alto) questo file chiamatelo:

fade_in_light.py

Questo sarà lo script necessario ad avere l'effetto di luminosità crescente.

Aprite il file appena creato e copiate questo codice.

entity_id  = data.get('entity_id')
sleep_delay = int(data.get('delay_in_sec'))
start_level_pct = int(data.get('start_level_pct'))
end_level_pct = int(data.get('end_level_pct'))
step_pct  = int(data.get('step_in_level_pct'))

start_level = int(255*start_level_pct/100)
end_level = int(255*end_level_pct/100)
step = int(255*step_pct/100)

new_level = start_level
while new_level < end_level :
        states = hass.states.get(entity_id)
        current_level = states.attributes.get('brightness') or 0
        if (current_level > new_level) :
                logger.info('Exiting fade in - light already on')
                break;
        else :
                logger.info('Setting brightness of ' + str(entity_id) + ' from ' + str(current_level) + ' to ' + str(new_level))
                data = { "entity_id" : entity_id, "brightness" : new_level }
                hass.services.call('light', 'turn_on', data)
                new_level = new_level + step
                time.sleep(sleep_delay)

data = { "entity_id" : entity_id, "brightness" : end_level }
hass.services.call('light', 'turn_on', data)

salvate e andate a creare un nuovo file.

Questa volta lo dovrete chiamare:

fade_out_light.py

dentro questo invece dovrete copiare questo codice:

entity_id  = data.get('entity_id')
sleep_delay = int(data.get('delay_in_sec'))
start_level_pct = int(data.get('start_level_pct'))
end_level_pct = int(data.get('end_level_pct'))
step_pct  = int(data.get('step_in_level_pct'))

start_level = int(255*start_level_pct/100)
end_level = int(255*end_level_pct/100)
step = int(255*step_pct/100)

new_level = start_level
while new_level >= end_level :
        states = hass.states.get(entity_id)
        current_level = states.attributes.get('brightness') or 0
        if (current_level < new_level) :
                logger.info('Exiting fade out - light already dimmed')
                break;
        else :
                logger.info('Setting brightness of ' + str(entity_id) + ' from ' + str(current_level) + ' to ' + str(new_level))
                data = { "entity_id" : entity_id, "brightness" : new_level }
                hass.services.call('light', 'turn_on', data)
                new_level = new_level - step
                time.sleep(sleep_delay)

data = { "entity_id" : entity_id, "brightness" : end_level }
hass.services.call('light', 'turn_on', data)

anche in questo caso salvate.

Adesso dovrete riavviare nuovamente Home Assistant.

Al riavvio potrete aggiungere questo Package (anche in questo caso vi esorto a seguire la guida dove abbiamo parlato dei package per capire cosa sono e come funzionano).

Aprite dal file editor la cartella packages.

Andate a creare un nuovo file e chiamatelo come volete con estensione .yaml ad esempio albatramonto.yaml

Aprite il file dentro copiate questo codice:

#######################################input_datetime############################
input_datetime:
    crescente:
     name: Crescente
     has_date: true
     has_time: true
    decrescente:
     name: Decrescente
     has_date: true
     has_time: true
######################################automation#################################
automation:
  - alias: crescente
    trigger:
    - platform: template
      value_template: '{{ now().strftime("%H:%M:00") == (states.input_datetime.crescente.state)}}'
    action:
    - service: python_script.fade_in_light
      data:
        entity_id: light.luce_portico
        delay_in_sec: 1
        start_level_pct: 0
        end_level_pct: 100
        step_in_level_pct: 2

  - alias: decrescente
    trigger:
    - platform: template
      value_template: '{{ now().strftime("%H:%M:00") == (states.input_datetime.decrescente.state)}}'
    action:
    - service: python_script.fade_out_light
      data:
        entity_id: light.luce_portico
        delay_in_sec: 1
        start_level_pct: 100
        end_level_pct: 0
        step_in_level_pct: 2

Andiamo ad analizzare questo package.

Come prima cosa ho creato degli input_datetime con questi 2 sarà possibile selezionare la data e l'ora alla quale far partire lo script python.

Nel caso non siate interessati ad avere la data ma solo l'orario sostituite la voce true con la voce false dopo la voce has_date:

le due automazioni sotto sono molto semplici.

La prima andrà ad utilizzare come trigger il valore template dello stato del input_datetime.crescente ovvero avvierà l'automazione al valore che avete impostato sul datetime 

datetime

Nell'esempio il 18/05/2022 alle 20:00 in punto. 

Come azione farà avviare lo script python che si occuperà di far salire la luce gradualmente. Quello che avete chiamato fade_in_light.py.

Le uniche cose che dovrete impostare sono queste:

L'entità che vorrete utilizzare, nel mio caso light.luce_portico (nello specifico è uno shelly dimmer2)

Il delay_in_sec ovvero il tempo che dovrà passare tra una transizione e l'altra nel mio caso ho impostato un secondo 

Lo start_level_pct ovvero la percentuale di luminosità all'inizio dello script nel mio caso 0 

L' end_level_pct che come è facile intuire è la percentuale di luminosità finale che nel mio caso è 100 (ovvero il massimo).

Infine dovrete selezionare step_in_level_pct ovvero la percentuale che dovrà incrementare ogni step compiuto (che nel mio caso è ogni secondo) nell'esempio ho messo 2.

L'altra automazione farà l'esatto opposto ovvero porterà dal 100% allo 0% eseguendo l'altro script python al momento del valore impostato su input_datetime.decrescente.

Vi lascio adesso al video di fine articolo dove vi mostrerò con esempi pratici cosa intendo realizzare con questa guida.

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

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.

Disqus loading...