
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)
- mittels IF Statement mittels WENN weiter differenzieren um weitere Faktoren einzubeziehen
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:
- 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
- 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
- die Temperatur im Badezimmer mittels einer elektrischen Fußbodenheizung auf einer vorgegebenen Temperatur gehalten werden
- 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.
Sensor | Trigger | Auslöser | Zustand | Kommando (an das 8 Kanal Relais PRO) |
AM2301 | #Temperature | <=24.5 | kalt | schicke über das Netzwerk an http://192.168.178.58 Relais 3 an |
AM2301 | #Temperature | >24.5 | warm | schicke über das Netzwerk an http://192.168.178.58 Relais 3 aus |
AM2301 | #Humidity | >30 | feucht | schicke über das Netzwerk an http://192.168.178.58 Relais 4 an |
AM2301 | #Humidity | <=30 | trocken | schicke ü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 f 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
Sensor | Trigger | Auslöser | Zustand | Kommando (an das 8 Kanal Relais PRO) |
AM2301 | #Temperature | <=24.5 | kalt | WENN (%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.5 | warm | WENN (%Var3%==1); schicke über das Netzwerk an http://192.168.178.58 Relais 3 aus; setze Var3 auf 0 aktueller Zustand Relais |
AM2301 | #Humidity | >30 | feucht | WENN (%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 | <=30 | trocken | WENN (%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
- die Variablen Var3 Var4 sind zwar im 1-wire Modul implementiert und werden auch dort mittels Tasmota Rules ausgewertet
- 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
- die Variablen Var3 und Var4 werden aber durch das 8 Kanal Relais Modul gesetzt
- 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
Sensor | Trigger | Auslöser | Zustand | Kommando (an das 1-Wire Modul) |
Relais3 | status | 1 | kalt | setze Var3 auf 1 |
Relais3 | status | 0 | warm | setze Var3 auf 0 |
Relais3 | schicke über das Netzwerk an http://192.168.178.63 Var3 mit dem aktuellen Wert | |||
Relais4 | status | 1 | feucht | setze Var4auf 1 |
Relais4 | status | 0 | trocken | setze Var4auf 1 |
Relais4 | schicke ü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.
Sensor | Trigger | Auslöser | Zustand | Kommando (an das 8 Kanal Relais PRO) |
AM2301 | #Temperature | <=24.5 | kalt | WENN (%Var3%==0); schicke über das Netzwerk an http://192.168.178.58 Relais 3 an |
AM2301 | #Temperature | >24.5 | warm | WENN (%Var3%==1); schicke über das Netzwerk an http://192.168.178.58 Relais 3 aus |
AM2301 | #Humidity | >30 | feucht | WENN (%Var4% ist kleiner 1); schicke über das Netzwerk an http://192.168.178.58 Relais 4 an |
AM2301 | #Humidity | <=30 | trocken | WENN (%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 |
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 |
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
Statement | Beschreibung |
---|---|
IF | Wenn |
ELSEIF | WennNicht, der Vergleich durch IF(WENN) wurde nicht erfüllt |
ELSE | SONST wenn weder der Vergleich durch IF(WENN) und/oder der Vergleich von ELSEIF (WennNicht) erfüllt wurde |
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
Trigger | Ausführung Beschreibung |
---|---|
Http#Initialized | wird ausgeführt sobald die HTTP Verbindung aktiv ist |
Mqtt#Connected | wird ausgeführt sobald eine Verbindung zum MQTT Broker hergestellt wurde |
Mqtt#Disconnected | wird ausgeführt sobald eine Verbindung zum MQTT Broker unterbrochen wurde |
Power?#Boot | wird 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?#Boot | wird 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#Boot | wird direkt nach der System Initialisierung ausgeführt, nachdem HTTP, als auch eine MQTT Verbindung hergestellt wurde |
System#Save | wird ausgeführt nachdem ein Neustart aktiviert wurde und die jeweiligen System Parameter im Flashspeicher abgelegt / aktualisiert werden |
Time#Initialized | wird ausgeführt sobald NTP initialisiert und die Systemzeit mit dem NTP Server synchronisiert wurde |
Time#Set | wird stündlich, bei Synchronisierung der Systemzeit mit dem NTP Server ausgeführt |
Wifi#Connected | wird ausgeführt sobald eine WLan Verbindung hergestellt wurde |
Wifi#Disconnected | wird ausgeführt sobald eine WLan Verbindung unterbrochen wurde |
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 |
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
- die aktuelle Temperatur bestimmen und dementsprechend die Temperatur regeln, in Form vom zu und Abschalten eines Relais
- die aktuelle Luftfeuchtigkeit bestimmen und dementsprechend die Temperatur regeln, in Form vom zu und Abschalten eines Relais
- Messen und Regeln ist verteilt auf 2 eigenständige Module die über HTTP kommunizieren
- 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
Sensor | Trigger | Auslöser | Zustand | Kommando (an das 8 Kanal Relais PRO) |
Modul | Sytem | Boot | Var3″“ | wenn Var3+1<1 schicke über das Netzwerk an http://192.168.178.58 Relais 3 Status |
Modul | System | Boot | Var4″“ | wenn Var3+1<1 schicke über das Netzwerk an http://192.168.178.58 Relais 4 Status |
AM2301 | #Temperature | <=24.5 | kalt | WENN (%Var3%==0); schicke über das Netzwerk an http://192.168.178.58 Relais 3 an |
AM2301 | #Temperature | >24.5 | warm | WENN (%Var3%==1); schicke über das Netzwerk an http://192.168.178.58 Relais 3 aus |
AM2301 | #Humidity | >30 | feucht | WENN (%Var4% == 1); schicke über das Netzwerk an http://192.168.178.58 Relais 4 an |
AM2301 | #Humidity | <=30 | trocken | WENN (%Var4% == 0); schicke über das Netzwerk an http://192.168.178.58 Relais 4 aus |
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
Sensor | Trigger | Auslöser | Zustand | Kommando (an das 1-Wire Modul) |
Modul | Power3 | Boot | setze Var3 auf aktuellen Status von Relais3 | |
Modul | Power4 | Boot | setze Var4 auf aktuellen Status von Relais4 | |
Modul | System | Boot | schicke über das Netzwerk an http://192.168.178.63 Var3 mit dem aktuellen Wert | |
Modul | System | Boot | schicke über das Netzwerk an http://192.168.178.63 Var4 mit dem aktuellen Wert | |
Relais3 | status | kalt oder warm | setze Var3 auf aktuellen Status von Relais3; schicke über das Netzwerk an http://192.168.178.63 Var3 mit dem aktuellen Wert | |
Relais4 | status | feucht oder trocken | setze Var4 auf aktuellen Status von Relais3; schicke über das Netzwerk an http://192.168.178.63 Var4 mit dem aktuellen Wert |
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.