lunedì 25 aprile 2022

Rule Tasmota - Le variabili

Abbiamo marginalmente affrontato l'argomento delle variabili, ma ora è il caso di buttarcisi seriamente, andiamo!

Introduzione a Var e Mem

Quando ho aperto le danze introducendo l'argomento Rule con il post "Rule Tasmota - Introduzione alle rule" si era parlato velocemente delle variabili, ma dopo aver visto anche i Trigger con l'articolo "Rule Tasmota - Sintassi dei trigger", è il momento di affrontare questo discorso.

Riprendendo da dove mi ero fermato, ricordo che 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) . 

Modificando i parametri del firmware chiamati MAX_RULE_VARS e MAX_RULE_MEMS si può arrivare fino ad avere 16 Var ed altrettante Mem. Mi sfugge il perchè averne così tante, ma è una possibilità che è stata prevista.

La differenza enorme tra le due tipologie è che le Var non resistono al riavvio, mentre le Mem si. Per entrambe le tipologie di variabili, la cosa geniale è che il loro valore può diventare a sua volta il Trigger di una Rule.

Questo, ovviamente, oltre ai trigger "di base" che avevamo già visto nel post "Rule Tasmota - Sintassi dei trigger" . Ti consiglio di vedere comunque quel post, visto che ci sono spiegati anche i due trigger MemX#State e VarX#State.

Ricordati che se hai abilitato USE_EXPRESSION, puoi beneficiare della matematica "avanzata" anche andando a giocare con Var e Mem. Se non sai di cosa sto parlando, potrebbe esserti utile leggere "Rule Tasmota - USE_EXPRESSION".


Vedere i valori delle variabili

Per vedere il testo contenuto in una variabile, basta chiamare la variabile seguita da numero.

Per vedere lo stato di tutte le variabili, basta lanciare un comando di Backlog che le racchiuda :

backlog var1; var2; var3; var4; var5; mem1; mem2; mem3; mem4; mem5


09:47:10 CMD: backlog var1; var2; var3; var4; var5; mem1; mem2; mem3; mem4; mem5

09:47:10 RSL: RESULT = {"Var1":""}

09:47:10 RSL: RESULT = {"Var2":""}

09:47:11 RSL: RESULT = {"Var3":""}

09:47:11 RSL: RESULT = {"Var4":""}

09:47:11 RSL: RESULT = {"Var5":""}

09:47:11 RSL: RESULT = {"Mem1":""}

09:47:11 RSL: RESULT = {"Mem2":""}

09:47:12 RSL: RESULT = {"Mem3":""}

09:47:12 RSL: RESULT = {"Mem4":""}

09:47:12 RSL: RESULT = {"Mem5":""}

Ed ecco lo stato completo delle variabili di tipo Var e di tipo Mem.



I dati possibili

Nelle variabili di entrambi i tipi si possono memorizzare i dati che si vogliono, che siano numeri o testi, ma non solo. Intanto iniziamo a fare un paio di giochetti utili ed interessanti!

Iniziando bassi bassi, possiamo dare un testo fisso ad una variabile così :

09:51:26 CMD: Var1 Pluto

09:51:26 RSL: RESULT = {"Var1":"Pluto"}

Ora, se andiamo a richiamare la Var1 ecco che il valore sarà Pluto

09:52:04 CMD: Var1

09:52:04 RSL: RESULT = {"Var1":"Pluto"}

Stessa cosa, possiamo dare alla variabile un numero fisso :

09:53:06 CMD: Var2 24681357

09:53:06 RSL: RESULT = {"Var2":"24681357"}

Ora, se andiamo a richiamare la Var2 ecco che il valore sarà 24681357 :

09:53:20 CMD: Var2

09:53:20 RSL: RESULT = {"Var2":"24681357"}


Altro giochetto interessante, una Var può avere il contenuto di una Mem e viceversa.


Se prendiamo la Var1 e la vogliamo mettere in Mem1 basta fare semplicemente questa Rule :

ON Power1#state=0 DO Mem1 %Var1% ENDON

