Iniziamo ad addentrarci nelle Rule del firmware Tasmota capendone la struttura logica e la sintassi.
Un minimo di introduzione
Dopo un paio di post tutto sommato "introduttivi" all'argomento Rule, iniziamo a parlarne in maniera seria.
Questo post è un pochino la base sulla quale verranno sviluppati molti argomenti futuri che si approcciano a Tasmota facendo tesoro dei comandi da console che sto spiegando da qualche anno a questa parte.
Oggi, infatti, parliamo della base di ogni Rule, ovvero della sintassi. Strettamente legato alla sintassi, la logica dei comandi ed i comandi disponibili di base.
Partiamo con qualche concetto semplice semplice.
Le Rule altro non sono che delle azioni (singole o multiple) legate ad una (o più) condizioni. Le condizioni possono essere timer, sensori, output di comandi e quant'altro possa venire in mente.
Le Rule, essendo memorizzate nella flash del dispositivo con Tasmota, sopravvivono al riavvio.
Le condizioni di attivazione di una Rule si chiamano Trigger. Un trigger può essere qualsiasi cosa, da un timer ad un valore di un sensore, fino alla ricezione di un determinato pacchetto MQTT.
Le Rule sono divise in Set, si possono avere al massimo 3 Set.
La cosa comoda è che ogni Rule può essere lunga circa 1000 caratteri che vengono compresse automaticamente, risparmiando fino al 60% di spazio.
Con queste poche frasi, si capisce già la potenza delle Rule.
Si possono automatizzare mille cose senza avere alle spalle un hub domotico, cosa che permette di sviluppare soluzioni custom installabili ovunque vi sia connettività wi-fi.
Ma ora ho già scritto molto, vediamo di affrontare di petto questo argomento molto vasto partendo con un basso profilo.
La sintassi delle Rule
La sintassi, di per se, è molto semplice e lineare. I comandi sono davvero pochi, vediamoli subito!
ON
E' il marcatore che va inserito all'inizio di una Rule. Deve essere seguito da uno spazio.
Trigger
Indica la condizione che deve verificarsi per l'attivazione della Rule
DO
Indica la fine di un Trigger e l'inizio di un command. Deve essere preceduto e seguito da uno spazio.
command
Quale comando eseguire quando si raggiunge la condizione Trigger
FONT
ENDON
E' il marcatore che delimita la fine di una Rule. Dopo questa istruzione possono essere eseguire altre Rule dello stesso Set. Questo comando va preceduto da uno spazio.
BREAK
E' il marcatore che delimita la fine di una Rule. Dopo questa istruzione NON vengono eseguite altre Rule dello stesso Set. Questo comando va preceduto da uno spazio.
Parliamo un attimo di ENDON e di BREAK, giusto per approfondire al meglio.
Come dicevo nell'introduzione, ci possono essere 3 Set di Rule, ma ogni Rule può contenere più comandi.
L'uso di ENDON determina la fine di una Rule in un Set, ma questa Rule potrebbe non essere la sola. Le Rule seguenti, quindi, vengono eseguite normalmente.
Usare BREAK implica invece che le Rule seguenti dello stesso Set non vengono eseguite.
Questo permette di fare una rozza imitazione di un ciclo IF/ELSE senza per questo dover aggiungere nulla al firmware.
Resto però dell'idea che sia meglio usare davvero IF, per questo in uno dei prossimi post affronteremo l'argomento.
I comandi di funzionamento
Ogni Rule può essere ovviamente attivata e disattivata, ma ha anche delle condizioni di funzionamento più raffinate, vediamole tutte qui sotto!
RuleX 0
Disabilita la RuleX
RuleX 1
Abilita la rule RuleX
RuleX 2
Cambia lo stato alla RuleX (TOGGLE)
RuleX 4
Disabilita la modalità one-shot. Questo vuol dire che la RuleX funzionerà fintanto che il trigger che la ha scatenata resta attivo. Ma non solo, ad ogni passaggio dei dati (anche di TelePeriod) che coinvolgono questo trigger la Rule partirà.
RuleX 5
Abilita la modalità one-shot. Questo vuol dire che la RuleX funzionerà una sola volta anche se il trigger che la ha scatenata resta attivo.
RuleX 6
Cambia la modalità da 3 a 4 (TOGGLE)
RuleX 8
Disabilita lo stop se viene rilevato un errore
RuleX 9
Abilita lo stop se viene rilevato un errore
RuleX 10
Cambia la modalità da 8 a 9 (TOGGLE)
Rule0 X
In questo caso si applica lo stato X a tutte le Rule presenti
Nota:
RuleX 3 e RuleX 7 non esistono.
I trigger
La potenza delle Rule può essere sfruttata a fondo solo quando si capisce come usare correttamente i Trigger.
I Trigger non sono altro che i nome ed i relativi valori che si leggono in console in risposta ad un comando. Questi nomi e valori sono in formato JSON e possono essere a più livelli.
Ogni livello è delimitato tra parentesi graffe { }, per usare i Trigger nidificati bisogna traslare le parentesi graffe con il simbolo di # ed esprimere il nome del trigger.
Volendo, si possono non esprimere i nomi dei trigger e sostituirli con ?
Facciamo un esempio, che è molto meglio!
Rule di esempio numero 1:
Quando lo stato del relè 1 diventa OFF lancia il comando di Status 5
FONT
Rule1 ON Power1#state=0 DO Status 5 ENDON rule1 1
Console:
09:06:38 CMD: power off
09:06:38 RSL: RESULT = {"POWER":"OFF"}
09:06:38 RSL: POWER = OFF
09:06:38 RUL: POWER1#STATE=0 performs "Status 5"
09:06:38 RSL: STATUS5 = {"StatusNET":{"Hostname":"wm_test_02-7034","IPAddress":"192.168.1.98","Gateway":"192.168.0.254","Subnetmask":"255.255.252.0","DNSServer":"192.168.0.115","Mac":"48:3F:DA:XX:XX:XX","Webserver":2,"WifiConfig":4,"WifiPower":17.0}}
Come si vede chiaramente, al momento del comando di Power OFF è stato risposto con un RSL (che sta per Result), seguito poi da un RUL che sta per Rule. Viene quindi riportato il trigger scatenante della Rule e quale Rule sia, immediatamente dopo il comando da eseguire.
L'ultimo passaggio è l'output del comando stesso.
Il prossimo post tratterà solo dei trigger, promesso!
Gli operatori matematici
Fino ad ora abbiamo visto come scatenare una rule e cosa fare al raggiungimento di una condizione, ma possiamo fare di meglio!
Per fare un passo oltre, ci sono gli operatori matematici, che permettono dei semplici confronti, vediamoli:
= uguale a
Si usa per confrontare delle stringhe di dati e non i valori numerici
== uguale a
Si usa per confrontare valori numerici e non delle stringhe di dati
> maggiore di
< minore di
!= diverso da
>= maggiore o uguale a
<= minore o uguale a
| diviso
Si usa solo per le divisioni esatte, non viene quindi tenuto conto del resto
Con questi comandi è evidente che il raggio di azione di una rule si amplia enormemente. Si possono fare Rule che dicano cose come
"se la temperature di sensore1 è maggiore di 30 allora accendi relè1"
Ma anche fare cose un pochino più complicate come
"se la temperature di sensore1 è maggiore di 30 allora accendi relè1 e spegni relè 2, se la temperatura di sensore1 è minore di 29.9 allora accendi relè2, e spegni relè 1, se la temperatura di sensore 1 è uguale a 20" spegni tutto, ma tutto solo tra le 12,00 e le 18,00 di mercoledì".
Approfondiremo comunque questo discorso nei prossimi post.
Variabili delle Rule
In aggiunta ai comandi standard della console di Tasmota, le Rule aggiungono alcune variabili che possono essere usate come Trigger.
Esistono 10 variabili, 5 di tipo VarX (dove X è un numero compreso tra 1 e 5) ed altre 5 di tipo MemX (dove X è un numero compreso tra 1 e 5) .
La differenza enorme tra le due tipologie è che le Var non resistono al riavvio, mentre le Mem si.
Anche qui, siccome il discorso è ampio, lo affronteremo in futuro.
Direi, per il momento, di fermarci qui.
Metto giusto un pochino di domandi frequenti sulle Rule dove incorporo ancora qualche consiglio, nel prossimo post a tema Rule tratterò approfonditamente i trigger.
Ah, dimenticavo, se sei interessato alle automazioni in ambito domotico, ho scritto diversi post con dei suggerimenti che potrebbero esserti utili, li trovi comodamente elencati qui
Domande frequenti sulle Rule
Come si aggiungono comandi ad una Rule?
Se si ha una Rule già pronta e funzionante e si vogliono aggiungere altri comandi, lo si può fare semplicemente scrivendo il nome della sule seguito da + e dei comandi da aggiungere.
Esempio veloce :
Rule1 ON Power1#state=0 DO status 5 ENDON
Rule1 + ON Power1#state=1 DO status 1 ENDON
Alla fine la Rule1 sarà questa :
ON Power1#state=0 DO status 5 ENDON ON Power1#state=1 DO status 1 ENDON
Nota : questa Rule fa partire il comando di Status 5 se il carico viene, mentre se il carico viene acceso lancia il comando si Status 1.
Come si cancella una Rule?
Molto semplicemente, con il comando RuleX " Dove X è il numero della Rule da cancellare.
Spesso, però, viene più comodo disabilitare la Rule, lanciando il comando RuleX 0, dove X è il numero della Rule da disabilitare.
Può una rule mandare in loop il dispositivo?
Certo che può, e sicuramente prima o poi ti succederà.
Per fortuna Theo ha previsto anche questa possibilità, per questo motivo al secondo riavvio vengono disabilitate le Rule che causano il riavvio.
Se dovesse accadere un terzo riavvio, vengono disabilitate tutte le Rule.
Se dopo il quarto riavvio la problematica persiste, non è colpa delle Rule :-)
Questo comportamento è standard, a meno che tu non sia andato a giocare con il comando SetOption36.
Conclusioni
Direi che come "breve e veloce introduzione" abbiamo affrontato una marea di temi! Le Rule nel firmware Tasmota sono decisamente una cosa che occupa spazio per essere trattata a dovere. Se ci mettiamo anche che a me piace spiegare bene ed in italiano le cose, con diversi esempi pratici, ecco che si ottengono dei post lunghi!
Prometto, i prossimi post saranno meno corposi, anche perchè si dedicheranno ad un solo aspetto di Tasmota :-)
Nessun commento:
Posta un commento
Sei davvero sicuro di voler sprecare tempo prezioso per scrivere qualcosa? Non è che preferisci andare su Google?