Una delle automazioni più richieste da chi approda nel mondo della domotica è l’accensione di una fonte luminosa alla rilevazione di un movimento.
Questa tipologia di automazioni può sembrare semplice, ma se costruite con criterio possono presentare diverse complicazioni.
In questo articolo vedremo come crearne una semplice, ben strutturata ed adatta a tutte le esigenze sfruttando la piattaforma Home Assistant.
Sommario
Gli elementi
Per testare questa automazione ho sfruttato un sensore di movimento da esterni Philips HUE (Comunicante tramite protocollo ZigBee con il relativo bridge) gestendolo in Home Assistant tramite l’integrazione ufficiale.
Una funzione molto utile di questo sensore è che, tramite l’applicazione ufficiale, è possibile configurarne la sensibilità.
Per acquistare i dispositivi testati:
L’automazione funziona perfettamente anche con la variante per interni, oppure può essere sfruttato un qualsiasi sensore di movimento compatibile con Home Assistant.
Questo sensore include al suo interno:
- Un sensore di movimento (PIR);
- Un sensore di luminosità (Crepuscolare);
- Un sensore di temperatura.
Le entità che sfrutteremo per innescare l’automazione sono:
- Uno switch: switch.luce_balcone (necessario);
- Un sensore binario: binary_sensor.movimento_balcone (necessario);
- Un sensore: sensor.luminosita_balcone (opzionale).
Materiale necessario
Per eseguire questa automazione è necessario aver strutturato il proprio sistema per la gestione dei packages come indicato in questo articolo.
Una volta predisposto il sistema, scarichiamo questo pacchetto contenente il materiale che utilizzeremo nei vari passaggi:
La logica
Ipotizziamo di voler far accendere e spegnere automaticamente la luce del nostro balcone tramite il sensore di movimento, l’automazione sembra piuttosto semplice:
Quando il sensore di movimento sì attiva (occupato), accendiamo l’interruttore della fonte luminosa… quando il sensore sì disattiva (disoccupato), spegniamo l’interruttore della fonte luminosa.
Realizzata in questo modo, a mio parere, ci sono svariate situazioni non considerate:
- Dopo l’accensione della luce questa deve automaticamente spegnersi con la disoccupazione del sensore, ma solo dopo un determinato tempo trascorso;
- Sul balcone potrebbe esserci del movimento non umano rilevato dal sensore, che innescherebbe l’automazione in situazioni non idonee;
- Durante il giorno l’illuminazione solare potrebbe non richiedere l’accensione di una fonte luminosa artificiale;
- La volontà di non far accendere l’illuminazione nel caso il sensore venga occupato per breve tempo;
- L’illuminazione non deve spegnersi automaticamente dopo aver disoccupato il sensore di movimento, nel caso fosse stata accesa manualmente.
L'automazione
Compresa la logica è necessario come prima cosa definire gli elementi che gestiranno la nostra automazione.
Attenzione: L’automazione è progettata per poter gestire multiple zone duplicando ogni sezione identificabile dal divisore “# Balcone”, rinominando e definendo gli elementi correlati. Aggiungere all’automazione di “Reset Stato” gli input boolean di zona creati.
Definiamo quindi:
- 4 Input Boolean:
- lights_automations_general_motion: Disattiva completamente l’automazione (tutte le zone);
- lights_automations_balcone_light_motion: Disattiva solo la specifica zona;
- lights_automations_balcone_lux_motion: Gestisce la valutazione della luminosità;
- lights_automations_balcone_status_motion: Salva lo stato di avvenuto innesco.
- 3 Input Number:
- lights_automations_delay_light_balcone_motion: Definisce il ritardo di accensione;
- lights_automations_duration_balcone_motion: Definisce la durata di accensione;
- lights_automations_lux_balcone_motion: Definisce il limite di lux (massimo) per la valutazione della luminosità.
# Inputs
input_boolean:
# Movimento
# Generico
lights_automations_general_motion:
name: 'Movimento'
icon: mdi:motion-sensor
# Balcone
lights_automations_balcone_light_motion:
name: 'Balcone'
icon: mdi:flower-tulip
lights_automations_balcone_lux_motion:
name: 'Valutazione Luminosità'
icon: mdi:brightness-6
lights_automations_balcone_status_motion:
name: 'Stato Movimento Balcone'
icon: mdi:check-box-outline
initial: false
# -------------------------------------------------------------------------------------------------------------------
input_number:
# Movimento
# Balcone
lights_automations_delay_light_balcone_motion:
name: 'Ritardo Illuminazione'
icon: mdi:clock-alert-outline
min: 0
max: 120
step: 1
unit_of_measurement: 'secondi'
lights_automations_duration_balcone_motion:
name: 'Durata Illuminazione'
icon: mdi:timelapse
min: 1
max: 60
step: 1
unit_of_measurement: 'minuti'
lights_automations_lux_balcone_motion:
name: 'Limite Luminosità'
icon: mdi:brightness-6
min: 0
max: 200
step: 1
unit_of_measurement: 'lx'
# -------------------------------------------------------------------------------------------------------------------
Definiti gli elementi di controllo passiamo all’automazione vera e propria, ed è molto importante analizzare prima di tutto le condizioni “trasversali” ad essa.
Precedentemente abbiamo creato un interruttore virtuale chiamato “Stato Movimento Balcone” che salverà in memoria quando la luce è stata accesa tramite l’automazione, e non da altri fattori (ad esempio l’accensione manuale).
Poiché abbiamo creato degli elementi di gestione, ipotizziamo che la luce venga attivata tramite l’automazione e prima che passi il tempo di durata impostato questa venga spenta manualmente o che l’automazione venga disabilitata, in questi casi lo stato salvato necessita un azzeramento per non rimanere inutilmente in memoria e generare possibili conflitti.
Tenere presente che lo stato viene automaticamente azzerato all’avvio grazie alla chiave “initial” impostata su “false”.
# Automations
automation:
# Movimento
# Balcone
- alias: 'Lights Automations - Movimento Balcone Reset Stato'
initial_state: true
mode: single
max_exceeded: silent
trigger:
- platform: state
entity_id:
- input_boolean.lights_automations_general_motion
- input_boolean.lights_automations_balcone_light_motion
- switch.luce_balcone
to: 'off'
action:
- service: input_boolean.turn_off
entity_id: input_boolean.lights_automations_balcone_status_motion
Passiamo ora all’accensione.
I trigger:
L’elemento di trigger è ovviamente il nostro sensore di movimento (sensore binario), che quando verrà occupato passando allo stato di “on” attenderà i secondi impostati tramite il selettore “Ritardo illuminazione” prima di valutare le condizioni per l’effettiva accensione.
Questo ritardo permette di tarare con precisione dopo quanto tempo che il sensore risulti occupato la luce sì debba accendere evitando che movimenti sporadici o brevi occupazioni l’accendino immediatamente. Per ottimizzare ulteriormente questa taratura è consigliato configurare anche la sensibilità del sensore (se disponibile).
Le condizioni:
Le prime 3 condizioni valutano lo stato degli elementi di controllo, quindi l’automazione accenderà la luce solo se l’interruttore generale “Movimento” e quello di zona “Balcone” risultino attivi, e soltanto nel caso in cui l’automazione non sia già stata innescata in precedenza.
La quarta condizione è invece un template che analizza l’intensità luminosa, ma soltanto nel caso in cui la “Valutazione Luminosità” sia attiva (in caso contrario questa verrà ignorata rendendo il sensore di luminosità opzionale). Per consentire l’accensione della luce, la luminosità rilevata deve essere inferiore al valore impostato tramite il selettore “Limite Luminosità”.
Come ultima condizione lo stato della luce, che verrà accesa solo nel caso questa risulti spenta, evitando che l’automazione prosegua nel caso in cui la luce fosse stata accesa manualmente in precedenza.
Le azioni:
Nel caso in cui tutte le condizioni vengano soddisfatte la luce verrà accesa e contemporaneamente salvato in memoria lo stato relativo al completamento.
- alias: 'Lights Automations - Movimento Balcone Accensione Luce'
initial_state: true
mode: single
max_exceeded: silent
trigger:
- platform: state
entity_id: binary_sensor.movimento_balcone
to: 'on'
for:
seconds: '{{ states("input_number.lights_automations_delay_light_balcone_motion") | int }}'
condition:
- condition: state
entity_id: input_boolean.lights_automations_general_motion
state: 'on'
- condition: state
entity_id: input_boolean.lights_automations_balcone_light_motion
state: 'on'
- condition: state
entity_id: input_boolean.lights_automations_balcone_status_motion
state: 'off'
- condition: template
value_template: >-
{% if is_state("input_boolean.lights_automations_balcone_lux_motion", "on") %}
{% if (states("sensor.luminosita_balcone") | int) <= (states("input_number.lights_automations_lux_balcone_motion") | int) %}
true
{% else %}
false
{% endif %}
{% elif is_state("input_boolean.lights_automations_balcone_lux_motion", "off") %}
true
{% else %}
false
{% endif %}
- condition: state
entity_id: switch.luce_balcone
state: 'off'
action:
- service: switch.turn_on
entity_id: switch.luce_balcone
- service: input_boolean.turn_on
entity_id: input_boolean.lights_automations_balcone_status_motion
Per lo spegnimento viene applicata la stessa logica, ma invertita.
Lo spegnimento viene eseguito appena raggiunto il tempo impostato con il selettore “Durata Illuminazione”, ma solo nel caso in cui l’elemento “Stato Movimento Balcone” risulti attivo.
Se le condizioni vengono soddisfatte lo stato verrà azzerato e solo nel caso in cui la luce risulti accesa, verrà spenta.
Notare come in questo caso la condizione sia posizionata all’interno dell’azione per non bloccare l’azzeramento dello stato salvato nel caso in cui l’automazione venga innescata ma la luce risulti spenta. Nonostante questa sia una situazione estrema, così facendo sì possono evitare malfunzionamenti in circostanze ambigue.
- alias: 'Lights Automations - Movimento Balcone Spegnimento Luce'
initial_state: true
mode: single
max_exceeded: silent
trigger:
- platform: state
entity_id: binary_sensor.movimento_balcone
to: 'off'
for:
minutes: '{{ states("input_number.lights_automations_duration_balcone_motion") | int }}'
condition:
- condition: state
entity_id: input_boolean.lights_automations_general_motion
state: 'on'
- condition: state
entity_id: input_boolean.lights_automations_balcone_light_motion
state: 'on'
- condition: state
entity_id: input_boolean.lights_automations_balcone_status_motion
state: 'on'
action:
- service: input_boolean.turn_off
entity_id: input_boolean.lights_automations_balcone_status_motion
- condition: state
entity_id: switch.luce_balcone
state: 'on'
- service: switch.turn_off
entity_id: switch.luce_balcone
# -------------------------------------------------------------------------------------------------------------------
L'interfaccia utente
Per gestire da interfaccia l’automazione, creare delle card entità utilizzando il seguente codice:
type: entities
title: Illuminazione Automatica
show_header_toggle: false
entities:
- entity: input_boolean.lights_automations_general_motion
- entity: input_boolean.lights_automations_balcone_light_motion
- entity: input_boolean.lights_automations_balcone_lux_motion
- entity: input_number.lights_automations_delay_light_balcone_motion
- entity: input_number.lights_automations_duration_balcone_motion
- entity: input_number.lights_automations_lux_balcone_motion
type: entities
title: Elementi
show_header_toggle: false
entities:
- entity: binary_sensor.movimento_balcone
- entity: sensor.luminosita_balcone
- entity: switch.luce_balcone
Quindi impostare i valori secondo le proprie preferenze:
Ausili alla creazione
Nel caso vogliate testare l’automazione senza possedere ancora fisicamente il sensore, potete sfruttare il file “fake_items_test.yaml” fornito e creare una card:
type: entities
title: Ausili Creazione Automazione
show_header_toggle: false
entities:
- entity: input_select.fake_items_test_value_1
- entity: input_select.fake_items_test_value_2
- entity: input_text.fake_items_test_value_3
Impostare i valori manualmente per forzarne lo stato degli elementi e verificare il funzionamento dell’automazione:
Conclusione
Come abbiamo avuto modo di vedere, seppure possa sembrare un’automazione banale, se sì cerca di rendere configurabile e di gestire tutte le condizioni possibili per evitare malfunzionamenti, anche questo genere di automazioni può avere delle complicazioni da non sottovalutare.
20 commenti
Ciao, molto interessante questo post e cercavo proprio una cosa del genere, per far si che una luce accesa manualmente non si spegnesse con l’automazione.
E’ ancora valido o con l’evoluzione di HA ci sono metodi più semplici/veloci?
Io nel mentre ho scaricato il file e modificato i nomi e le entità (switch, sensore di movimento etc) ma poi questo file dove lo devo inserire? dentro la cartella homeassistant\packages è giusto? perchè quando vado a fare la verifica prima di fare un riavvio mi restituisce un errore.
Grazie mille
Ciao, si è ancora attuale e va nei packsges. Non so se c’è qualcosa nel codice che oggi vuole modifiche, ma sicuramente nel log di controllo ti dirà perché. Se non ci salti fuori prova a indicare cosa ti dice.
Ciao, ho seguito la tua guida adattandola alla mia situazione ma non funziona, non riesco a capire cosa ho sbagliato.
Potresti aiutarmi?
Grazie mille
# Inputs
input_boolean:
# Movimento
# Generico
lights_automations_general_motion:
name: ‘Movimento’
icon: mdi:motion-sensor
# BagnoCamera
lights_automations_BagnoCamera_light_motion:
name: ‘BagnoCamera’
icon: mdi:flower-tulip
lights_automations_BagnoCamera_lux_motion:
name: ‘Valutazione Luminosità’
icon: mdi:brightness-6
lights_automations_BagnoCamera_status_motion:
name: ‘Stato Movimento BagnoCamera’
icon: mdi:check-box-outline
initial: false
# ——————————————————————————————————————-
input_number:
# Movimento
# BagnoCamera
lights_automations_delay_light_BagnoCamera_motion:
name: ‘Ritardo Illuminazione’
icon: mdi:clock-alert-outline
min: 0
max: 120
step: 1
unit_of_measurement: ‘secondi’
lights_automations_duration_BagnoCamera_motion:
name: ‘Durata Illuminazione’
icon: mdi:timelapse
min: 1
max: 60
step: 1
unit_of_measurement: ‘minuti’
lights_automations_lux_BagnoCamera_motion:
name: ‘Limite Luminosità’
icon: mdi:brightness-6
min: 0
max: 200
step: 1
unit_of_measurement: ‘lx’
# ——————————————————————————————————————-
# Automations
automation:
# Movimento
# BagnoCamera
– alias: ‘Lights Automations – Movimento BagnoCamera Reset Stato’
initial_state: true
mode: single
max_exceeded: silent
trigger:
– platform: state
entity_id:
– input_boolean.lights_automations_general_motion
– input_boolean.lights_automations_BagnoCamera_light_motion
– light.luce_bagno_camera
to: ‘off’
action:
– service: input_boolean.turn_off
entity_id: input_boolean.lights_automations_BagnoCamera_status_motion
– alias: ‘Lights Automations – Movimento BagnoCamera Accensione Luce’
initial_state: true
mode: single
max_exceeded: silent
trigger:
– platform: state
entity_id: binary_sensor.lumi_lumi_sensor_motion_aq2_iaszone_2
to: ‘on’
for:
seconds: ‘{{ states(“input_number.lights_automations_delay_light_BagnoCamera_motion”) | int }}’
condition:
– condition: state
entity_id: input_boolean.lights_automations_general_motion
state: ‘on’
– condition: state
entity_id: input_boolean.lights_automations_BagnoCamera_light_motion
state: ‘on’
– condition: state
entity_id: input_boolean.lights_automations_BagnoCamera_status_motion
state: ‘off’
– condition: template
value_template: >-
{% if is_state(“input_boolean.lights_automations_BagnoCamera_lux_motion”, “on”) %}
{% if (states(“sensor.lumi_lumi_sensor_motion_aq2_illuminance_2”) | int) <= (states("input_number.lights_automations_lux_BagnoCamera_motion") | int) %}
true
{% else %}
false
{% endif %}
{% elif is_state("input_boolean.lights_automations_BagnoCamera_lux_motion", "off") %}
true
{% else %}
false
{% endif %}
– condition: state
entity_id: light.luce_bagno_camera
state: 'off'
action:
– service: light.turn_on
entity_id: light.luce_bagno_camera
– service: input_boolean.turn_on
entity_id: input_boolean.lights_automations_BagnoCamera_status_motion
– alias: 'Lights Automations – Movimento BagnoCamera Spegnimento Luce'
initial_state: true
mode: single
max_exceeded: silent
trigger:
– platform: state
entity_id: binary_sensor.lumi_lumi_sensor_motion_aq2_iaszone_2
to: 'off'
for:
minutes: '{{ states("input_number.lights_automations_duration_BagnoCamera_motion") | int }}'
condition:
– condition: state
entity_id: input_boolean.lights_automations_general_motion
state: 'on'
– condition: state
entity_id: input_boolean.lights_automations_BagnoCamera_light_motion
state: 'on'
– condition: state
entity_id: input_boolean.lights_automations_BagnoCamera_status_motion
state: 'on'
action:
– service: input_boolean.turn_off
entity_id: input_boolean.lights_automations_BagnoCamera_status_motion
– condition: state
entity_id: light.luce_bagno_camera
state: 'on'
– service: light.turn_off
entity_id: light.luce_bagno_camera
Complimenti per il magnifico lavoro! E’ davvero utilissimo!! Una considerazione: si potrebbe per semplificare la configurazione dei nuovi sensori creare una blueprint per rendere più semplice il tutto? Sarebbe fattibile secondo te?
Non ho mai trattato blueprint
Ciao e complimenti per l’ottimo lavoro svolto. Io da neofita ho zigbee2mqtt installato + CC2531 + Xiaomi motion sensor. Quello che mi interesserebbe fare è creare un automazione che mi accende la luce e la tiene accesa fino a quando nel suo raggio di azione c’è movimento altrimenti, dopo circa 30 secondi senza movimento mi abbassa la luminosità della luce e dopo altri tot secondi senza movimento mi spegne la luce. E’ possibile con questa guida realizzarla o devo cambiare qualcosa? Grazie e complimenti ancora
è ovviamente necessario realizzarla su misura, questa nasce e muore così. ogni altra variazione va fatta appositamente per l’automazione desiderata.
Ottimo progetto, davvero complimenti!!
Come posso far si che siano 2 i sensori di movimento ad accendere la stessa luce?
Grazie
è necessario gestirli all’interno delle automazioni modificandone il flusso
ciao e complimenti!! volevo chiederti ma se io volessi escludere l’accensione manuale delle luci dall’automazione?mi spiego ok l’accensione e spegnimento automatico, ma se invece volessi far spegnere le luci (se il sensore non rileva nessun movimento) anche se qualcuno ha acceso intenzionalmente la luce dall’interruttore si può fare? ciao e grazie mille
Tutto si può fare, ma va modificato il flusso dell’automazione e fatta su misura.
Complimenti ottimo lavoro
e’ possibile aggiungere una fascia oraria di funzionamento, attivabile e disattivabile
ovviamente sì, ma va aggiunta tutta la logica
Bellissimo e molto preciso, complimenti. Vorrei alzare il livello della sfida, perchè ho amici che dovrebbero saperne magari più di te e non mi hanno ancora risposto, benchè il tutto è originato dalle preoccupazioni per il COVID,
Immagina un PIR INVERSO che deve accendere qualcosa quando non vi è più presenza di persone,tipo una lampada UV C e deve spegnere quando torna a rilevare la presenza di qualcuno.
Come chicca in più la luce UV C dovrebbe stare accesa un determinato tempo tipo 30 o 60 secondi, questo dipende dalle dimensioni del bagno dove viene installata la lampada.
per gestire una cosa di questo genere è consigliato un timer e non un’attesa, in aggiunta ad un presence tracking e non un motion sensor. Ad esempio se stai seduto sul water per 5 minuti e il sensore non ti rileva, ti fa attivare la lampada UV perché per lui non sei più nella stanza (o meglio suo campo di visione) ma in realtà ci sei. Esempio c’è Room Assistant per queste cose (mai usato però). L’alternativa è giocare con wait lungi, ad esempio attendo 1 ora dall’ultimo movimento… ma non è affidabile.
Ciao, grazie mille per i tuoi articoli.
Ho installato il tutto e non funziona. La mia luce però non compare come switch. Potrebbe essere quello il problema?
Grazie per le guide!!
Sì certo, devi usare in tal caso light.
Grazie mille! Funziona perfettamente!
ciao
io devo fare un’automazione per la cucina, quindi ogni volta che c’è la parola “balcone” l’ho sostituita con la parola “cucina”
ogni entity_id: switch.luce_balcone sostituito con il mio switch.shelly_shsw_1_x1234696437x
ogni binary_sensor.movimento_balcone sostituito con il mio binary_sensor.lumi_lumi_sensor_motion_aq2_ias_zone
l’unico sensor.luminosita_balcone (a m cade alla riga 97)sostituito con il mio sensor.lumi_lumi_sensor_motion_aq2_illuminance
la domanda è: ho fatto tutto giusto? il sensore di luminosità compare solo una volta o mi è sfuggito qualcosa?
comunque ti faccio i miei complimenti per questa guida molto accurata
grazie
Sì, ovunque trovi balcone sia descrittivo che di entità puoi sostituirlo. Lo switch va benissimo lo shelly e il sensore luminosità serve solo per inibire l’accensione quindi appare una sola volta.
Ti consiglio di lavorare sul file che puoi trovare nel pacchetto premendo download, piuttosto che copiare i pezzi uno ad uno 🙂
Grazie!