Regolare automaticamente la luminosità negli ambienti tramite Home Assistant

6 minuti di lettura
SCOPI DEL PROGETTO:
  • Definire con Home Assistant un automatismo che provveda alla regolazione dinamica delle luci presenti in casa (domotiche o domotizzare tramite attuatori dimmer) in base all’effettiva quantità di luce presente
  • Livello di difficoltà: medio/bassa
  • Costo: n.a.
CONCETTI AFFRONTATI:
  • Configurazione software
COMPONENTI SOFTWARE UTILIZZATE:
COMPONENTI FISICI UTILIZZATI:
PROGETTO MAGGIORMENTE INDICATO PER:

Tutti gli ambienti

Note e disclaimer
  • qualsiasi eventuale modifica agli impianti domestici dev'essere progettata ed realizzata SOLO da personale qualificato;
  • qualsiasi modifica attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (i contenuti della presenta pagina hanno puro scopo didattico);
  • qualsiasi modifica attuata in proprio a un dispositivo ne fa decadere garanzia, omologazioni e certificazioni di qualità.
Revisione progetto: 1.0

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.

Home Assistant - Dimmer

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).

N.b. Altri progetti su inDomus a tema illuminotecnica & Home Assistant sono i seguenti:

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 – 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), 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_template:
      entity_id: light.sala
      brightness_pct: "{{ (((((states.sensor.luminosita.state * (100/300)) - 100)-((states.sensor.luminosita.state * (100/300)) - 100)|abs)/2)+100)|int }}"

mentre per il modello “funzionale” è questo:

  action:
    service: light.turn_on
    data_template:
      entity_id: light.sala
      brightness_pct: "{{ ((((states.sensor.luminosita.state * (100/300)) - 100)|abs-((states.sensor.luminosita.state * (100/300)) - 100))/2)|int }}"
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_template:
        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 * (100/300)) - 80)-((states.sensor.luminosita.state * (100/300)) - 80)|abs)/2)+100)|int }}"

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.


Home Assistant Official Logo ATTENZIONE: ricorda che sul nostro community FORUM c'è una sezione ad hoc dedica a Home Assistant, per qualsiasi dubbio, domanda, informazione nel merito specifico di queste componenti.


Telegram News Channel