SCOPI DEL PROGETTO:
CONCETTI AFFRONTATI:
|
COMPONENTI SOFTWARE UTILIZZATE:
COMPONENTI FISICI UTILIZZATI:
|
PROGETTO INDICATO a UTENTI CON ISTALLAZIONE:![]() |
|
NOTE E DISCLAIMER
|
|
Revisione progetto: 1.3 |
Abstract
Uno dei chiari vantaggi nel rendere “smart” l’illuminazione domestica è certamente quello di poterne regolare, in determinati casi, l’intensità di emissione luminosa (in altri persino il colore e/o il punto di bianco), non tanto manualmente (quello si poteva fare da decenni grazie ai più disparati dimmer tradizionali) quanto via smartphone/tablet oppure, ancor meglio, in modo automatico.
Alcuni ecosistemi domotici dedicati all’illuminazione offrono di fabbrica una serie di automatismi dedicati al comportamento “intelligente” delle proprie luci (si pensi alla linea Philips Hue, con le sue funzionalità Hue Sync e con il suo Sync Box per la TV), ma ciò che raramente abbiamo trovato disponibile è la capacità di regolare automaticamente la luminosità dell’ambiente in base all’illuminazione naturale presente nello stesso.
Home Assistant, come spesso capita, ci viene in soccorso.
Innanzitutto, la sua natura di HUB personale software consente di far cooperare sotto lo stesso tetto diversi ecosistemi e componenti di diversa natura: va da sé che in casa l’utente possa infatti essersi dotato di punti luce nativamente domotici (come per esempio le Philips Hue di cui sopra), piuttosto che aver “domotizzato” dei punti luce pre-esistenti tramite degli interruttori intelligenti.
Bene: quale sia la natura dei punti luce in questione, laddove essi siano regolabili in intensità via domotica e siano integrabili con Home Assistant (le integrazioni possibili legate al componente “Light” sono queste), è possibile realizzare delle automazioni elementari tali da regolarne in modo del tutto automatico l’emissione in base a quanta luce c’è nell’ambiente. Ovviamente, oltre alla presenza di entità di tipo “Light” sarà necessaria la presenza di una o più entità “Sensor” che riportino, espressa in lux, la quantità di luce presente (approfondito in seguito).
Si parte
Assunti
Per la realizzazione di questo progetto si assume che:
- si abbia una minima dimestichezza con Home Assistant e con le sue entità, le sue automazioni e le sue logiche di funzionamento;
- si siano già implementati dei “Device Tracker” i quali siano raggruppati nel gruppo group.famiglia utilizzato dal progetto per evitare l’innesco dell’automazione in assenza degli inquilini (opzionale);
- si sia dotati di almeno una luce integrata, in un modo o nell’altro (basta che risulti un’entità “Light” regolabile) all’HUB;
- si sia dotati di almeno una sensore di luminosità integrato, in un modo o nell’altro, all’HUB.
Assumeremo quindi la presenza di una entità “Light” chiamata light.sala e un sensore di luminosità (i test li abbiamo fatto integrando un sensore di movimento LUMI/Xiaomi – dotato a bordo anche di un sensore di luminosità – integrato su Home Assistant via deCONZ) chiamato sensor.luminosita.
Il progetto è ovviamente adattabile a qualunque situazione personale.
Approccio
Una doverosa premessa: tutto ciò che viene riportato in questo progetto è frutto dell’analisi e della realizzazione rispetto a uno specifico ambiente, ovvero il laboratorio inDomus; è necessario pertanto fare la “tara” sulla propria realtà domestica/operativa. |
Il livello di illuminazione di una entità “Light” di Home Assistant (se l’entità lo prevede) è regolabile o in step percentili (da 0 a 100%) o in step in una scala da 0 a 255; per farlo si utilizza il servizio “light.turn_on” il quale, come parametro, accetta appunto le chiavi “brightness_pct” (percentuale) o “brightness” (intero da 0 a 255) – ovviamente o una, o l’altra. Impostare la “brightness” a 255 equivale a regolarla a 100 con “brightness_pct“.
Un sensore di luminosità solitamente fornisce letture espresse in lux con valori da 0 a x, dove x (il limite percepibile alto) varia da sensore a sensore. Nel caso dell’esempio di questo progetto (il sensore LUMI/Xiaomi), il limite alto è 935 lux. In realtà la luminosità in casa è spesse sensibilmente inferiore, anche in giornate molto luminose: già oltre i 300 lux l’occhio umano percepisce un ambiente sufficientemente luminoso. Utilizzeremo quindi 300 lux quale soglia logica per i nostri ragionamenti.
Questo progetto quindi realizzerà un’automazione la quale, in base al valore rilevato dal sensore di luminosità, regoli l’entità “Light” in modo appropriato utilizzando la percentuale d’emissione (ma ovviamente nulla vieta di usare l’altro metodo con valore intero 0-255).
Per farlo utilizzeremo due semplicissimi modelli – ma perché due? Semplice: perché quello da adottare cambia in base al comportamento che ci si aspetta, esso sia “ambientale” o “funzionale”.
Per modello “ambientale” si intende la tendenza del punto luce nell’essere tanto più acceso intensamente tanto più l’ambiente è illuminato (per esempio quando si usano punti luce “estetici” come le Nanoleaf); il comportamento “funzionale” invece è il contrario, con un punto luce tanto più acceso intensamente tanto più l’ambiente è buio.
Quindi:
- modello “ambientale”: con 0 lux rilevati, regola la percentuale di illuminazione è 0%; con 300 lux (o più), al 100%;
- modello “funzionale”: con 0 lux rilevati, regola la percentuale di illuminazione è 100%; con 300 lux (o più), a 0%;
In sostanza, le due proporzioni (rispettivamente ambientale e funzionale) che utilizzeremo sono:
0%:100% = 0lux:300lux
100%:0% = 0lux:300lux
Automazione
Scrivere l’automazione, capito l’approccio, è davvero elementare. Utilizza – indipendentemente dal modello scelto – un trigger comune, multiplo, che si inneschi sulle variazioni di stato delle , un blocco condition, comune, che verifichi appunto delle condizioni e infine un blocco action che invece varia – minimamente – in base al modello scelto.
TRIGGER
Il trigger è il seguente:
trigger: - platform: state entity_id: sensor.luminosita, light.sala
si spiega da sé: qualsiasi variazione nello stato di una delle due entità sensor.luminosita e light.sala innescherà l’automazione.
CONDITION
La condition serve a interrompere l’esecuzione dell’automazione qualora le condizioni indicate al suo interno non siano rispettate. Vogliamo che l’automazione – quindi la regolazione della luminosità contenta nel seguente blocco action – avvenga solo se:
- siamo a casa e
-
- la luce viene manualmente accesa oppure
- oppure varia l’illuminazione domestica e il punto luce è acceso.
Il codice sarà quindi:
condition: - condition: and conditions: - condition: state entity_id: group.awesome_people state: 'home' - condition: or conditions: - condition: template value_template: "{{ (trigger.entity_id == 'light.sala') and (trigger.from_state.state == 'off') }}" - condition: template value_template: "{{ (trigger.entity_id == 'sensor.luminosita') and (states.light.sala.state == 'on') }}"
La prima condizione verificata è semplice: essere a casa, ovvero che il gruppo group.awesome_people abbia stato “home“. La condizione viene poi verificata in AND con due condizioni in OR tra di loro:
- la prima, che sia stata accesa l’entità light.sala;
- la seconda, che sia variato lo stato del sensore sensor.luminosità mentre la luce light.sala era accesa.
ACTION
Pe quanto riguarda infine il blocco action, quello relativo al modello “ambientale” è questo
action: service: light.turn_on data: entity_id: light.sala brightness_pct: "{{ (((((states.sensor.luminosita.state | int(default=1) * (100/300)) - 100)-((states.sensor.luminosita.state * (100/300)) - 100)|abs)/2)+100) | int(default=0) }}"
mentre per il modello “funzionale” è questo:
action: service: light.turn_on data: entity_id: light.sala brightness_pct: "{{ ((((states.sensor.luminosita.state | int(default=1) * (100/300)) - 100)|abs-((states.sensor.luminosita.state * (100/300)) - 100))/2) | int(default=0) }}"
N.b. Il calcolo utilizza la funzione abs, ovvero quella per il calcolo del valore assoluto. In pratica se il calcolo supera 100, il valore in uscita viene sempre forzato a 100. Si tratta di una soluzione elegante che evita di utilizzare altrimenti un blocco if. |
AUTOMAZIONE COMPETA
L’automazione pertanto è la seguente (varia solo l’ultima riga)
automation: - alias: "Auto regolazione punto luce" trigger: - platform: state entity_id: sensor.luminosita, light.sala condition: - condition: and conditions: - condition: state entity_id: group.awesome_people state: 'home' - condition: or conditions: - condition: template value_template: "{{ (trigger.entity_id == 'light.sala') and (trigger.from_state.state == 'off') }}" - condition: template value_template: "{{ (trigger.entity_id == 'sensor.luminosita') and (states.light.sala.state == 'on') }}" action: service: light.turn_on data: entity_id: light.sala brightness_pct: #completare l'ultima riga in base al modello di comportamento atteso.
Considerazioni finali
OFFSET
Potrebbe essere necessario introdurre un offset per consentire al punto luce, per esempio, di non spegnersi mai. Per far ciò è possibile utilizzare una strategia semplice: addizionare una percentuale prefissata al valore. Facciamo un esempio con un offset del 20% applicato al modello “ambientale”:
brightness_pct: "{{ (((((states.sensor.luminosita.state | int(default=1) * (100/300)) - 80)-((states.sensor.luminosita.state * (100/300)) - 80)|abs)/2)+100) | int(default=0) }}"
Abbiamo modificato i parametri, decurtando 20 ai due valori “-100” presenti in funzione, così che ritorni un valore assoluto minimo di 20.
SENSORE
Per quanto riguarda il sensore, cruciale è il posizionamento nell’ambiente: ricordarsi di posizionarlo lontano dalle finestre e possibilmente lontano dai punti luce elettrici: per quanto la loro emissione sia limitata, potrebbero influenzare l’automazione realizzata.
GRUPPI DI LUCI
A partire dalla versione 0.104 di Home Assistant è stato abolito il gruppo group_all.lights; alternativamente, se si vuole accendere tutte le luci in blocco è possibile chiamare il servizio light.turn_on e indicare, come entity_id, il nome all. Questo viene comodo qualora si volessero controllare tutte le luci con l’automazione sopra descritta.
⚠️ Se di Home Assistant ne sai poco ma sei interessato a capirne di più, ti suggeriamo di partire da qui. |
Questa pagina è redatta, manutenuta e aggiornata dallo staff di inDomus, un gruppo di persone molto diverse tra loro che trovi, per domande e supporto, sul forum e sulla chat del sito. Se ti sei perso, a tua disposizione c'è la mappa. |