Deine Rule ist Quatsch
Die Rule schaltet abhängig vom gesendeten Kommando entweder nach 10 Minuten das Licht ein oder nach 5 Minuten das Licht aus.
Was Du aber haben willst, ist eine Rule, die das Licht nach einer gewissen Zeit ein- und dann nach einer weiteren Zeitspanne wieder ausschaltet.
das sieht dann so aus:
Code: Alles auswählen
var Timer tLicht = null // Zeiger auf den Timer (mit sinnvollem Namen!)
rule "Anwesenheit Simulation"
when
Item Test_Switch received command // Befehl empfangen
then
tLicht?.cancel // lösche Timer, falls einer existiert
tLicht = createTimer(now.plusMinutes(10), [ | // Setze Timer auf 10 Minuten
if(Licht_EG_Flur.state != ON) { // Falls Licht nicht an
Licht_EG_Flur.sendCommand(ON) // einschalten
tLicht.reschedule(now.plusMinutes(5)) // und Timer erneut aufrufen
} else { // Falls Licht an
Licht_EG_Flur.sendCommand(OFF) // ausschalten
}
])
end
Die Rule startet den Timer, der das Licht einschaltet. Wenn der Timer das Licht einschaltet, plant er "sich selbst" erneut ein. Dann wird das Licht wieder ausgeschaltet.
In dieser Form kannst Du nun die Integer Werte 10 bzw. 5 auch mit Zufallswerten füllen, solange diese als Integer Werte zur Verfügung stehen. Mehr noch, Du kannst im "Ausschalt-Zweig" des Timers ebenfalls ein reschedule einbauen, so dass sich der Timer immer wieder neu startet und das Licht jeweils toggelt. Also so:
Code: Alles auswählen
var Timer tLicht = null // Zeiger auf den Timer (mit sinnvollem Namen!)
rule "Anwesenheit Simulation"
when
Item Test_Switch received command // Befehl empfangen
then
tLicht?.cancel // lösche Timer, falls einer existiert
if(receivedCommand == ON) // Nur falls Befehl ON war
tLicht = createTimer(now.plusMinutes(Math::random * 10).intValue, [ | // Setze Timer auf 10 Minuten
if(Licht_EG_Flur.state != ON) { // Falls Licht nicht an
Licht_EG_Flur.sendCommand(ON) // einschalten
tLicht.reschedule(now.plusMinutes(2+(Math::random * 5).intValue)) // und Timer erneut aufrufen
} else { // Falls Licht an
Licht_EG_Flur.sendCommand(OFF) // ausschalten
tLicht.reschedule(now.plusMinutes(55+(Math::random * 10).intValue)) // und Timer erneut aufrufen
}
])
else
Licht_EG_Flur.sendCommand(OFF) // ausschalten
end
Nun dient der Schalter als Start und Stop für die Zufallsbeleuchtung. Wird ein Befehl empfangen, wird ein laufender Timer gelöscht. Nur falls der Befehl ON empfangen wurde, wird der Timer angelegt und startet nach einer zufälligen Anzahl Minuten (0 bis 10) den Timer, das das Licht nun einachaltet, falls es aus war aund ausschaltet, falls es an war. Beim Einschalten wird der Timer mit 2 bis 7 Minuten neu geplant, beim Ausschalten wird der Timer mit 55 bis 65 Miunten neu geplant.
Du kannst die Rule auch abwandeln und per Timer steuern, dann allerdings gibt es kein receivedCommand, so dass Du nun zwei Rules brauchst, die eine startet den Timer, die andere löscht ihn nur (nicht vergessen, dass das Licht zu diesem Zeitpunkt eventuell auch an sein könnte, also genau wie in der 2. Rule das Licht mit auschalten...)