Regeln (rules) sind in Tasmota eine sehr nützliche Erweiterung, die das System besonders flexibel einsetzbar macht. Diese Regeln haben die Eigenschaften von Skripten, welchen eine gewisse, eingeschränkte Syntax zugrunde liegt. Es gibt nur sehr wenige Strukturen und Schlüsselwörter. Mit Regeln kann man dem System Funktionen hinzufügen, die es per se nicht bietet. Ich beziehe mich im folgenden auf eine installierte tasmota-sensors.bin Stand 2020-04-02, auf Basis der Tasmota Version 8.2.

Variable kopieren

Ich hatte erwartet, dass tasmota-sensors.bin in Kommandos bspw. folgendes zulässt:

Var2=%Var1% oder Var2 %Var1% (%...% ist der Wertoperator, d.h. von dem Ding zwischen den % wird dessen Wert (=Inhalt) verwendet.)

Damit sollte der Wert in Var1 der Variablen Var2 zugewiesen werden, also eine Kopie von %Var1% in Var2.

Hmmm, das geht so leider nicht. Auf der Kommandozeile geht das so überhaupt nicht - seufz. Aber ... man baue sich folgende Regel:

on event#set2 do Var2 %value% endon

Darin ist event#set2 der sog. Trigger, welcher die Abarbeitung der Regel auslöst. %value% ist ein sog. formaler Parameter. In Programmiersprachen sähe das etwa so aus:
set2(value) { Var2 = value}, wobei Var2 eine globale Variable wäre, eine Variable, auf die man im Programm von überall her zugreifen kann.

Eine Regel kann immer nur maximal einen Parameter verwenden, der innerhalb der Regel, also zwischen "on" und "endon", immer per %value% zur Verfügung steht.
Tasmota bietet insgesamt drei Regelsätze (rule1, rule2, rule3), die mehrere Regeln (rules) enthalten können und aktivierbar/deaktivierbar sind.

Anwendung obiger Regel

Bspw. den Wert der Variablen Var1 in die Variable Var2 kopieren:

event set2=%Var1%

Darin ist %Var1% ein aktueller Parameter (Aktualparameter), auf welchen in einer Regel IMMER per %value% (Formalparameter) zugegriffen werden kann.

Wirkunsweise: Inhalt (=Wert) von Var1 --> value --> Inhalt von value (%value%) --> Var2

Auf diese Weise kann man für jeden erwünschten Kopiervorgang eine spezielle Regel erstellen.

Was man mit dem Inhalt von Variablen tun will, bleibt jedem selbst überlassen.

Die obige Regel ist sehr schlicht und wird vermutlich in Anwendungen kaum verwendet. Immerhin kann man damit auf der Konsole eine Zuweisung beauftragen und experimentieren.

In Regeln kann man das Kopieren zwischen Variablen einfach gestalten: Var3 %Var2%

Hiermit wird der Wert von Var2 in die Variable Var3 kopiert, was in dieser Form auf der Konsole nicht geht.

Wichtig!

Quelle: https://tasmota.github.io/docs/Rules/#use-of-variables-and-tele-

The following won't work:

console Rule1 on event#setvar1 do backlog var1 %value%; power1 %var1% endon

At least not as you probably would expect. The var1 value used by the power1 command will be the value present before the backlog command is executed. This is so, because the rule will replace %var1% BEFORE the backlog commands are put in the backlog command stream.

%value% (Trigger Parameter) kann also problemlos verwendet werden, bei Verwendung von %var<x>% ist oben zitiertes Verhalten zu kennen und zu berücksichtigen.

Zuweisung eines Wertes remote per MQTT

Obiges Beispiel ist zum speichern von Werten in Variablen geeignet. Solche Werte können per MQTT übertragen werden. Dabei ist in Tasmota eine bestimmte Struktur voreingestellt, die man ändern kann.

Tasmota unterscheidet verschiedene Typen von Nachrichten. Es gibt Nachrichten für Kommandos, für Zustände und für Werte. Jede dieser Nachrichten besteht aus einem Topic (Thema) und einem Payload (Nutzdaten). Das Topic ist entscheidend dafür, welchen Geräte der MQTT Broker eine Nachricht zustellt. Prinzipiell kann man ein Topic fast nach Belieben zusammenstellen. Es ist aber sehr zweckmäßig, sich sorgfältig mit Topic-Strukturen auseinanderzusetzen, damit diese einen Struktursinn haben. Tasmota verwendet in der Voreinstellung folgende prinzipielle Topic-Struktur. 

pre-topic/detail-topic payload

pre-topic setzt sich in Kommandonachrichten zusammen aus "cmnd" und %topic%, wobei %topic% das ist, was man bspw. auf der Weboberfläche leicht konfigurieren kann. Mein %topic% lautet hier "test". Daraus ergibt sich für pre-topic cmnd/test .

In detail-topic steht nun das von Tasmota verstehbare Kommando. Hierzu ist afaik jedes Tasmota Kommando geeignet. Ich habe in Node-RED eine kleine Tasmota Konsole programmiert. Darin ist bisher jedes mir bekannte Kommando verwendbar. Um die obige Regel mit dem Trigger event#set2 in der MQTT Nachricht einzusetzen, muss der Trigger darin verteilt werden. "event" muss für detail-topic eingesetzt werden, ein evtl. zu nutzender Parameter in der payload.

Um bspw. der Variablen Var2 den Wert 123 zuzuweisen (es ist erst einmal eine Zeichenkette), braucht es folgende MQTT Nachricht:

topic: cmnd/test/event

payload: set2=123 - Hier ist set2 die kleine, oben gezeigte Regel.

Woher der Wert (hier 123) kommt, ist letztlich dem überlassen, der sich eine IoT Struktur zusammenstellt. In JSON sieht die Nachricht so aus:

{topic: cmnd/test/event, payload: set2=123}

Eine solche Nachricht kann mit jedem MQTT publisher gesendet werden. Besonders flexibel geht das mit Node-RED.

 

 

2020-04-13