Re: Probleme mit DSL Rule „if then else“
Verfasst: 19. Jan 2023 21:32
Du kannst beliebig viele Timer gleichzeitig nutzen. Die Frage ist aber, was Du erreichen willst.fmmephisto hat geschrieben: ↑19. Jan 2023 20:46 Werde mal versuchen, die Timervariablen anders zu benennen. Damit sollte es ja möglich sein, dass mehrere Timer zur gleichen Zeit laufen.
Geht es um zwei voneinander unabhängige Dinge, nutzt Du natürlich auch zwei voneinander unabhängige Timer.
Nutzt Du allerdings eine Abfolge von Befehlen (gerne genommen: partielle Bewässerung des Gartens, weil der Wasserdruck nicht ausreicht), ist es sinnvoller, eine Statemaschine zu bauen (ich nutze gerne das Bild eines mechanischen Programmschalters aus einer alten Waschmaschine).
Man nutzt dann nur einen einzigen Timer, der dafür aber mehrfach ausgeführt wird. Eine Hilfsvariable zählt dabei die Aufrufe mit und innerhalb des Codes wird je nach Schritt etwas anderes gemacht:
Code: Alles auswählen
var Timer tAblauf = null
var Integer iAblauf = 0
rule "Ablaufsteuerung"
when
//irgendein Trigger, der den Vorgang startet
then
tAblauf?.cancel // falls schon ein Timer existiert, entferne ihn
iAblauf = 0 // initialisiere den Zähler
iAblauf = createTimer(now.plusSeconds(1), [|
iAblauf ++
if(iAblauf == 1) Licht1.sendCommand(ON)
if(iAblauf == 2) Licht1.sendCommand(OFF)
if(iAblauf == 3) Licht2.sendCommand(ON)
if(iAblauf == 4) Licht1.sendCommand(ON)
if(iAblauf == 5) Licht2.sendCommand(OFF)
if(iAblauf == 6) Licht1.sendCommand(OFF)
if(iAblauf < 6) tAblauf.reschedule(now.plusSeconds(iAblauf))
])
end
Nach einer Sekunde wird Licht1 durch den Timer eingeschaltet.
Nach einer weiteren Sekunde wird Licht1 ausgeschaltet.
Nach zwei weiteren Sekunden wird Licht2 eingeschaltet.
Nach drei weiteren Sekunden wird Licht1 eingeschaltet.
Nach vier weiteren Sekunden wird Licht2 ausgeschaltet.
Nach fünf weiteren Sekunden wird Licht1 ausgeschaltet.
Danach endet der Timer, ohne erneut geplant zu werden.
Das Codebeispiel ist weitgehend sinnfrei
