Tasmota Rules Tutorial mit Expressions und If Statement

Tasmota Rules Tutorial zum Umgang mit der ESP-OS Firmware

  • Rules verstehen und gezielt einsetzen
  • Tasmota Rules Expressions einfache Auswertung durch Ausdrücke
  • Tasmota Rules Statement aktuelle Zustände auswerten und entsprechend aggieren

Im Bezug Tasmota Rules Tutorial findet sich eine Vielzahl von Einträgen, insbesondere Fragen da Tasmota Rules nur schwer verständlich sei. Selbstredend ist nichts subjektiver als das persönliche Verständnis und vermutlich ausgelöst durch den Hype um die künstliche Intelligenz ist die Erwartungshaltung an Tasmota Rules wohl etwas erhöht. Im Eigentlichen werden die Tasmota Rules bereits auf der Tasmota Rules Seite detailliert beschrieben. Zugegeben, bedingt durch die Leistungsfähigkeit der Tasmota Rules gerade für Neueinsteiger etwas umfassend, bzw. verwirrend. Diesbezüglich nachfolgend nachfolgend ein umfassendes Tasmota Rules Tutorial für Einsteiger, um ein eigenes aber notwendiges Verständnis zu Tasmota Rules zu entwickeln. Die meisten Tasmota Rules Tutorials beschreiben meist nicht Grundlagen, sondern stellen einzelne Beispiele dar, in der Hoffnung halbwegs passend für einen anderen Anwender zu sein. Meist fehlt es gänzlich an Grundlagen im Bezug Statement, Vergleiche in Kombination mit Expressions / Ausdrücke.

Im Zuge der „Drag and Drop Entwicklung“ – man muss lediglich die Suchmaschine bedienen können – und schon ist die gewünschte Lösung herbeigeführt, sprich der Arduino oder ESP tut genau so wie im Internet beschrieben.

Wie kann eine Künstliche Intelligenz etwas verstehen was man selbst nicht versteht?

Auch die Tasmota Rules wie wir sie in der ESP-OS Firmware verwenden, unterliegen einem üblichen Standard, es gibt

  • eine Syntax
  • Logik mittels Operatoren
  • If Statements / nennen wir es mal Feststellung von Zuständen
    • Expressions / Ausdrücke mittels mathematische Operatoren

Unter Berücksichtigung vorgenannter Grundlagen entsprechen Tasmota Rules lediglich einer gewissen Logik. An dieser Stelle sei erwähnt Tasmota Standard – Kompilierungen verfügen meist nur über Tasmota Rules, nicht über Tasmota Expression und Tasmota IF Statement! Die ESP-OS Firmware verfügt sowohl über die Tasmota Rules, als auch Tasmota Expressions sowie Tasmota IF Statements, diesbezüglich werden im nachfolgend Tasmota Rules Tutorial, auch die Möglichkeiten der Tasmota Rules Statements sowie der Tasmota Rules (Statement) Expression aufgezeigt . Die Tasmota Rules, insbesondere in Kombination mit Tasmota Expression und Tasmota IF Statement sind ein sehr mächtiges Werkzeug mit dem nahezu alles möglich ist. Es sei erwähnt, dieses Tasmota Rules Tutorial zielt darauf ab die Leistungsfähigkeit von Tasmota Rules zu vermitteln, nicht einfach meinen subjektiven Lösungsansatz in einer Tasmota Rule darzustellen.

Tasmota Rules ein Regelwerk für Smart Home Geräte

Im Grunde sagt die Überschrift auch schon alles, Tasmota Rules sind „einfache Regeln“ um smarte / intelligente Routinen auszuführen. Wie man aus dem Alltag weiß gibt es ganz einfache Regeln aber auch sehr komplexe Regeln, letztgenannte stehen dann in Abhängigkeit verschiedener Faktoren. Mit einer entsprechenden Auffassung, gepaart mit Intelligenz kann man selbst mit komplexen Regeln umgehen.

Tasmota Expression ein Ausdruck / eine Äusserung einer Auswertung eines Smart Home Gerätes

Misst ein Smart Home Temperatursensor die aktuelle Aussentemperatur, teilt er uns die aktuelle Temperatur beispielsweise über eine Anzeige mit. Im Alltag ist das vergleichbar mit dem Wetterbericht aus dem Radio, der Sprecher teilt uns mit „es ist heute -5°C kalt“.

Bringt man eine einfache Regel ins Spiel, sobald es Draussen kalt ist, warm anziehen sonst friert man!

Im Grunde basiert jede Regel auf einer Feststellung „Draussen kalt“ gepaart mit einer entsprechenden Handlung / Massnahme „warm anziehen“. Reduziert auf eine Regel für ein Smart Home Gerät, bzw. basiert auch eine Tasmota Rule auf einer Feststellung (Trigger) und führt ein Kommando / Tasmota Commands aus.

Tasmota Statement, was aber wenn

Letztendlich bleibt aber die Frage was ist kalt, angenehm, warm, oder heiß, im Grunde was ist

WENN es 8°C, 14°C, 25°C, … ist
WENN es schneit
WENN es später wärmer werden soll
WENN man die grüne Hose an hat

Tasmota Statement Expression, mit Operatoren Zustände auswerten

Warm anziehen, welche Jacke braucht man wenn es -5°C man 1 T-Shirt, 1 Sweatshirt, 1 Hoody Jacke anhat. Einfach Logik steht oft in direkter Verbindung mit mathematischer Operatoren, mittels einfacher Syntax in Form einfacher Formeln lassen sich Zustände exakt bestimmen, bzw. steuern.

Tasmota Rules Syntax

Die oben aufgeführten Grundlagen zu Tasmota Rules, bzw. abgeleiteten Beispiele erwecken wohl in Jedem den Gedanke „ist doch logisch“, logisch ja aber auf keinen Fall selbstverständlich. Denn genau hier, in der Selbstverständlichkeit liegt das Problem bei der Umsetzung von Tasmota Rules. Selbstverständlichkeit basiert nunmal auf etwas selbst verstehen (heisst nicht das es Jeder versteht) und nur wenn man die Tasmota Rules Syntax, in Kombination mit den verbundenen Elementen

  • Tasmota Trigger der Auslöser, aktueller Zustand
  • Tasmota Trigger Comparison Operator, Operator zur Herstellung eines Vergleichs
  • Tasmota Command, was gemacht werden soll wenn der aktuell, mittels Vergleichsoperator ausgewertete Zustand eintritt
    • mittels IF Statement mittels WENN weiter differenzieren um weitere Faktoren einzubeziehen
      • mittels Tasmota Expression, dem WENN mittels Vergleich einen Ausdruck verleihen (detailliert auswerten)

versteht, wird man auch im Stande sein das seinen Smart Home Geräten beizubringen

Tasmota Rules Beispiel

Nachfolgend ein einfaches Beispiel einer Tasmota Rule basierend auf 2 Modulen:

  1. EI-OT 1-wire Modul mit einem AM2301 Temperatur- und Luftfeuchtigkeits- Sensor, da wir über das Netzwerk kommunizieren möchten hat die IP Adresse http://192.168.178.63
  2. EI-OT 8 Kanal Relais Modul PRO, hat die IP Adresse http://192.168.178.58

Die Grundlage einer jeden Tasmota Rule bildet stets der eigene Überblick,

Was möchte man überhaupt mittels einer Tasmota Rule intelligent automatisieren!

In nachfolgendem Beispiel soll

  1. die Temperatur im Badezimmer mittels einer elektrischen Fußbodenheizung auf einer vorgegebenen Temperatur gehalten werden
  2. bei zu hoher Luftfeuchtigkeit ein Lüfter aktiviert werden

Für Jene die erkennen mögen „das geht doch auch mit dem 2 Kanal Relais“ sei angemerkt, viel Spaß beim Platzieren des Sensors und beim Verlegen des Kabels. Denn gerade bei Temperaturmessungen und insbesondere bei einer Messung der Luftfeuchte ist die Luftzirkulation elementar. Den AM2301 Sensor irgendwo, in irgendein Eck zu quetschen ist absolut sinnfrei, einen Lichtsensor packt man ja auch nicht in einen Karton und stellt ihn dann aufs Garagendach!

