Dieses Modul besitzt auch einen optionalen (Timeout-)Timer.
Wobei der Timeout als zusätzliche Eingangsbedingung verwendet werden kann.
Die Syntax für den Zustandsautomat sieht folgendermassen aus:
["Statemachine", [Zustandsübergangstabelle], "$State"]
"Statemachine" : Modulkennung "$State": Referenz auf einen integer Level der den aktuellen Status enthältDie [Zustandsübergangstabelle] ist eine Liste aus mehreren Zustandsübergängen.
Jeder Zustandsübergang besteht jeweils aus einer Liste mit vier Einträgen:
[Bedingung , aktueller Zustand, nächster Zustand, Timeout]
- Bedingung: Referenz auf einen boolschen Level
- aktueller Zustand: Integerwert, der den Zustand repräsentiert
- nächster Zustand: Integerwert, der den Zustand repräsentiert
- Timeout: Referenz auf "float"
Code: Alles auswählen
{
"Level": [
["$In","bool",false],
["$State","integer",0],
["$Time","float",10.0], // Zeit für erste Leuchtdauer
["$Dark","float",0.2], // Zeit für Dunkelphase vor der Restlaufzeit
["$Warn","float",3.0], // Restlaufzeit
["$Light","bool",false],
["$ConstTrue","bool",true],
["$VAR<Inhibit?>","bool",false]
],
"Module": [
["Break",["$VAR<Inhibit?>"]],
["Statemachine",
// 0: Licht aus
// 1: Licht ein + Timer läuft
// 2: kurz Dunkel (als Warnung, dass nur noch Restlaufzeit kommt)
// 3: Lich an + Restlaufzeit läuft
[
["$In" , 0, 1, "$Time"], // einschalten, Timer starten
[ 0 , 1, 2, "$Dark"], // Zeit abgelaufen
["-$In", 1, 0, 0 ], // ausschalten
["$In" , 1, 1, "$Time"], // Zeit neu starten
[ 0 , 2, 3, "$Warn"], // Dunkelzeit abgelaufen -> Warnzeit
["$In" , 2, 1, "$Time"], // Zeit neu starten
["-$In", 2, 0, 0 ], // ausschalten
[ 0 , 3, 0, 0 ], // Warnzeit abgelaufen
["$In" , 3, 1, "$Time"], // Zeit neu starten
["-$In", 3, 0, 0 ] // ausschalten
],
"$State"
],
["Multiplexer",[0,"$ConstTrue",0,"$ConstTrue"],"$Light","$State"]
],
"Input": [
["Input","Eingang Schalter Ein/Aus","$In","a"],
["Dauer","Zeit [s]","$Time","c"],
["Reserve","Restlaufzeit [s] nach Warnung","$Warn","c"],
["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
],
"Output": [
["Status","Zustand","$State","c"],
["Licht","Licht","$Light","c"]
]
}
Dabei warnt eine kurze Dunkelphase, dass das Licht nach anschließender Restlaufzeit abgeschaltet wird.
Hier noch das Diagramm:
Der Zustandsautomat funktioniert folgendermaßen:
Wird das Modul ausgeführt, liest es den aktuellen Zustand von "$State" ein und geht anschließend die Zustandsübergangstabelle der Reihe nach durch. Stimmen "Bedingung" und "aktueller Zuständ" überein, wird der "nächste Zustand" aktiv und (falls der Timeout-Wert größer 0 ist) ein Timout-Timer gestartet.
Sobald der erste Zustandsübergang zutrifft, werden die nachfolgenden Einträge ignoriert. Die Reihenfolge der Einträge ist daher entscheidend für die Funktionalität.
Besonderheit Null-Referenz bei "Bedingung":
Die 0 bedeutet hier als Bedingung: "Timout ist abgelaufen"!!!
Mit anderen Worten: Wurde beim Übergang in einen neuen Zustand ein Timeout-Timer gestartet und wurde die Logik (genauer das Modul) nicht durch einen anderen Trigger ausgeführt, bis der Timeout abläuft, so triggert der Timeout die Logik und Bedingungen mit Null-Referenz werden wahr.
Das Modul ist bereits in der aktuellen DEV-Version verfügbar. Viel Spaß beim ausprobieren