Vediamo come funziona? 

09:57:24 CMD: power 0

09:57:24 RSL: RESULT = {"POWER":"OFF"}

09:57:24 RSL: POWER = OFF

09:57:24 RUL: POWER1#STATE=0 performs "Mem1 Pluto"

09:57:24 RSL: RESULT = {"Mem1":"Pluto"}

Ok, ora "Pluto" da variabile che non resiste al riavvio è diventato una variabile che possiamo sfruttare al prossimo riavvio.

Ora che abbiamo visto queste cose tutto sommato carine ma scarsamente utili, vediamo una cosa davvero utile.

Le variabili possono essere la lettura di ogni sensore.

Questo vuol dire che possiamo mettere come variabile, per esempio, l'umidità di un sensore :

19:01:32 CMD: status 8

19:01:32 MQT: tasmota/stat/th_bagno/STATUS8 = {"StatusSNS":{"Time":"2021-04-25T19:01:32","SI7021":{"Temperature":26.3,"Humidity":78.1},"TempUnit":"C"}}

ON SI70211#Humidity DO Var3 %value% ENDON

A questo evento possiamo ovviamente collegare una rule di questo tipo :

ON Var3>=79.5 DO Power=1 ENDON

Dei sensori ne abbiamo parlato poco tempo fa, nel post "Rule Tasmota - I trigger dei sensori", te lo ricordi?

Ora che abbiamo capito la potenza delle Variabili con un pochino di matematica spicciola, andiamo avanti.

Infatti c'è molto altro!


I valori di sistema

Come dicevo poco prima, oltre ai valori numerici, ai testi ed ai dati presi dai sensori, ci sono altre variabili da sfruttare! 

Per molte ne aveva già parlato qualche tempo fa nel post "Rule Tasmota - USE_EXPRESSION", ma le riporto comunque, visto che ci sono alcune cose in più.

Eccole qui, spiegate una ad una :


%time%

Numero di minuti dopo la mezzanotte. Siccome sappiamo che in un giorno ci sono 1440 minuti ed in un ora 60, possiamo fare un sacco di giochi carini.


%timestamp%

Salva data ed ora nel formato aaaa-mm-ggThh:MM:ss. Un esempio è questo : 2021-01-22T10:36:58. Si legge come anno 2012, mese 01, giorno 22, ora 10, minuti 36 secondi 58


%uptime%

Minuti trascorsi dall'ultimo riavvio.


%sunrise%

Minuti trascorsi dall'alba. Se deve ancora sorgere il sole, saranno indicati i minuti mancanti all'evento.


%sunset%

Minuti trascorsi dal tramonto. Se deve ancora tramontare il sole, saranno indicati i minuti mancanti all'evento.


%utctime%

Valore dell'orario espresso in epoch time. Se non conosci come calcolare questo tempo, ti lascio un link ad un mio vecchio post (lo metto anche in fondo all'articolo).

Ad oggi, il mio epoch time è pari a 1619085451000. Appoggiandomi al calcolatore di Ruddwire ne emerge la corretta data odierna, ovvero "Thu Apr 22 2021 10:57:31 GMT+0200"


%topic%

Valore del campo "topic" di MQTT. 


Con tutte queste altre variabili possibili, direi che si amplia (e non di poco) il campo d'azione delle Rule!


Le operazioni matematiche possibili

L'uso delle Variabili consente anche l'applicazione di una matematica semplice semplice, ma molto utile. Vediamo i semplici ma potenti comandi a disposizione:

  • Addizione

Add1 X - Add2 X - Add3 X - Add4 X - Add5 X 

Aggiunge il valore X alla Var collegata. Esempio :

Add3 27

Aggiunge il valore 27 alla Var3.


  • Sottrazione

Sub1 X - Sub2 X - Sub3 X - Sub4 X - Sub5 X 

Sottrae il valore X alla Var collegata. Esempio :

Sub5 9

Sottrae il valore 9 alla Var5.


  • Moltiplicazione

Mult1 X - Mult2 X - Mult3 X - Mult4 X - Mult5 X 

