Da tempo, l’HUB per domotica personale Home Assistant ha ottenuto un importante aggiornamento sul fronte di automazioni (e script) ovvero la possibilità di controllarne la modalità di esecuzione (vedremo in che senso) e la possibilità eventuale di ripeterne l’esecuzione stessa.
MODALITÀ DI ESECUZIONE
Prima dell’avvento della versione 0.113 le automazioni venivano eseguite sostanzialmente al solo presentarsi del loro trigger o all’evocazione del servizio automation.turn_on, mentre gli script venivano eseguiti all’evocazione del servizio script.turn_on. Chiaro e semplice. L’avvio di tali procedura poteva essere ripetuta nel tempo, ma solo quando non fosse già in esecuzione.
Si immagini per esempio un’automazione che, tramite un sensore di movimento, o di apertura varchi, determini l’accensione di un punto luce per poi effettuare lo spegnimento dopo un tot di minuti. In caso il sensore rilevi un altro movimento durante l’attesa dei tot minuti previsti (e quindi durante l’esecuzione), nulla accadrebbe: verrebbe solo portata a compimento la prima esecuzione.
Per evitare casi come questi (ma gli esempi possibili sono dozzine), il board di sviluppo di Home Assistant ha introdotto quattro modalità di esecuzione possibili, gestibili (facoltativamente) tramite il campo mode:
single (Singolo) | Se si presenta il trigger prima della fine dell’esecuzione, ignoralo |
restart (Riavviare) | Se si presenta il trigger prima della fine dell’esecuzione, interrompi l’esecuzione e riavvia l’automazione |
queued (In coda) | Se si presenta il trigger prima della fine dell’esecuzione, portala a compimento e poi riavvia l’automazione |
parallel (Parallelo) | Se si presenta il trigger prima della fine dell’esecuzione, esegui nuovamente l’automazione, in parallelo |
Ecco queste varie modalità spiegate graficamente:
SINGLE (esecuzione singola)
Si tratta della modalità più semplice. In pratica, l’esecuzione dell’automazione o dello script viene eseguita una volta sola e fino in fondo, anche se durante l’esecuzione si presenta una nuova evocazione. In pratica, questa è la modalità che veniva adottata precedentemente di default.
Per esempio, l’automazione:
automation: - alias: "Accensione/spegnimento della luce" mode: simple trigger: platform: state entity_id: sensor.movimento to: 'on' condition: [] action: - entity_id: light.letto service: light.turn_on - delay: minutes: 5 - entity_id: light.letto service: light.turn_off
fa sì che quando il sensore di movimento sensor.movimento si attiva, una luce (light.letto) viene accesa e dopo cinque minuti viene spenta. In caso durante quei cinque minuti di attesa il sensore movimento venga nuovamente attivato, l’automazione non viene nuovamente eseguita, in quanto già in esecuzione. Un nuovo innesco del trigger causerà l’esecuzione dell’automazione solo in assenza di un’esecuzione pregressa già in corso.
RESTART (esecuzione singola)
Si tratta di una modalità che, in caso l’automazione o lo script entrino in esecuzione durante un’esecuzione pregressa, interrompano la precedente per eseguire nuovamente le azioni previste.
Torniamo, modificandola, all’automazione di prima:
automation:
- alias: "Accensione/spegnimento della luce"
mode: restart
trigger:
platform: state
entity_id: sensor.movimento
to: 'on'
condition: []
action:
- entity_id: light.letto
service: light.turn_on
- delay:
minutes: 5
- entity_id: light.letto
service: light.turn_off
In questo caso l’effetto è che se la luce viene accesa per rilevazione movimento, ma la persona continua a muoversi nella stanza, la lampadina rimarrà tendenzialmente accesa finché ci sarà qualcuno nella stanza. Il perché è semplice: la persona entra, scatta l’automazione, la persona poi continua a muoversi nella stanza e quindi a innescare l’automazione, la quale così configurata annulla l’esecuzione precedente e riparte da zero, procrastinando così i cinque minuti di attesa per spegnere la luce fino a che la persona non se ne sarà andata (non innescando più il sensore di movimento).
QUEUED (ACCODATA)
Questa modalità consente, in caso di evocazioni multiple durante l’esecuzione, di accodare le eventuali seguenti esecuzioni.
Ipotizziamo di avere un’unica automazione che invii delle notifiche (utilizzando il componente “Notification“) e possa essere innescata da più trigger diversi. Ovviamente potrebbe crearsi una situazione in cui più trigger, nel giro di poco, vengano a inneschino: non vorremmo perdere alcuna notifica per ognuno dei trigger, motivo per cui utilizzeremo la modalità queued. Ogni innesco metterebbe in coda l’automazione che verrebbe eseguita tante volte quante le evocazioni.
Per la modalità queued è possibile indicare anche il numero massimo di esecuzioni accodate tramite il parametro max, il quale se non indicato è impostato di default a 10.
PARALLEL (PARALLELIZZATA)
Questa modalità consente, in caso di evocazioni multiple di script e automazioni durante una loro precedente esecuzione, di parallelizzare le esecuzioni seguenti. In pratica, se un’automazione è in esecuzione, può esserne parallelizzata un’altra esecuzione. Utilizzare questa modalità è potenzialmente causa di problemi: va usata con grande cautela. Immaginiamo di utilizzare questa modalità nell’esempio precedente della luce accesa tramite un sensore: è intuitivo come questo causerebbe potenzialmente dei problemi.
Per la modalità parallel è possibile indicare anche il numero massimo di esecuzioni parallelizzate tramite il parametro max, il quale se non indicato è impostato di default a 10.

