Automazioni su base temporale, in varie modalità, su Home Assistant

3 minuti di lettura

orologioCome abbiamo avuto modo di apprendere, in domotica personale uno degli aspetti più radicati e importanti è quello legato all’automazione, ovvero far in modo che la propria abitazione sia in grado di effettuare semplici (o anche complessi) compiti in modo del tutto autonomo – sulla base, ovviamente, delle nostre indicazioni.

L’ormai noto HUB personale Home Assistant dispone di una gestione per la definizione di automazioni estremamente versatile. Le caratteristiche principali e i suoi meccanismi di funzionamento li abbiamo spiegati in dettaglio su questa scheda; in questa, invece, ci focalizzeremo sulle varie possibilità di innesco su base temporale: come e in che modalità utilizzare orari o lassi temporali per eseguire i trigger che avviano un’automazione.

ORARI

Il modo più semplice ed elementare è quello di utilizzare orari prefissati. Indicando nel trigger di un’automazione uno o più orari specifici, infatti, è possibile eseguire una o più azioni. Per farlo si utilizza la piattaforma “time“.

Per esempio, un’automazione così scritta (ovviamente omettiamo condition e action, i quali blocchi andranno compilati come meglio si crederà sulla base delle eventuali condizioni da verificare e delle azioni da eseguire):

automation:
  trigger:
    platform: time
    at: "08:30:00"
  condition: []
  action: []

viene eseguita, sempre (purché sia attiva, quindi “operativa”, ben inteso), alle otto e trenta del mattino.
Volendo, è possibile indicare anche più orari:

automation:
  trigger:
    platform: time
    at:
      - "08:30:00"
      - "20:30:00" 
  condition: []
  action: []

in questo caso i momenti della giornata in cui l’automazione verrà eseguita saranno due, una volta alle otto e trenta del mattino e un’altra alle otto e trenta della sera.

PERIODICAMENTE

Ciò che è forse ancora più interessante è la possibilità di impostare dei periodi di ripetizione. Per far ciò si utilizza, solitamente, la piattaforma “time_pattern“.

Ipotizziamo di voler eseguire la nostra automazione ogni 15esimo minuto di ogni ora (10.15, 11.15, 12.15 eccetera):

automation:
  trigger:
    platform: time_pattern
    minutes: 15 
  condition: []
  action: []

N.b. Questa automazione viene eseguita una volta all’ora (al quindicesimo minuto, NON ogni quindici minuti).


Immaginiamo ora di voler eseguire l’automazione ogni minuto. Si usa l’asterisco:

automation:
  trigger:
    platform: time_pattern
    minutes: "*" 
  condition: []
  action: []

e se questa automazione la volessimo eseguire sì ogni minuto, ma soltanto dalle 14 alle 15?

automation:
  trigger:
    platform: time_pattern
    hours: "14"
    minutes: "*" 
  condition: []
  action: []
“OGNI TOT”

Infine, la possibilità di eseguire un’automazione ogni tot di tempo, predeterminato. Apparentemente la soluzione è data da questa configurazione:

automation:
  trigger:
    platform: time_pattern
    minutes: "/5" 
  condition: []
  action: []

scritta così pare facile capire che quel “/” davanti al numero intero inneschi la ripetizione ogni tot minuti, cinque per l’esattezza.
Facile come un bicchier d’acqua.

Invece no. Abbiamo scoperto, testandolo, che questa sintassi risponde alle logiche di cron di Linux, per le quali questo meccanismo funziona in modo un filo controintuitivo. Sì, perché il meccanismo funziona sulla base della divisibilità dell’orario con il valore indicato, non sullo scorrere effettivo del tempo. 

Ipotizziamo siano le 15:01. “01” (1) non è divisibile per 5 (valore indicato come esempio nell’automazione di cui sopra), quindi il trigger non scatta. 15:02? Stesso discorso. 15:20, invece, ha 20 divisibile effettivamente per 5, quindi il trigger scatta.

In pratica questa automazione non scatta “ogni-cinque-minuti”, ma quando il valore dei minuti dell’orario, diviso per il valore indicato, ritorna un valore intero.

Per esempio:

automation:
  trigger:
    platform: time_pattern
    minutes: "/45"
  condition: []
  action: []

scatta SOLO al 45esimo minuto di ogni ora e allo scoccare dell’ora. Funziona così – non sparate sui pianisti.

Soluzione

Proponiamo in questa sede una soluzione che permette di aggirare questo problema. Sì, perché potrebbe esserci la necessità di eseguire, per esempio, un’automazione ogni ora e mezza (per dire), ma le funzioni di base sopra descritte non ci aiutano a risolvere la questione.

Per farlo, utilizziamo un’entità di tipo Timer che, pre-configurata a un dato lasso temporale (l’intervallo che ci interessa venga rispettato), al suo scadere inneschi la nostra automazione che, oltre ad eseguire ciò che deve eseguire, resetta il timer stesso. Una sorta di cane che si morde la coda, semplice ed efficace.

Prima definiamo in configurazione il timer:

timer:
  intervallo:
    duration: '01:30:00'

questo genera l’entità timer.intervallo, che andremo quindi a cablare in due automazioni.

automation:
  - alias: Imposta timer
    trigger:
      - platform: homeassistant
        event: start 
      - platform: time
        at: 
          - "08:30:00"      
      action:
      - service: timer.start
        data:
          entity_id: timer.intervallo

  - alias: Automazione Finale
    trigger:
      - platform: event
        event_type: timer.finished
        event_data:
          entity_id: timer.intervallo
    action:
      - service: timer.start
        data:
          entity_id: timer.intervallo
      - service:  #quel che deve fare la nostra automazione, a seguire
        .
        .
        .

La prima automazione (automation.imposta_timer) fa sì il timer venga avviato – così facendo, parte il suo conto alla rovescia di un’ora e mezza (come indicato nella configurazione del time stesso).

A fini puramente istruttivi abbiamo indicato due possibili trigger (tra i tanti utilizzabili):

  • il primo si innesca quando parte Home Assistant;
  • il secondo, alle 8.30 di mattina.

Ovviamente quando far partire il conto alla rovescia è una scelta propria.

La seconda automazione (automation.automazione_finale) è la nostra automazione, ovvero quella che deve eseguire qualcosa ogni tot tempo, in questo caso ogni ora e mezza.

Il suo trigger è infatti l’evento “timer.finished“, ovvero quando si conclude il conto alla rovescia. A questo punto l’automazione provvede a far ripartire il timer ed eseguire le nostre azioni.

E così via.


Telegram News Channel