Des Weiteren soll anhand dieses Beispiels gezeigt werden das EI-OT Module auch ohne MQTT Broker miteinander kommunizieren können, bzw. möchte oftmals mittels Tasmota Rules mit unterschiedlichen Smart Home Geräten interagieren.

Bevor wir nun in die Umsetzung starten ein kleiner TIPP, eine verständliche Dokumentation macht Smart Home übersichtlich! Ich persönlich verwende am liebsten Tabellen, zum Einen bin ich schreibfaul und zum Anderen muss man da nicht viel lesen.

SensorTriggerAuslöserZustandKommando (an das 8 Kanal Relais PRO)
AM2301#Temperature<=24.5kaltschicke über das Netzwerk an http://192.168.178.58
Relais 3 an
AM2301#Temperature>24.5warmschicke über das Netzwerk an http://192.168.178.58
Relais 3 aus
AM2301#Humidity>30feuchtschicke über das Netzwerk an http://192.168.178.58
Relais 4 an
AM2301#Humidity<=30trockenschicke über das Netzwerk an http://192.168.178.58
Relais 4 aus

Die Zeile 1 in einfachen Worten:
SOBALD AM2301 Messwert Temperatur kleiner oder gleich 24,5°C dann ist es kalt, tu an das 8 Kanal Relais PRO den Befehl schicken um das Relais3 einzuschalten

das Ganze mal in englisch
ON AM2301 reading Temperatur lesser than or equal to 24.5°C its cold, 8 channel Relais PRO do switch on Relais 3 ON

Bevor wir nun in die Tasmota Rules Syntax übersetzen, grundlegende Regeln zu den Tasmota Rules

  • ganz gleich welche Sprache das Webinterface der Firmware hat, DIE SPRACHE DER Tasmota Rules IST STETS ENGLISCH, nicht Temperatur sondern Temperature
  • das Dezimaltrennzeichen ist immer ein . Punkt
  • innerhalb von http Kommandos gibt es keine Leerzeichen, bzw. sind Leerzeichen HTTP konform durch %20 zu ersetzen

das Ganze mal gekürzt auf Tasmota Rule Syntax
ON AM2301#Temperature<=24.5 DO WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On ENDON

das war auch schon die erste von 4 Regeln sobald die Temperature kleiner oder gleich 24,5°C ist wird nun der Befehl Relais 3 AN über das HTTP Prokoll an die IP Adresse 192.168.178.58 geschickt.

Bevor wir nun die anderen 3 Regeln dazu packen hier noch ein wichtiger Hinweis zur Tasmota Rules Syntax

ON AM2301#Temperature<=24.5 DO WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On ENDON

Jede Tasmota Rule beginnt mit ON und endet mit ENDON mit einfachen Worten jeder festzustellende Zustand wird beginnend mit ON und endend mit ENDON gekennzeichnet.

Somit erweitert sich die vorgenannte Tasmota Rule
ON AM2301#Temperature<=24.5 DO WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDON

durch
ON AM2301#Temperature>24.5 DO WebQuery http://192.168.178.58/cm?&cmnd=Power3%20Off GET ENDON
ON AM2301#Humidity>30 DO WebQuery http://192.168.178.58/cm?&cmnd=Power4%20On GET ENDON
ON AM2301#Humidity<=30 DO WebQuery http://192.168.178.58/cm?&cmnd=Power4%20Off GET ENDON

Das Ganze muss nur noch als Rule

  • Rule1
  • Rule2
  • Rule3

Tasmota Rules unterstützt bis zu 3 Rules mit je maximal 1000 Zeichen. Tasmota Rules werden direkt über die Konsole des Webinterface eingegeben, zusammenfassend würde der Eintrag in die Kommandozeile wie nachfolgend aussehen

Rule1 ON AM2301#Temperature<=24.5 DO WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDON 
ON AM2301#Temperature>24.5 DO WebQuery http://192.168.178.58/cm?&cmnd=Power3%20Off GET ENDON 
ON AM2301#Humidity>30 DO WebQuery http://192.168.178.58/cm?&cmnd=Power4%20
On GET ENDON ON AM2301#Humidity<=30 DO WebQuery http://192.168.178.58/cm?&cmnd=Power4%20Off GET ENDON

aussehen. Für Jene die jetzt meinen ihre Basis für eine Rule gefunden zu haben, bzw. mit entsprechenden Änderungen die obige Tasmota Rule für ihren Einsatz in Funktion zu setzen, empfehle ich zumindest den nächsten Absatz zu lesen. Wie bereits Eingangs erwähnt dies soll kein Tasmota Rules Cookbook sein sondern ein Tasmota Rules Tutorial um sein eigenes Verständnis zu entwickeln.

Warum Tasmota If Statement und Tasmota Expression

Ja auch ich zähle zur Gattung „Ich habe fertig“ aber unter genauer Betrachtung des bisherigen Tasmota Rules Tutorial und den innerhalb des vorgenannten Tasmota Rule festgelegten Zustände, im Detail

ON (SOBALD) die Temperatur =< oder > 24,5°C bzw. die Luftfeuchtigkeit <=30 oder >30 ist, im Grunde sobald die Sensordaten ermittelt werden, wird das jeweilig hinterlegte Kommando ausgeführt. Ganz praktisch ausgedrückt also ständig, rund alle 2-3 Sekunden wird nun ein der Webquery Befehl über HTTP an das 8 Kanal PRO Relais gesendet, ganz gleich ob das jeweilige Relais nun bereits an oder aus ist.

10:21:33.528 RUL: AM2301#TEMPERATURE>24.5 performs "WebQuery http://192.168.178.58/cm?&cmnd=Power3%20Off GET"
10:21:33.599 RSL: RESULT = {"WebQuery":"Done"}
10:21:33.613 RUL: AM2301#HUMIDITY>30 performs "WebQuery http://192.168.178.58/cm?&cmnd=Power4%20On GET"
10:21:33.699 RSL: RESULT = {"WebQuery":"Done"}
10:21:35.474 RUL: AM2301#TEMPERATURE>24.5 performs "WebQuery http://192.168.178.58/cm?&cmnd=Power3%20Off GET"
10:21:35.547 RSL: RESULT = {"WebQuery":"Done"}
10:21:35.563 RUL: AM2301#HUMIDITY>30 performs "WebQuery http://192.168.178.58/cm?&cmnd=Power4%20On GET"
10:21:35.647 RSL: RESULT = {"WebQuery":"Done"}
10:21:37.331 RUL: AM2301#TEMPERATURE>24.5 performs "WebQuery http://192.168.178.58/cm?&cmnd=Power3%20Off GET"
10:21:37.422 RSL: RESULT = {"WebQuery":"Done"}
10:21:37.437 RUL: AM2301#HUMIDITY>30 performs "WebQuery http://192.168.178.58/cm?&cmnd=Power4%20On GET"
10:21:37.473 RSL: RESULT = {"WebQuery":"Done"}

Mag zunächst nicht allzu schlimm wirken, unter Anbetracht des Energieverbrauchs aber ein Unding, man läßt ja ein selbstfahrendes Auto auch nicht die ganz Zeit auf dem Hof im Kreis fahren, insbesondere wenn man weiß das ein ESP8266 beim Senden und Empfangen über WLan den höchsten Energieverbrauch hat.

Bereits die einfache Logik sagt einem WENN das Relais schon den gewünschten Zustand hat muss der Befehl nicht ständig gesendet werden. Erweitert man nun die Tasmota Rule um eine Auswertung, im Detail durch ein Tasmota If Statement mit einem entsprechender Tasmota Expression so kann man diesen Umstand unterbinden.

Vom Verständnis her beginnt man hier umgekehrt, also welchen Zustand kann man feststellen Relais ist bereits an oder aus, in Kombination mit der Frage WENN, mit einfachen Worten WENN RELAIS3 AN dann …

An dieser Stelle mag man zunächst gewillt sein den Status des jeweiligen Relais abzufragen, naja da hätten wir das gleiche Problem, lediglich der Inhalt der HTTP Nachricht wäre ein anderer.

Hierzu verwendet man eine Variable Tasmota Rules unterstützt bis zu 16 Variablen (var1 bis var16), sprich es wird ein Wert gesetzt der Aufschluss gibt welchen Zustand das jeweilige Gerät / Relais hat. Der Einfachheit verwenden wir 2 Variablen, Var3 für den aktuellen Status Relais3 und Var4 für den aktuellen Status von Relais4