Moltiplica il valore X alla Var collegata. Esempio :

Multi2 3

Moltiplica per un fattore di 3 la Var2.


  • Extra

Ricorda che se hai abilitato USE_EXPRESSION hai anche a disposizione la possibilità di usare tutta la matematica correlata. C'è anche il discorso del simbolo "=" che avevo appunto accennato al volo nel post "Rule Tasmota - USE_EXPRESSION", vediamolo subito!


Eseguire operazioni e mettere il risultato come Var o Mem

Usare il simbolo "=" consente di mettere il risultato di un'operazione matematica come Var o Mem. Se questa cosa non fosse abbastanza utile di suo, si possono anche svolgere operazioni matematiche sui valori simbolici che sono riportati nel post di USE_EXPRESSION.

Qui sotto qualche esempio, giusto per prendere confidenza con questo metodo:


Var1 50

Var1=50

Mette il valore 50 nella posizione Var1, quindi usando il simbolo di uguale non cambia nulla.


Var1 13+18

Mette "13+18" nella posizione Var1, ovvero tratta i due valori come se fossero un testo scritto, senza compere alcuna operazione matematica.


Var1=13+18

Mette il valore 31 , risultato dell'operazione matematica 13+18, nella posizione Var1.



Qualche idea

Vediamo insieme un paio di idee per poter sfruttare queste variabili, ovviamente in concomitanza con i Trigger .

Se il valore %sunset% è pari a 0, accendi il carico perchè fuori è buio.

Se il valore %uptime% è maggiore di 30, lancia un restart 1 perchè il sistema a valle ha bisogno di un riavvio.

Quando il carico viene spento, salva in memoria l'evento "Carico Spento" seguito dal %timestamp%

Queste sono solo idee, tra l'altro realizzabili con nulla più che le conoscenze che già ho pubblicato qui sul blog.


Conclusione

Con l'aggiunta di questi trigger, Tasmota diventa sempre più un sistema a se stante e si stacca dall'hub domotico. La strada che avevo prospettato tempo fa di far evolvere Tasmota passa anche da questo!

Nei prossimi post andremo sempre più verso questa strada, ma senza dimenticare che tutto quello che si fa può avere anche la sua controparte verso MQTT.

Spero che tu abbia letto tutto quello che è correlato alle Rule, ma se ti fossi perso qualcosa ti lascio un pò di link qui sotto.

Se sei interessato al tramonto legata alla variabile %sunset%, puoi leggere il mio post "Quale tramonto vuoi?", vedrai che imparerai qualcosa di curioso ed utile!

Il discorso dell'Epoch time lo avevo già affrontato molto tempo fa, era il 2018. Se non ne sai nulla, informati con questo post "Come Wigle calcola il tempo", ci sono le basi ed i link per approfondire il tutto.

Fatti magari anche un giro sul calcolatore di date Epoch e convertitore ospitato su Ruddwire

Tutto quello che riguarda i Trigger lo ho scritto nel post "Rule Tasmota - Sintassi dei trigger"

Per i topic MQTT ho scritto un bel pò di cose nel post "Console Tasmota - Parametri MQTT con Backlog", in caso volessi leggerlo.

In caso non lo avessi capito, ti consiglio caldamente di abilitare USE_EXPRESSION, leggiti il post al riguardo e dimmi se non è una figata! Rule Tasmota - USE_EXPRESSION

Se invece vuoi approfondire il discorso Backlog (a mio avviso uno dei comandi più utili in Tasmota), ho scritto diverti articoli, sono tutti qui

Ma ci sono anche un sacco di post legati a Tasmota su questo blog, te li ho raggruppati con il tag "tasmota" così ti viene più comodo trovarli


Se invece non trovi nulla che faccia al caso tuo ed hai bisogno di una mano, lascia un commento qui sotto e proverò a darti una mano!


Nessun commento:

Posta un commento

Sei davvero sicuro di voler sprecare tempo prezioso per scrivere qualcosa? Non è che preferisci andare su Google?

Cerca nel blog

I post più letti di sempre