lunedì 9 maggio 2022

Rule Tasmota - SUPPORT_IF_STATEMENT

 


Avevamo affrontato il discorso di simulare un ciclo IF/ELSE andando ad usare l'istruzione BREAK nel post "Rule Tasmota - Introduzione alle rule", ora vediamo come farlo bene, usando davvero l'IF.

Introduzione, a cosa serve SUPPORT_IF_EXPRESSION ?

Tutto questo post sul fatto ruota attorno al fatto che tu abbia aggiunto al firmware Tasmota SUPPORT_IF_EXPRESSION. Se non sai come fare, lo ho spiegato approfonditamente in questo post : "Tasmota - Personalizzare il firmware".

Se invece hai aggiunto al firmware Tasmota USE_EXPRESSION, hai già dovuto installare anche SUPPORT_IF_EXPRESSION, quindi sei a posto!

Usando questa estensione, vengono aggiunti i comandi IF, ELSEIF ed ovviamente ELSE.

Come "bonus" sono anche disponibili i comparativi AND ed OR ed il terminatore di ciclo if ENDIF. Viene anche supportato il fatto di poter fare delle comparazioni e possono essere enunciate delle espressioni logiche.

Si possono eseguire, ovviamente, comandi multipli, così come si possono eseguire comandi con IF "nested" ovvero entro altri cicli di IF.

Bisogna solo tenere presente che l'unico limite non è il cielo, ma la RAM disponibile nel device sul quale gira Tasmota. Prestare particolare attenzione va prestata al fatto che le espressioni logiche devono essere racchiuse tra parentesi.

La presenza di più parentesi determina anche l'ordine di valutazione delle condizioni.


Esempi pratici di  SUPPORT_IF_EXPRESSION

Le regole alle quali sottostare le ho elencate prima, ma facciamo alcuni esempi pratici, così ci si rende subito conto di come funziona il tutto.

Intanto diciamo subito che ho usato un trigger di un sensore, se ti sei perso il post ti consiglio di leggertelo! Rule Tasmota - I trigger dei sensori

Ora possiamo pure partire per questo tour a difficoltà crescente!


Difficoltà 1 : IF

Se il voltaggio rilevato è inferiore a 220 aggiungi 1 alla Var1

Se il voltaggio rilevato è superiore a 230 aggiungi 1 alla Var2

Se Var1 è superiore a 5 allora spegni il carico collegato al relè 1


ON Energy#Voltage<220 DO Add1 1 ENDON

ON Energy#Voltage>230 DO Add2 1 ENDON

IF (Var1>5) DO Power1 off ENDON

Notare le parentesi che racchiudono l'operazione matematica applicata a Var1.


Difficoltà 2 : IF ed AND

Se il voltaggio rilevato è inferiore a 220 aggiungi 1 alla Var1

Se il voltaggio rilevato è superiore a 230 aggiungi 1 alla Var2

Se Var1 è superiore a 5 e Var2 è uguale o superiore a 10 allora spegni il carico collegato al relè 1


ON Energy#Voltage<220 DO Add1 1 ENDON

ON Energy#Voltage>230 DO Add2 1 ENDON

IF (Var1>5) AND (Var2>=10) DO Power1 off ENDON



Difficoltà 3,5 : IF ed AND 

Ora complichiamo leggermente la cosa.

Se il voltaggio rilevato è inferiore a 220 E SE il valore di Var1 è pari a 7 aggiungi 1 alla Var2.


ON Energy#Voltage<220 DO IF (Var1=7) Add2 1 ENDIF ENDON



Difficoltà 4 : IF, AND e ELSE

Se il voltaggio rilevato è inferiore a 220 E SE il valore di Var1 è pari a 7 aggiungi 1 alla Var2, ALTRIMENTI spegni il carico collegato al relè 1 


ON Energy#Voltage<220 DO IF (Var1=7) Add2 1 ELSE Power1 off ENDIF ENDON


Difficoltà 4,5 : IF, AND, ELSE e Backlog

Se il voltaggio rilevato è inferiore a 220 E SE il valore di Var1 è pari a 7 aggiungi 1 alla Var2.

