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ält
Die [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