Var3=0 alle Relais aus
Var3=1 Relais3 ist an
Var4=0 Relais 4 ist aus
var4=1 Relais4 ist an

Bleibt noch die Tasmota Rules Syntax im Bezug von Variablen

  • Var3 0 setzt den Wert der Variablen Var3 auf 0 (nein hier wurde kein = vergessen, der Variablen Bezeichner gefolgt von einem Leerzeichen und dem Wert
  • %Var3% fragt den jeweiligen Wert der Variablen Var3 ab und gibt diesen zurück

Vor dem Weiterlesen BITTE verinnerlichen

Var1=Wert falsch
Var1 Wert richtig

http://192.168.178.63/cm?&cmnd=Var3  %Var3% GET falsch keine Leerzeichen sondern %20

Hier kommt unsere Logik, für uns ist Var1=1 mit der Syntax in Konflikt, aber die Syntax muss nunmal eingehalten werden

Zur obigen Syntax bzw. Fehler ein einfaches Beispiel sobald Var1 in der Tasmota Konsole aufgerufen wird, soll der Wert von Var1 auf „Das ist der Wert von Var1“ gesetzt werden

Rule2 ON Var1 DO Var1=Das ist der Wert von Var1 ENDON

ruft man nun Var1 über die Tasmota Konsole auf wird die Rule ausgeführt und in der Tasmota Konsole wie folgt ausgegeben

07:45:44.868 CMD: Var1
07:45:44.874 RSL: RESULT = {"Var1":""}
07:45:44.887 RUL: VAR1 performs "Var1=Das ist der Wert von Var1"
07:45:44.893 RSL: RESULT = {"Var1":"0.000"}

Alles wird brav ausgeführt, jedoch ist Var1 mit dem Wert 0 versehen!

Nachfolgend das ganze einmal richtig, ALSO OHNE =

Rule2 ON Var1 DO Var1 Das ist der Wert von Var1 ENDON

07:47:44.978 CMD: Var1
07:47:44.983 RSL: RESULT = {"Var1":""}
07:47:44.996 RUL: VAR1 performs "Var1 Das ist der Wert von Var1"
07:47:44.001 RSL: RESULT = {"Var1":"Das ist der Wert von Var1"}

Die Variable Var1 hat nun den Wert „Das ist der Wert von Var1“

Aber zurück zu unserer eigentlichen Tasmota Rule, jetzt haben wir ja noch den Zustand Trigger der erstmal notwendig ist SOBALD um einen Befehl auszuführen. Grundlegend gilt dabei zu berücksichtigen, die Auswertung von Tasmota IF Statements sind Tasmota Commands, mit einfachen Worten Tasmota IF Statements sind keine Trigger und werden stets in das Kommando einer Tasmota Rule gepackt. Mehrere Tasmota Commands können durch ein ; Semikolon durch vorangestellten Befehl Backlog zusammengefasst werden. Eine Ausnahme bilden dabei IF Statements, obgleich Statements auch Commands sind können diese nicht mittels Backlog zusammengefasst werden, sondern müssen in einem separaten ON … ENDON abgearbeitet bzw. einer Rule angehängt werden.

Wie im Vorfeld mal wieder eine Tabelle

SensorTriggerAuslöserZustandKommando (an das 8 Kanal Relais PRO)
AM2301#Temperature<=24.5kaltWENN (%Var3%==0);
schicke über das Netzwerk an http://192.168.178.58
Relais 3 an;
setze Var3 auf 1 aktueller Zustand Relais
AM2301#Temperature>24.5warmWENN (%Var3%==1);
schicke über das Netzwerk an http://192.168.178.58
Relais 3 aus;
setze Var3 auf 0 aktueller Zustand Relais
AM2301#Humidity>30feuchtWENN (%Var4% ist kleiner 1);
schicke über das Netzwerk an http://192.168.178.58
Relais 4 an;
setze Var4 auf 1 aktueller Zustand Relais
AM2301#Humidity<=30trockenWENN (%Var4% ist größer als 0);
schicke über das Netzwerk an http://192.168.178.58
Relais 4 aus;
setze Var4 auf 0 aktueller Zustand Relais

Basierend auf so manchen Tasmota Rules Tutorials im Netz mag das schon ganz nett ausschauen, denn Var3 und Var4 werden zwar ausgewertet und das entsprechende Kommando an das 8 Kanal PRO Relais nur bei Änderung gesendet. Beim Setzen des aktuellen Zustands von Var3 und Var4 wird offensichtlich dass diese Lösung nicht praktikabel ist, denn ob der Zustand des Relais wirklich der jeweiligen Variablen entspricht sei dahingestellt.

Wie bereits Eingangs erwähnt sollen hier die Anforderungen einen Tasmota Rules Tutorial erfüllt werden, um ein Verständnis zu entwickeln, daher

Es ist weniger sinnvoll einem Modul dass Temperatur und Luftfeuchtigkeit überwachen soll, die Überwachung von Relais mittels Tasmota Rules zuzuschreiben.

Zielführend ist es vielmehr, eine wirkliche Interaktion beider Module herbeizuführen und insbesondere dem 8 Kanal PRO Relais die Überwachung der Relais mittels einer Tasmota Rule zuzuschreiben. Mit einfachen Worten

  1. die Variablen Var3 Var4 sind zwar im 1-wire Modul implementiert und werden auch dort mittels Tasmota Rules ausgewertet
    1. nur wenn der aktuelle Zustand des Relais geändert werden muss, wird der Befehl zum Schalten des Relais über http an das 8 Kanal Relais gesendet
  2. die Variablen Var3 und Var4 werden aber durch das 8 Kanal Relais Modul gesetzt
    1. sobald der Zustand eines Relais geändert wird, werden die Variablen Var3 und Var4 des 1-wire Moduls aktualisiert

Die Tasmota Rules des 8 Kanal Relais, ist nur eine Zwischenlösung diesbezüglich nur zum Verständnis

SensorTriggerAuslöserZustandKommando (an das 1-Wire Modul)
Relais3status1kaltsetze
Var3 auf 1
Relais3status0warmsetze
Var3 auf 0
Relais3schicke über das Netzwerk an http://192.168.178.63
Var3 mit dem aktuellen Wert
Relais4status1feuchtsetze
Var4auf 1
Relais4status0trockensetze
Var4auf 1
Relais4schicke über das Netzwerk an http://192.168.178.63
Var4 mit dem aktuellen Wert

Somit resultiert folgende Rule für das 8 Kanal Pro Relais, zu beachten ist hier der Unterschied zwischen SOBALD / ON und Trigger. Sobald Relais3 egal ob an oder aus wird das Kommando zum Senden der Variable 3 ausgeführt.

zunächst wird lediglich die Variable Var3 gesetzt
ON Power3#state=1 DO Var3 1 ENDON ON Power3#state=0 DO Var3 0 ENDON
und jedesmal wenn das Relais3 (Power3) geschaltet wird, soll die Variable Var3 geschickt
ON Power3 DO WebQuery http://192.168.178.63/cm?&cmnd=Var3%20%Var3% GET ENDON

das Gleiche nun für Relais4 also Var4
ON Power4#state=1 DO Var4 1 ENDON ON Power4#state=0 DO Var4 0 ENDON
und jedesmal wenn das Relais4 (Power4) geschaltet wird, soll die Variable Var4 geschickt
ON Power4 DO WebQuery http://192.168.178.63/cm?&cmnd=Var4%20%Var4% GET ENDON

die vorgenannte Tasmota Rule nachfolgend zusammengefasst als Rule1

Rule1 ON Power3#state=1 DO Var3 1 ENDON ON Power3#state=0 DO Var3 0 ENDON ON Power3 DO WebQuery http://192.168.178.63/cm?&cmnd=Var3%20%Var3% GET ENDON 
ON Power4#state=1 DO Var4 1 ENDON ON Power4#state=0 DO Var4 0 ENDON 
ON Power4 DO WebQuery http://192.168.178.63/cm?&cmnd=Var4%20%Var4% GET ENDON

Sobald vorgenannte Rule1 über die Kommandozeile gesetzt und aktiviert wurde, sendet nun das 8 Kanal Pro Relais über HTTP an das 1-Wire Modul den aktuellen Status des jeweiligen Relais,

  • Var3=Status Relais3
  • Var4=Status Relais4

Sobald man nun Relais3 oder Relais4 schaltet, wird der aktuelle Relais Status an das 1-Wire Modul übergeben und in der Console ausgegeben

07:42:49.380 RSL: SENSOR = {„Time“:“2022-03-27T07:42:49″,“AM2301″:{„Temperature“:24.1,“Humidity“:25.8,“DewPoint“:3.2},“TempUnit“:“C“}
07:45:15.131 RSL: RESULT = {„Var3″:“1.000“}
07:45:22.437 RSL: RESULT = {„Var3″:“0.000“}
07:45:28.057 RSL: RESULT = {„Var4″:“1.000“}
07:45:39.706 RSL: RESULT = {„Var4″:“0.000“}

Im Detail werden nun die Variable der Relais durch das 8 Kanal Pro Relais verwaltet, das heisst das 1-Wire Modul muss nur noch die Variablen auswerten um dann gegebenenfalls den HTTP Befehl zum Schalten des Relais zu senden.

SensorTriggerAuslöserZustandKommando (an das 8 Kanal Relais PRO)
AM2301#Temperature<=24.5kaltWENN (%Var3%==0);
schicke über das Netzwerk an http://192.168.178.58
Relais 3 an
AM2301#Temperature>24.5warmWENN (%Var3%==1);
schicke über das Netzwerk an http://192.168.178.58
Relais 3 aus
AM2301#Humidity>30feuchtWENN (%Var4% ist kleiner 1);
schicke über das Netzwerk an http://192.168.178.58
Relais 4 an
AM2301#Humidity<=30trockenWENN (%Var4% ist größer als 0);
schicke über das Netzwerk an http://192.168.178.58
Relais 4 aus

Somit ergibt sich folgende Tasmota Rule
ON AM2301#Temperature<=24.5 DO IF(%var3%==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDIF ENDON
ON AM2301#Temperature>24.5 DO IF(%var3%==1) WebQuery http://192.168.178.58/cm?&cmnd=Power3%20Off GET ENDIF ENDON
ON AM2301#Humidity>30 DO IF(%var4%==0) WebQuery http://192.168.178.58/cm?&cmnd=Power4%20On GET ENDIF ENDON
ON AM2301#Humidity<=30 DO IF(%var4%==1) WebQuery http://192.168.178.58/cm?&cmnd=Power4%20Off GET ENDIF ENDON

Beispielsweise, sinkt die Temperatur unter 24,5°C wird nun dann der Befehl zum Einschalten des Relais3 an das 8 Kanal PRO Relais nur gesendet WENN der Wert Var3 gleich 0 ist. Das Ganze sowie die Interaktion wird über die Konsole des 1-Wire Moduls dargestellt

08:06:05.113 RUL: AM2301#TEMPERATURE<24.5 performs "IF(0.000==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDIF"
08:06:05.119 RSL: RESULT = {"If":"Done"}
08:06:05.410 RSL: RESULT = {"WebQuery":"Done"}
08:06:05.493 RSL: RESULT = {"Var3":"1.000"}
  • 08:06:05.119 wurde ein If Statement ausgeführt
  • 08:06:05.410 WebQuery wurde ausgeführt, also Relais schalten an 8 Kanal Relais Pro gesendet
  • 08:06:05.493 die Variable Var3 wurde aktualisiert, wurde vom 8 Kanal Relais PRO Modul gesendet

Das ganze sieht auf den ersten Blick ganz nett aus, zudem tut das Ganze auf den ersten Blick auch wie es soll.

Tasmota Rules und typische Fehler

Betrachtet man sich das Ganz mal kurz im Detail erkennt man ein „kleines“ Problem

Denn nur WENN der Status der Var3 oder Var4 erfüllt ist wird das Kommando ausgeführt!

Als Beispiel die Temperatur des AM2301 ist unter 24,5°C das Relais 3 wird eingeschaltet, die Variable Var3=1, soweit so gut was aber wenn in diesem Zustand die Module neu starten, sei es durch einen Stromausfall, einem Speicherüberlauf, … und schon sind wir im Nirvana. Sobald beide Module wieder laufen sieht man in der Konsole des

1-Wire Moduls bei jeder Messwertaktualisierung wird auch das Kommando über HTTP gesendet

08:45:44.577 RUL: AM2301#TEMPERATURE<24.5 performs "IF(==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDIF"
08:45:44.584 RSL: RESULT = {"If":"Done"}
08:45:44.913 RSL: RESULT = {"WebQuery":"Done"}
08:45:46.390 RUL: AM2301#TEMPERATURE<24.5 performs "IF(==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDIF"
08:45:46.396 RSL: RESULT = {"If":"Done"}
08:45:46.700 RSL: RESULT = {"WebQuery":"Done"}

8 Kanal Pro Relais Modul empfängt gleichermaßen das Kommando über HTTP

08:45:44.656 RSL: RESULT = {"POWER3":"ON"}
08:45:44.658 RSL: POWER3 = ON
08:45:46.455 RSL: RESULT = {"POWER3":"ON"}
08:45:46.458 RSL: POWER3 = ON

Wer nun meint das hier die Tasmota Rules etwas falsch machen, weit gefehlt. Die Rules funktionieren sogar perfekt und agieren genauso wie sie sollen aber das hinterlegte if statement wird nicht richtig erfüllt. Fragt man den aktuellen Wert von Var3 über die Konsole des 1-wire-Moduls ab indem man Var3 in die Kommandozeile eingibt erhält man

08:53:47.464 CMD: Var3
08:53:47.469 RSL: RESULT = {"Var3":""}

einen leeren String „“, (sollte aber 1 sein) dieser wird aber durch das Tasmota IF Statement nicht erfasst und schon garnicht abgeglichen. Im Detail betrachtet haben wir mittels der Tasmota IF Statements einen Umschalter in Abhängigkeit der Variablen und der letzte aktuelle Zustand war Relais3 ON, aber der Wert var3 ist gleich „“. Hierzu addiert sich dass die Tasmota Grundeinstellung, so auch beim 8 Kanal PRO Relais setoption0 aktiv ist.

06:17:36.549 CMD: setoption0
06:17:36.553 RSL: RESULT = {"SetOption0":"ON"}

Das heisst sobald das 8 Kanal Relais von der Versorgungsspannung getrennt wird, wird der vorherige / letzte aktive Zustand bei erneuter Spannungsversorgung wieder hergestellt. Denn das 8 Kanal Relais Modul behält den aktuellen Status, z.B. ON aber der Wert dafür ist im 1-Wire Modul nicht vorhanden.

Typische Tasmota Rules Probleme

In Anlehnung an vorgenannte Situation entstehen oft, im wahrsten Sinne des Wortes Missverständnisse zwischen Anwender und Tasmota Rules. Der durch Tasmota Rules definierte Zustand ist nicht gegeben, die Tasmota Rule / Regel wird nicht erfüllt, es kommt zu Fehlfunktionen.

Ein einfaches Mittel wäre einfach den richtigen Wert der Variable mittels Tasmota Konsole und Kommandozeile zu setzen, z.B. Var3 1 und Var4 0, also der aktuelle Zustand der durch das 8 Kanal Relais erfüllt wird.

Sobald der durch die Tasmota Rule überprüfbare Wert / Werte vorhanden sind, erfüllt die Tasmota Rule ihre Aufgabe wie festgelegt.

Zwar versetzt das die gewünschte Interaktion wieder in Gang ist aber weder praktikabel und auf keinen Fall intelligent oder smart. Hier wäre es ratsam die Option setoption0 zu deaktivieren, indem man

SetOption0 0

in die Kommandozeile der Tasmota Konsole eingibt und deaktiviert. Beim einem Neustart sind nun alle Relais des 8 Kanal Relais PRO inaktiv und die Tasmota Rule kann erfüllt werden. Diese Option soll aber lediglich aufzeigen dass es stets eine Vielzahl von Lösungsansätzen gibt – ich persönlich deaktiviere sogar stets SetOption0 – möchte aber in Erinnerung rufen hier handelt es sich um ein Tasmota Rules Tutorial um sein eigenes Verständnis zu entwickeln.

Dementsprechend, bevor man nun zu anderen Mitteln greift, einfach auf das eigentliche Problem fokussieren, der Wert der Variable ist nicht vorhanden und auf Tasmota Rules setzen um dieses Problem zu lösen.

Tasmota Rules Operatoren

Genauer gesagt und für das bessere Verständnis sollte man die Tasmota Rules Operatoren als Vergleichsoperatoren verinnerlichen.

Vergleichs-
Operator
Funktion
=ist gleich für den Vergleich von Strings / Text
==ist gleich für den Vergleich von numerischen Werten
>größer als
<kleiner als
!=ungleich für den Vergleich von numerischen Werten
>=ist größer oder ist gleich
<=ist kleiner oder ist gleich
$<String / Text beginnt mit
$>String / Text endet mit
$|String / Text enthält
$!String / Text ist ungleich
$^String / Text enthält nicht
|Modulo Division mit Rest / exakte Division Rest = 0
Tasmota Rule Trigger Vergleichsoperatoren

Wichtig, die vorgenannten Vergleichsoperatoren sind Tasmota Rules Vergleichsoperatoren, wie bereits verwendet in AM2301 Temperaturvergleich kleiner oder ist gleich

ON AM2301#Temperature<=24.5 DO IF(%var3%==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDIF ENDON

nicht zu verwechseln mit den folgenden Tasmota Statement / Tasmota Expression Vergleichsoperatoren

Vergleichs-
Operator
Funktion
=ist gleich für den Vergleich von Strings / Text
==ist gleich für den Vergleich von numerischen Werten
>größer als
<kleiner als
!=ungleich für den Vergleich von numerischen Werten
>=ist größer oder ist gleich
<=ist kleiner oder ist gleich
|OR / oder
Tasmota Rules Statement / Expressions Vergleichsoperatoren

Auch diese haben wir bereits in unserem Beispiel zum Vergleich der Variablen Var3 und Var4 verwendet

ON AM2301#Temperature<=24.5 DO IF(%Var3%==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDIF ENDON

Die vorgenannten Tasmota Rules Expression Vergleichsoperatoren werden stets in Kombination mit einem Tasmota Statement zu einem direkten Vergleich

StatementBeschreibung
IFWenn
ELSEIFWennNicht, der Vergleich durch IF(WENN) wurde nicht erfüllt
ELSESONST wenn weder der Vergleich durch IF(WENN) und/oder der Vergleich von ELSEIF (WennNicht) erfüllt wurde
Tasmota Rules Statement / Vergleich

In Anbetracht der verfügbaren Vergleichsoperatoren, genügend Spielraum für eine passende Lösung unseres bestehenden Problems und zwar alleinig basierend auf Tasmota Rules.

Tasmota Rules Statement

Zugegeben die Lösung ist im Grunde sehr einfach, aber in einem Tasmota Rules Tutorial sollte durchaus auch die Tasmota Rules Statement Syntax erwähnt werden. Dementsprechend wird das bestehende Problem durch ein etwas komplexeres Tasmota Rules Statement gelöst.

Das Problem des fehlenden, zu interpretierenden Wertes könnte eventuell mittels ELSEIF Statement gelöst werden. Derzeit überprüfen wir lediglich die Werte 0 oder 1, ist die Variable Var3 oder Var4 nicht gesetzt, gibt die Variable „“ (einen leeren String) zurück, bzw. fragt man in der Tasmota Konsole die Variable durch Eingabe von Var3 in der Kommandozeile ab wird

10:17:18.074 CMD: Var3
10:17:18.079 RSL: RESULT = {"Var3":""}

zurückgegeben, das läßt zunächst den Schluss zu, es muss das bestehende Tasmota Rules Statement

ON AM2301#Temperature<=24.5 DO IF(%Var3%==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDIF ENDON

entsprechend erweitert werden, beispielsweise durch ELSEIF WENN Var3 nicht gleich 0 ist

ON AM2301#Temperature<=24.5 DO IF(%Var3%==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET {ELSEIF (%Var3%=““) Var3 0}ENDIF ENDON

Im Detail nun soll wenn die Variable Var3 „“ (ein leerer String) soll die Variable Var3 auf 0 gesetzt werden, sodass bei der nächsten Rückgabe der Temperatur das Tasmota Statement IF / WENN ausgeführt wird. Ich kürze einmal ab, diese Lösung wird nicht funktionieren, auch wenn man das Allrounder Werkzeug ELSE in Form von

ON AM2301#Temperature<=24.5 DO IF(%Var3%==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET {ELSEIF (%Var3%=““) Var3 0} [ELSE Var3=0] ENDIF ENDON

angehängt wird.

Was aber bleibt ist die korrekte Tasmota Rules Statement und Expression Syntax wie folgt

IF(Expression/der erste Haupt-Vergleich) gefolgt vom dazugehörigen Kommando {ELSEIF(Expression, der zweite Vergleich) gefolgt vom dazugehörigen Kommando} {ELSEIF(Expression, der dritte Vergleich) gefolgt vom dazugehörigen Kommando} {ELSEIF(Expression, der …. Vergleich) gefolgt vom dazugehörigen Kommando} [ELSE gefolgt vom dazugehörigen Kommando] ENDIF

Umgang mit Tasmota Rules Variablen

Neben den bereits erwähnten Variablen Var1 bis Var16, gibt es zusätzlich die Variablen Mem1 bis Mem16. Im Vergleich zu den Var Variablen Typen, werden die Werte der Mem Variablen Typen im Flash Speicher abgelegt, sodass die Werte der Mem Variablen auch nach einem Reboot / Neustart des ESP8266 vorhanden sind.

Grundlegend sollten beide Typen als eine Art Werte Container betrachtet werden, das heisst erst nachdem eine Variable initiiert wurde, also durch ein Wert gesetzt wurde, kann die Variable, beispielsweise durch %var3% abgefragt werden. Wurde die Variable nicht initiiert besteht lediglich der Container, eine Abfrage eines Wertes ist nicht möglich.

In Anbetracht des begrenzten Speichers eines ESP8266, durchaus eine wichtige Vorgehensweise.

Diesbezüglich kann, ganz gleich in welcher Form man die Variable Var3 oder Var4 abfragt keinen überprüfbaren Wert liefern. Wobei eine Option wäre zu erwähnen, nennen wir es eine Art Variablen Initiierung

ON AM2301#Temperature<=24.5 DO IF(%Var3%==%Var4%) Var3 30; Var4 40 {ELSEIF ((%Var3%==30)) WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET } ENDIF ENDON

Zwar eine untypische Vorgehensweise und sollte in unserem Beispiel keineswegs als Lösungsansatz in Betracht gezogen werden. Hin und wieder aber ein kleiner Helfer um einen etwaigen „Grundzustand“ zu erkennen.

Tasmota Rules Trigger

Bevor ich hier eine endlose Liste über Tasmota Rules Trigger darstelle sei auf die Beispiele auf der Tasmota Github Seite verwiesen, bzw. reduziere ich mich auf massgebliche System Trigger.

Tasmota Rules Trigger die nach aktuellem Systemstatus aktiviert werden

TriggerAusführung Beschreibung
Http#Initializedwird ausgeführt sobald die HTTP Verbindung aktiv ist
Mqtt#Connectedwird ausgeführt sobald eine Verbindung zum MQTT Broker hergestellt wurde
Mqtt#Disconnectedwird ausgeführt sobald eine Verbindung zum MQTT Broker unterbrochen wurde
Power?#Bootwird innerhalb von System#Init, direkt vor dem System#Boot ausgeführt also auch bevor eine MQTT oder HTTP Verbindung hergestellt wurde, direkt nachdem das System initialisiert wurde (das ? dient als Platzhalter für das jeweilige Relais)
Switch?#Bootwird innerhalb von System#Init, direkt vor dem System#Boot ausgeführt also auch bevor eine MQTT oder HTTP Verbindung hergestellt wurde, direkt nachdem das System initialisiert wurde (das ? dient als Platzhalter für das jeweilige Relais)
System#Bootwird direkt nach der System Initialisierung ausgeführt, nachdem HTTP, als auch eine MQTT Verbindung hergestellt wurde
System#Savewird ausgeführt nachdem ein Neustart aktiviert wurde und die jeweiligen System Parameter im Flashspeicher abgelegt / aktualisiert werden
Time#Initializedwird ausgeführt sobald NTP initialisiert und die Systemzeit mit dem NTP Server synchronisiert wurde
Time#Setwird stündlich, bei Synchronisierung der Systemzeit mit dem NTP Server ausgeführt
Wifi#Connectedwird ausgeführt sobald eine WLan Verbindung hergestellt wurde
Wifi#Disconnectedwird ausgeführt sobald eine WLan Verbindung unterbrochen wurde
Tasmota Rules System Status Trigger

Zusätzlich kann so ziemlich Alles was in der Tasmota Konsole erscheint und abgefragt werden kann als Trigger eingesetzt werden, selbst eine Variable

Hierzu ein einfaches Beispiel mittels der Variablen Var1

Rule1 ON Var1 DO IF(%Var1%==0) Var1 1{ELSEIF (%Var1%==1) Var1 123} [ELSE Var1=1000] ENDIF ENDON

Fügt man die Rule1 über die Kommandozeile der Tasmota Konsole ein und aktiviert diese mittels Rule1 1

12:55:05.982 CMD: Rule1 ON Var1 DO IF(%Var1%==0) Var1=1{ELSEIF (%Var1%==1)  Var3=123} [ELSE Var1=1000] ENDIF ENDON
12:55:05.988 RUL: Stored uncompressed, would compress from 90 to 83 (-8%)
12:55:05.992 RSL: RESULT = {"Rule1":{"State":"ON","Once":"OFF","StopOnError":"OFF","Length":90,"Free":421,"Rules":"ON Var1 DO IF(%Var1%==0) Var1=1{ELSEIF (%Var1%==1)  Var3=123} [ELSE Var1=1000] ENDIF ENDON"}}
12:56:46.984 CMD: Rule1 1
12:56:46.990 RSL: RESULT = {"Rule1":{"State":"ON","Once":"OFF","StopOnError":"OFF","Length":90,"Free":421,"Rules":"ON Var1 DO IF(%Var1%==0) Var1=1{ELSEIF (%Var1%==1)  Var3=123} [ELSE Var1=1000] ENDIF ENDON"}}

gibt man nun Var1 in die Kommandozeile ein wird der Trigger ON Var1 aktiviert

13:10:45.795 CMD: Var1
13:10:45.800 RSL: RESULT = {"Var1":""}
13:10:45.812 RUL: VAR1 performs "IF(==0) Var1=1{ELSEIF (==1)  Var1=123} [ELSE Var1=1000]  ENDIF"
13:10:45.817 RSL: RESULT = {"If":"Done"}
13:10:46.044 RSL: RESULT = {"Var1":"1.000"}
13:10:46.060 RUL: VAR1 performs "IF(1.000==0) Var1=1{ELSEIF (1.000==1)  Var1=123} [ELSE Var1=1000]  ENDIF"
13:10:46.066 RSL: RESULT = {"If":"Done"}
13:10:46.078 RUL: VAR1 performs "IF(1.000==0) Var1=1{ELSEIF (1.000==1)  Var1=123} [ELSE Var1=1000]  ENDIF"
13:10:46.084 RSL: RESULT = {"If":"Done"}
13:10:46.295 RSL: RESULT = {"Var1":"123.000"}
13:10:46.307 RUL: VAR1 performs "IF(123.000==0) Var1=1{ELSEIF (123.000==1)  Var1=123} [ELSE Var1=1000]  ENDIF"
13:10:46.313 RSL: RESULT = {"If":"Done"}
13:10:46.326 RUL: VAR1 performs "IF(123.000==0) Var1=1{ELSEIF (123.000==1)  Var1=123} [ELSE Var1=1000]  ENDIF"
13:10:46.331 RSL: RESULT = {"If":"Done"}
13:10:46.545 RSL: RESULT = {"Var1":"1000.000"}
13:10:46.557 RUL: VAR1 performs "IF(1000.000==0) Var1=1{ELSEIF (1000.000==1)  Var1=123} [ELSE Var1=1000]  ENDIF"
13:10:46.563 RSL: RESULT = {"If":"Done"}
13:10:46.580 RUL: VAR1 performs "IF(1000.000==0) Var1=1{ELSEIF (1000.000==1)  Var1=123} [ELSE Var1=1000]  ENDIF"
13:10:46.587 RSL: RESULT = {"If":"Done"}
13:10:46.796 RSL: RESULT = {"Var1":"1000.000"}
13:10:46.808 RUL: VAR1 performs "IF(1000.000==0) Var1=1{ELSEIF (1000.000==1)  Var1=123} [ELSE Var1=1000]  ENDIF"
13:10:46.815 RSL: RESULT = {"If":"Done"}
13:10:46.827 RUL: VAR1 performs "IF(1000.000==0) Var1=1{ELSEIF (1000.000==1)  Var1=123} [ELSE Var1=1000]  ENDIF"
13:10:46.833 RSL: RESULT = {"If":"Done"}
13:10:47.045 RSL: RESULT = {"Var1":"1000.000"}
...... ENDLOS

und die obige Routine ausgeführt,

13:10:46.044 IF wird überprüft Var1 entspricht 0 somit wird 1 gesetzt
13:10:46.295 ELSEIF wird überprüft da Var1 == 1 Var1 wird auf 123 gesetzt
13:10:46.545 ELSE wird ausgeführt da weder 0 (also IF) noch 1 (also ELSEIF) erfüllt wird Var1 auf 1000 gesetzt, ab da habe ich den Text rot markiert denn durch Rule1 wurde nun eine endlose Schleife ausgelöst, denn der Trigger ist Var1 und der Wert ist weder 0 noch 1
Dieses Beispiel soll lediglich aufzeigen sowohl ein Trigger als auch ein ELSE Statement sollte stets mit Bedacht verwendet werden. An dieser Stelle sei auch im Bezug auf den umsichtigen Umgang mit den archivierten Mem1 bis Mem16, welche Werte im Flash Speicher ablegen, wird hier eine Endlosschleife erzeugt hilft oftmals nur noch ein komplettes Reset auf Grundeinstellungen.

Betrachtet man sich die die Tasmota Konsole Ausgabe einmal im Detail, insbesondere die roten Zeilen 2 bis 5 erkannt man Var1 wird als Var1:““ zurückgegeben und das IF Statement WENN Var1==0 wird ausgeführt!

Typischerweise gibt es in der Informatik einen Wert NULL, dieser dient der Kennzeichnung von nicht vorhandenen Containern wie beispielsweise Variablen. Üblicherweise wird der Wert NULL strikt behandelt, das heißt NULL ist ungleich der Zahl 0. Bei einem direkten Aufruf über die Konsole erfolgt jedoch eine Art Initiierung von Var1, denn die Konsole kann nur ausgeben was existiert.

13:10:45.795 CMD: Var1
13:10:45.800 RSL: RESULT = {"Var1":""}
13:10:45.812 RUL: VAR1 performs "IF(==0) Var1=1{ELSEIF (==1)  Var1=123} [ELSE Var1=1000]  ENDIF"
13:10:45.817 RSL: RESULT = {"If":"Done"}
13:10:46.044 RSL: RESULT = {"Var1":"1.000"}

Innerhalb der Rule erkennt man das beispielsweise in der IF Anweisung kein Wert steht „IF(==0)“, nachdem die Rule ausgeführt wurde wurde Var1 aber dennoch auf den Wert 1 gesetzt.

In Anbetracht dieses Umstands wird das Problem in unserer Rule

ON AM2301#Temperature<=24.5 DO IF(%Var3%==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDIF ENDON

im Eigentlichen erklärt. Denn im Vergleich zur Var1 wird unsere Var3 nicht mittels Aufruf in der Tasmota Konsole initiiert, sondern lediglich der Wert von Var3 im IF Statement abgefragt. Das führt uns zu den Werten von Tasmota Variablen.

Tasmota Variablen Werte und Tasmota Expressions Ausdrücke (mathematische Operatoren)

Mit Tasmota Expressions / Ausdrücke sind hier nicht die vorgenannten Vergleichs-Operatoren gemeint sondern „einfache“, mathematische Operatoren zur Berechnung von Werten mittels entsprechender Formel, 1+1=2.

Diese Operatoren

Mathematischer-
Operator
Funktion
()Anordnung der Berechnung Klammern dienen zur strikten Anordnung von Berechnungen innerhalb einer Formel, bzw. um das typische Punktrechnung kommt vor Strichrechnung zu umgehen
Beispiel
1+2*2=5
(1+2)*2=6
^hoch Potenz / Rechnen mit einem Exponent
%Modulo Division mit einem Rest
*Multiplikation
/Division
+Addition
-Subtraktion
Tasmota Rules Expressions mathematische Operatoren

sind in Tasmota Standard Kompillierungen nicht enthalten. Hier werde ich auch häufig darauf hingewiesen „die mathematischen Operatoren braucht man nie“, ich las dass einfach mal so im Raum stehen und komme zurück auf unser Problem

ON AM2301#Temperature<=24.5 DO IF(%Var3%==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDIF ENDON

in Kombination mit einer sehr einfachen (da meine) Logik und mit Hilfe einfacher Mathematik

Nichts + 1 = Nichts oder NULL + 1=NULL

Also wir wissen nach einem Neustart hat der Container der Variable Var3 den Wert Null, der eigentliche Wert von Var3 existiert nicht. Ändert man nun die Rule ein wenig und schon unterbindet man das Dauersenden selbst nach einem Neustart, unabhängig vom Status des anderen Moduls / Relais

ON AM2301#Temperature<=24.5 DO IF(%Var3%+1==1)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ELSEIF (Var3==0) Var3 1 ENDIF ENDON

Man achte auf Details

  • innerhalb des IF Statements wird der Wert von Var3 abgefragt, ist dieser 0 (0+1=1) wird über HTTP an das 8 Kanal Relais Modul gesendet
  • innerhalb des ELSEIF Statements wird der Container von Var3, also nicht der Wert, abgefragt ist dieser Null / 0 wird Var3 auf den Wert 1 gesetzt
    • zur Erinnerung wenn das Relais vom 8 Kanal Relais PRO aktiv ist, ist der Wert von Var3 = 1

Bei Ausgabe der nächsten Temperaturmessung überprüft die Tasmota Rule erneut, nun ist der Wert Var3 == 1 und Var3+1=2, es wird nichts über HTTP gesendet. Nachfolgend einmal die gesamte Tasmota Rule

Rule1 ON AM2301#Temperature<=24.5 DO IF(%Var3%+1==1)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ELSEIF (Var3==0)  Var3 1 ENDIF ENDON 
ON AM2301#Temperature>24.5 DO IF(%Var3%+1==2)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20Off GET ELSEIF (Var3==0)  Var3 0 ENDIF ENDON
ON AM2301#Humidity>30 DO IF(%var4%+1==1) WebQuery http://192.168.178.58/cm?&cmnd=Power4%20On GET ELSEIF (Var4==0)  Var4 1 ENDIF  ENDON
ON AM2301#Humidity<=30 DO IF(%var4%+1==2) WebQuery http://192.168.178.58/cm?&cmnd=Power4%20Off GET ELSEIF (Var4==0)  Var4 0 ENDIF  ENDON

Die Geschichte hat aber noch einen Haken, denn sobald Var3 oder Var4 auf den Wert 0 gesetzt wurde wird jedesmal bei erneuter Abfrage der AM2301 Sensorwerte bedingt durch das ELSEIF Statement die Variable auf 0 gesetzt.

14:53:09.877 RUL: AM2301#TEMPERATURE>25 performs "IF(0+1==2) WebQuery http://192.168.178.58/cm?&cmnd=Power3%20Off GET ELSEIF (Var3==0) Var3 0 ENDIF"
14:53:09.884 RSL: RESULT = {"If":"Done"}
14:53:10.109 RSL: RESULT = {"Var3":"0"}

Tasmota Rules mit dynamischen Werten

Bislang hatten wir die Tasmota Rulese Variablen etwas statisch behandelt, bzw. die Wert wurden stets statisch zugewiesen. Beim Umgang mit Tasmota Rules, bzw. bei der Suche im Internet findet man häufig ein ursächliches Problem, die Verwendung, bzw. Ausgabe der Tasmota Konsole wird gleichgesetzt mit Tasmota Rules.

Zwischen Tasmota Konsole und Tasmota Rules muss unterschieden werden,

  • die Tasmota Konsole initiiert, führt Kommandos aus und gibt entsprechend zurück
  • Tasmota Rules initiieren nicht, sondern führen anhand von Parametern entsprechende Kommandos aus, diese Kommandos initiieren aber nicht von selbst

Ein einfaches Beispiel ruft man den Status eines Relais, hier Relais 1 mittels Tasmota Konsole ab

15:04:19.395 CMD: Power1#state
15:04:19.400 RSL: RESULT = {"POWER1":"ON"}
15:04:19.403 RSL: POWER1 = ON

führt das zur Annahme man könnte dies auf eine Rule adaptieren. Grundlage einer Tasmota Rule bildet stets ein Trigger, dementsprechend verwenden wir beispielsweise

Rule2 ON Power1#state DO Var1 Power1#state ENDON

15:08:45.111 RSL: RESULT = {"Rule2":{"State":"OFF","Once":"OFF","StopOnError":"OFF","Length":42,"Free":469,"Rules":"ON Power1#state DO Var1 Power1#state ENDON"}}
15:08:51.898 CMD: Rule2 1
15:08:51.905 RSL: RESULT = {"Rule2":{"State":"ON","Once":"OFF","StopOnError":"OFF","Length":42,"Free":469,"Rules":"ON Power1#state DO Var1 Power1#state ENDON"}}

schaltet man nun das Relais 1 so glaubt man die Variable Var1 beinhaltet den aktuellen Status von Relais 1 aber beim Klicken auf das Relais 1 wird folgendes ausgegeben

15:11:08.706 RSL: RESULT = {"POWER1":"ON"}
15:11:08.709 RSL: POWER1 = ON
15:11:08.755 RUL: POWER1#STATE performs "Var1 Power1#state"
15:11:08.761 RSL: RESULT = {"Var1":"Power1#state"}

Der Wert der Variablen Var1 = Power1#state, sollte im Eigentlichen auch nicht verwundern, denn genau das wurde auch so in der Rule2 festgelegt!

Wichtig! Niemals 2 oder mehr Variablen in einem Kommando, selbst wenn durch Semikolon unterteilt z.B. Var3 0 ; Var4 0 setzen.

Wie bereits erwähnt wird der Wert einer Variablen genau so gesetzt Var1 Power1#state und Werte mittels %Var1% abgefragt. Dem zur Folge muss auch ein Wert / Value innerhalb eines Tasmota Rule Kommandos entsprechend abgefragt, besser gesagt deklariert bzw. initiiert werden.Im Detail erfolgt das durch das „Kommando“ %value% als Beispiel

Rule2 ON Power1#state DO Var1 %value% ENDON

schaltet man nun das Relais 1 so gibt die Tasmota Konsole folgendes aus

15:20:55.701 RSL: RESULT = {"POWER1":"ON"}
15:20:55.703 RSL: POWER1 = ON
15:20:55.748 RUL: POWER1#STATE performs "Var1 1"
15:20:55.753 RSL: RESULT = {"Var1":"1"}

Im Grunde sehr leicht verständlich, SOBALD SENSOR TRIGGER TUE Var1 auf den Wert des Triggers setzen

Zusammenfassung

Ich selbst war viele Jahre im Bereich Physik und Zellbiologie tätig. Hier lernt man sehr schnell das alles einer gewissen Abhängigkeit und Dynamik unterliegt. In die Praxis bzw. Logik übersetzt bleiben meist kein Raum für Konstanten, sondern eine Vielzahl von wechselnden Zuständen die man mittels entsprechender Variablen abgleicht. Im Grunde trifft das auch auf künstliche Intelligenz zu, je mehr Dynamik involviert, desto eigenständiger und intelligenter ist ein System.

In Anlehnung an die vorgenannten Regeln zu den Tasmota Rules und in Anlehnung an das erwähnt Beispiel nun meine subjektive Endlösung, denn man kann es auch anders lösen.

Ich fasse zusammen, die Endlösung soll eigenständig

  1. die aktuelle Temperatur bestimmen und dementsprechend die Temperatur regeln, in Form vom zu und Abschalten eines Relais
  2. die aktuelle Luftfeuchtigkeit bestimmen und dementsprechend die Temperatur regeln, in Form vom zu und Abschalten eines Relais
  3. Messen und Regeln ist verteilt auf 2 eigenständige Module die über HTTP kommunizieren
  4. es soll nur ein Datenaustausch über HTTP erfolgen wenn notwendig, beim Erreichen des Schwellenwertes sowohl im Bezug der Temperatur

Auf Basis der in diesem Tasmota Rules Tutorial beschriebenen Möglichkeiten (mal wieder) meine Tabelle zum 1-Wire Modul mit dem AM2301

SensorTriggerAuslöserZustandKommando (an das 8 Kanal Relais PRO)
ModulSytemBootVar3″“wenn Var3+1<1 schicke über das Netzwerk an http://192.168.178.58
Relais 3 Status
ModulSystemBootVar4″“wenn Var3+1<1 schicke über das Netzwerk an http://192.168.178.58
Relais 4 Status
AM2301#Temperature<=24.5kaltWENN (%Var3%==0);
schicke über das Netzwerk an http://192.168.178.58
Relais 3 an
AM2301#Temperature>24.5warmWENN (%Var3%==1);
schicke über das Netzwerk an http://192.168.178.58
Relais 3 aus
AM2301#Humidity>30feuchtWENN (%Var4% == 1);
schicke über das Netzwerk an http://192.168.178.58
Relais 4 an
AM2301#Humidity<=30trockenWENN (%Var4% == 0);
schicke über das Netzwerk an http://192.168.178.58
Relais 4 aus
Tabelle Übersicht zum 1-Wire Modul Tasmota Rule1

sowie die Tasmota Rule1

Rule1
ON AM2301#Temperature<=25 DO IF(%var3%==0)WebQuery http://192.168.178.58/cm?&cmnd=Power3%20On GET ENDIF ENDON
ON AM2301#Temperature>25 DO IF(%var3%==1) WebQuery http://192.168.178.58/cm?&cmnd=Power3%20Off GET ENDIF ENDON
ON AM2301#Humidity>40 DO IF(%var4%==0) WebQuery http://192.168.178.58/cm?&cmnd=Power4%20On GET ENDIF ENDON
ON AM2301#Humidity<=40 DO IF(%var4%==1) WebQuery http://192.168.178.58/cm?&cmnd=Power4%20Off GET ENDIF ENDON

Zeile 1 und 2 enthält jetzt eine Kontrollabfrage, also wenn Var3 und Var4 nicht gesetzt wurden, da das 8 Kanal Relais Modul PRO die Variablen Var3 und Var4 gesendet hat bevor das 1-Wire Modul über HTTP empfangen konnte. Das Grundprinzip zur Bestimmung der Messwerte, als auch im Bezug der daraus resultierenden Kommandos hat sich nicht geändert.

Im Bezug der Tasmota Rule1 des 8 Kanal Relais jedoch einiges

SensorTriggerAuslöserZustandKommando (an das 1-Wire Modul)
ModulPower3Bootsetze Var3 auf aktuellen Status von Relais3
ModulPower4Bootsetze Var4 auf aktuellen Status von Relais4
ModulSystemBootschicke über das Netzwerk an http://192.168.178.63
Var3 mit dem aktuellen Wert
ModulSystemBootschicke über das Netzwerk an http://192.168.178.63
Var4 mit dem aktuellen Wert
Relais3statuskalt oder warmsetze Var3 auf aktuellen Status von Relais3;
schicke über das Netzwerk an http://192.168.178.63
Var3 mit dem aktuellen Wert
Relais4statusfeucht oder trockensetze Var4 auf aktuellen Status von Relais3;
schicke über das Netzwerk an http://192.168.178.63
Var4 mit dem aktuellen Wert
Tabelle Übersicht zum 8 Kanal PRO Relais Modul Tasmota Rule1

Im Bezug der Variablen Var3 und Var4 wird nun nicht nur der Wert dynamisch, durch Abfrage des aktuellen Status des Relais gesetzt, sondern bei Status Änderung des Relais, direkt die Variablen Var3 oder Var4 an das 1-Wire Modul mittels HTTP übergeben.

Direkt beim Booten des 8 Kanal Relais PRO Modul wird der aktuelle Status von Relais3 in Var3 und von Relais4 in Var4 geschrieben.

Sobald das Modul eine HTTP Verbindung hergestellt hat, wird Var3 und Var4 an das 1-Wire Modul übergeben. Nachfolgend die Rule1 des 8 Kanal PRO Relais Modul untergliedert in Zeilen

Rule1
ON Power3#Boot DO Var3 %value% ENDON
ON Power4#Boot DO Var4 %value% ENDON
ON System#Boot DO WebQuery http://192.168.178.63/cm?&cmnd=Var3%20%Var3% GET ENDON
ON System#Boot DO WebQuery http://192.168.178.63/cm?&cmnd=Var4%20%Var4% GET ENDON
ON Power3#state DO WebQuery http://192.168.178.63/cm?&cmnd=Var3%20%value% GET ENDON
ON Power4#state DO WebQuery http://192.168.178.63/cm?&cmnd=Var4%20%value% GET ENDON

Ich persönlich vermeide die Aneinanderreihung von mehreren Kommandos mittels ; Semikolon um etwaige falsche Aneinanderreihungen zu vermeiden, z.B. eine falsche Wertzuordnung von Variablen zu vermeiden. Um Speicher und Platz zu sparen kann man selbstredend ungenutzte Variablen nutzen um den Inhalt von Tasmota Rules zu reduzieren wie im nachfolgenden Beispiel wurde Var1 mit dem String WebQuery http://192.168.178.63/ versehen somit wird anstelle von WebQuery http://192.168.178.63/ nun lediglich der Wert %var1% in der Rule1 benötigt, entspricht einer Reduzierung von 414 Zeichen auf 375 Zeichen.

Rule1
ON Power3#Boot DO Var3 %value% ENDON
ON Power4#Boot DO Var4 %value% ENDON
ON System#Boot DO Var1 WebQuery http://192.168.178.63/ ENDON
ON System#Boot DO %var1%cm?&cmnd=Var3%20%Var3% GET ENDON
ON System#Boot DO %var1%cm?&cmnd=Var4%20%Var4% GET ENDON
ON Power3#state DO %var1%cm?&cmnd=Var3%20%value% GET ENDON
ON Power4#state DO %var1%cm?&cmnd=Var4%20%value% GET ENDON

Abschliessende Anmerkungen

In der Tasmota Rule1 des 1-Wire Moduls mag man nun die Auswertung, bzw. das Setzen von Var3 und Var4, WENN kein Wert gesetzt wurde vermissen. Sicherlich man könnte für den Fall dass das 8 Kanal PRO Relais die Var3 und Var4 bereits gesendet hat den Status von Relais3 und Relais4 dynamisch wie folgt abfragen
ON System#Boot DO Var3 %value% WebQuery http://192.168.178.58/cm?&cmnd=Power%203#state GET ENDON
ON System#Boot DO Var4 %value% WebQuery http://192.168.178.58/cm?&cmnd=Power%204#state GET ENDON

ABER das hätte auch zur Folge wenn das 8 Kanal PRO Relais nicht erreichbar wäre nun 4 WebQuery gesendet werden. Also bliebe nur wie hier im Tasmota Rules Tutorial beschrieben mittels einem IF Statement entsprechend vorzugehen, um zu vermeiden das unnötige WebQuery ausgeführt werden.

Im Detail sollte dies jedoch nicht in die Tasmota Rule1 gepackt werden, denn im Eigentlichen handelt es sich hier um eine Modulüberwachung, diese sollte zum Einen in einer separaten Tasmota Rule erfolgen und zum Anderen würde die Behebung des Problems etwaige andere Massnahmen, z.B. Spannungsversorgung zum Modul herstellen nach sich ziehen, wobei letztgenanntes selbst durch Tasmota Rules nicht herbeigeführt werden kann. Aber, es könnte ein entsprechendes Alarmsystem mittels einer Tasmota Rule initiiert werden, beispielsweise durch den Versand einer Email.

In Anbetracht der Komplexität typischer Smart Home Anwendungen und der damit verbundene Einsatz von vielen Smart Home Geräten sollte allerdings das MQTT Protokoll in Betracht gezogen werden.