Ora viene la parte incasinata, perchè da qui in poi subentra ALTRIMENTI spegni il carico collegato al relè 1  E metti il valore dell'orario attuale nella posizione Var3 E aspetta 10 secondi E accendi il carico collegato al relè 1


ON Energy#Voltage<220 DO IF (Var1=7) Add2 1 ELSE Backlog Power1 off;Var3 %timestamp%; Delay 10; Power1 on ENDIF ENDON


Notare che il treno di comandi di Backlog può essere messo SOLO nell'ultima posizione, altrimenti non verrà eseguito.



Appunti utili - ELSEIF


Non abbiamo affrontato ELSEIF, ma è una cosa tutto sommato molto facile. Da capire concettualmente, per lo meno :-)

Se si vogliono mettere più IF, la prima condizione deve essere IF, la successiva condizione "se" va introdotta usando ELSEIF 


Appunti utili - ENDIF

ENDIF si usa per chiudere sia i cicli IF che i cicli ELSEIF e va messo prima di ENDON


Appunti utili - AND ed OR

Prima di tutto, in caso di espressioni che abbiano sia AND che OR, è obbligatorio ricordarsi che AND ha la precedenza.

Secondariamente, si possono usare le parentesi per forzare la priorità di calcolo.

esempio pratico

((Energy#Voltage>220) AND (MEM1==1) OR (MEM2==3))


Al valore Energy#Voltage superiore a 220 prima si verifica che Mem1 sia uguale al numero 1, fatto ciò si verica che Mem2 sia uguale al numero 3.

Basta quindi che Mem1 sia uguale a 1 per proseguire.

Se Mem1 non è uguale a 1, si passa alla verifica di Mem3.

((Energy#Voltage>220) AND ((MEM1==1) OR (MEM2==3)))


Al valore Energy#Voltage superiore a 220 si passa a controllare che almeno una delle condizioni dell'espressione seguente sia vera.

In questo caso è necessario che Mem1 sia uguale a 1 oppure che Mem2 sia uguale a 3 e la rule va avanti.

L'uso delle parentesi ha forzato, nel secondo caso, la valutazione dell'espressione logica nella sua interezza, senza doversi fermare, come nel primo esempio, alla prima condizione.

Si, lo so, sono finezze, ma con queste piccole attenzioni si possono fare grandi cose!



Appunti utili - Generico

Le variabili che si possono usare sono le stesse che ho riportato nel post dove si parlava di USE_EXPRESSIONSi possono svolgere anche altre operazioni matematiche, per esempio quelle che ho elencato sempre nel post di USE_EXPRESSION


Conclusione

L'argomento sicuramente è ostico e di livello decisamente avanzato, ma permette un sacco di applicazioni interessanti con una flassibiilità assurda.

Ovviamente bisogna avere ben chiaro il flusso logico che si vuole ottenere.

Se si vuole approfondire un pochino i link che ho messo nel test, te li riporto qui sotto :

Rule Tasmota - I trigger dei sensori

Rule Tasmota - Le variabili

Rule Tasmota - USE_EXPRESSION


Se poi hai piaacere di vedere tutti i post a tema Tasmota, li ho raggruppati con il tag "tasmota" 

2 commenti:

  1. Ciao Mino, grazie per queste preziose guide.
    Sto sperimentando le rule ma questa in particolare non mi funziona, in pratica voglio eseguire il comando (DELAY 30; ShutterPosition1 50; VAR1=0; VAR2=0) solo se il power1 sia on e power2 sia off

    Rule1 ON Power1#state=1 DO ADD1 1 ENDON ON Power2#state=0 DO ADD2 1 ENDON IF (Var1=1) AND (Var2=1) DO BACKLOG DELAY 30; ShutterPosition1 50; VAR1=0; VAR2=0 ENDON

    Dove sbaglio? Grazie mille per il supporto

    RispondiElimina
  2. Ciao, appena ho un momento testo la tua regola e vedo di capire dove non sta "girando"...

    RispondiElimina

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