Repeat
Altra possibilità è quella di ripetere porzioni di automazioni o script in tre diverse modalità:
Counted repeat | Ripetizione a numero chiuso |
While loop | Ripetizione con proseguimento subordinato a una condizione specifica |
Repeat until | Ripetizione con uscita subordinata a una condizione specifica |
Facciamo un esempio. Potremmo scrivere uno script che spammi un medesimo messaggio di notifica per dieci volte al proprio smartphone. In questo caso usiamo quindi la counted repeat:
script: - alias: Invia notifica spam al telefono repeat: count: 10 sequence: - service: notify.marco data: message: Ding dong! C'è qualcuno alla porta!
La modalità while loop, invece, esegue ciclicamente le azioni fino al continuo presentarsi di una specifica condizione:
script:
fai_qualcosa:
sequence:
- service: script.get_ready_for_something
- alias: Ripeti la sequenza finché le condizioni indicate sono TRUE
repeat:
while:
- condition: state
entity_id: input_boolean.qualcosa
state: 'on'
# non farlo comunque per più di tot volte (20)
- condition: template
value_template: "{{ repeat.index <= 20 }}"
sequence:
- service: script.qualcosa
Infine, la modalità repeat until esegue le azioni con uscita al presentarsi di una condizione specifica:
automation:
- trigger:
- platform: state
entity_id: binary_sensor.qualcosa
to: 'on'
condition: []
mode: single
action:
- alias: Ripeti la sequenza di azioni finché le condizioni non diventano TRUE
repeat:
sequence:
# Esegui un comando finché non funziona
- service: shell_command.turn_something_on
# Diamogli tempo di essere eseguito
- delay:
milliseconds: 200
until:
# Ha funzionato correttamente? Allora esco
- condition: state
entity_id: binary_sensor.something
state: 'on'
Ulteriori info e dettagli sono disponibili qui.
Chooser
Capita spesso che si abbiano più automazioni che controllino le medesime entità. Da questa nuova versione è possibile definire singole automazioni dotate di selettore, ovvero che eseguano porzioni di blocco action in base alle condizioni configurate.
Si prenda ad esempio questa automazione:
automation: - alias: "Esempio" description: "Gestione della luce" trigger: - platform: state entity_id: - binary_sensor.button1 - binary_sensor.button2 - binary_sensor.button3 action: - choose: - conditions: - condition: state entity_id: binary_sensor.button1 state: "on" sequence: - service: light.turn_on entity_id: light.bulb - conditions: - condition: state entity_id: binary_sensor.button2 state: "off" sequence: - service: light.turn_off entity_id: light.bulb default: - service: notify.marco data: message: "E' stato premuto il pulsante 3"
In pratica l’automazione si innesca con la pressione di uno dei tre pulsanti indicati:
- binary_sensor.button1
- binary_sensor.button2
- binary_sensor.button3
dopodiché nel blocco action avviene la magia: con la nuova sintassi, se viene premuto il pulsante 1, la luce viene accesa; col 2, viene spenta mentre nel caso del tre, dato che non è esplicitamente gestito, viene eseguito il sottoblocco default, ovvero quello che invia il messaggio.
Esercizi di domotica su Home Assistant: “2 – Definire diversi trigger per innescare automazioni”
⚠️ 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. |