Home Assistant: Accendere una luce tramite un sensore di movimento

Autore: Vito
6,1K visite
Home Assistant Light Motion - Featured Image

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).
Attenzione: Nel caso si voglia usare sensore alternativo, la logica interna di questo deve attivare (on) il sensore binario quando occupato e disattivarlo (off) quando disoccupato nel più breve tempo possibile (consigliati massimo 10-15 secondi). Fare particolare attenzione ai sensori a basso consumo (soprattutto quelli molto economici) che possono avere dei tempi di reazione molto lunghi obbligando una configurazione delle tempistiche con valori poco realistici o addirittura rendendo l’automazione incompatibile col prodotto scelto. Se invece si vuole velocizzare l’interazione tra Home Assistant e l’integrazione nativa di Philips Hue seguire le indicazioni di questo articolo.

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.

Se ti è stato utile, perché non...
Mi offri un caffè?

Post correlati

20 commenti

Marcello 31 Gennaio 2024 - 11:31

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

Rispondi
Vito 31 Gennaio 2024 - 13:06

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.

Rispondi
Gabriele 19 Febbraio 2023 - 11:29

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

Rispondi
Davide 1 Dicembre 2022 - 13:48

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?

Rispondi
Vito 1 Dicembre 2022 - 21:50

Non ho mai trattato blueprint

Rispondi
Lorenzo 19 Dicembre 2021 - 16:54

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

Rispondi
Vito 19 Dicembre 2021 - 16:59

è ovviamente necessario realizzarla su misura, questa nasce e muore così. ogni altra variazione va fatta appositamente per l’automazione desiderata.

Rispondi
Luca 31 Ottobre 2021 - 13:32

Ottimo progetto, davvero complimenti!!
Come posso far si che siano 2 i sensori di movimento ad accendere la stessa luce?

Grazie

Rispondi
Vito 19 Dicembre 2021 - 16:59

è necessario gestirli all’interno delle automazioni modificandone il flusso

Rispondi
sVAUZ81 27 Agosto 2021 - 13:42

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

Rispondi
Vito 15 Settembre 2021 - 11:13

Tutto si può fare, ma va modificato il flusso dell’automazione e fatta su misura.

Rispondi
giuseppe 26 Agosto 2021 - 10:22

Complimenti ottimo lavoro
e’ possibile aggiungere una fascia oraria di funzionamento, attivabile e disattivabile

Rispondi
Vito 19 Dicembre 2021 - 16:59

ovviamente sì, ma va aggiunta tutta la logica

Rispondi
Bruno 9 Agosto 2021 - 16:40

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.

Rispondi
Vito 9 Agosto 2021 - 18:44

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.

Rispondi
Davide 19 Giugno 2021 - 19:51

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!!

Rispondi
Vito 19 Giugno 2021 - 20:02

Sì certo, devi usare in tal caso light.

Rispondi
Davide 20 Giugno 2021 - 20:03

Grazie mille! Funziona perfettamente!

Rispondi
Carlo Alberto Sgrazzutti 18 Maggio 2021 - 12:29

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

Rispondi
Vito 18 Maggio 2021 - 12:42

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!

Rispondi

Lascia un commento

* Utilizzando questo modulo accetti la memorizzazione e la gestione dei tuoi dati da questo sito web.