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

5 minuti di lettura

Con l’avvento della versione 0.113, 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 presenza, 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 Se si presenta il trigger prima della fine dell’esecuzione, ignoralo
restart Se si presenta il trigger prima della fine dell’esecuzione, interrompi l’esecuzione e riavvia l’automazione
queued Se si presenta il trigger prima della fine dell’esecuzione, portala a compimento e poi riavvia l’automazione
parallel 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.presenza
      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 presenza sensor.presenza si attiva, una luce (light.letto) viene accesa e dopo cinque minuti viene spenta. In caso durante quei cinque minuti di attesa il sensore presenza 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.presenza
      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 presenza, 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 presenza). 

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.


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