community italiana di domotica personale
 
Le diverse modalità di esecuzione di automazioni e script su Home Assistant

Le diverse modalità di esecuzione di automazioni e script su Home Assistant

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 dell’azione automation.turn_on, mentre gli script venivano eseguiti all’evocazione dell’azione  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:

Home Assistant - Modalità di esecuzione script e automazioni

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
        action: light.turn_on
      - delay:
          minutes: 5
      - entity_id: light.letto
        action: 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
        action: light.turn_on
      - delay:
          minutes: 5
      - entity_id: light.letto
        action: 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.

Vetrina - Offerte del giorno

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:
      - action: notify.edoardo
        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:
      - action: 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:
            - action: 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
            - action: 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:
            - action: light.turn_on
              entity_id: light.bulb
        - conditions:
            - condition: state
              entity_id: binary_sensor.button2
              state: "off"
          sequence:
            - action: light.turn_off
              entity_id: light.bulb
        default:
          - action: notify.edoardo
            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. Alcuni link sono taggati in qualità di affiliati Amazon e riceviamo un compenso dagli acquisti idonei, utile al sostenimento del sito, ma le nostre recensioni sono tutte indipendenti e non sponsorizzate. Se ti sei perso, a tua disposizione c'è la mappa.