Ja, das ist ganz einfach. Deine Rule muss das nur andersrum machen, als Du es beschreibst.
Ich möchte aber an dieser Stelle anhand des Beispiels nochmal darauf hinweisen, dass die Rule Engine Regeln immer
eventbasiert ausführt. Ein Zeitfenster ist kein Event. Ein Zeitfenster hat einen Zustand (innerhalb des Zeitfensters oder außerhalb des Zeitfensters) und beim Wechsel des Zustands können wir von Events sprechen, das wären dann aber zwei Zeit
punkte und keine Zeit
räume.
Es ist nicht zielführend, eine Rule zu schreiben, welche dann halt innerhalb des Zeitraums sekündlich ausgeführt wird (das ist mit Deinem Code so... * vorne).
Stattdessen lässt Du Deine Rule auf die Helligkeitsänderung und die beiden Grenzzeitpunkte triggern. Innerhalb des Codes prüfst Du dann, ob die Rahmenbedingungen stimmen und steuerst entsprechend. Das sieht so aus:
Code: Alles auswählen
rule "Helligkeit_Beleuchtung"
when
Item mcu2_L changed or
Time cron "0 0 17 * * 5-7" or
Time cron "1 0 23 * * 5-7"
then
var nGrenze = 3 // Default Wert, falls Item keine Zahl liefert
if(mcu2_B_max.state instanceof Number) // falls Item Zahl liefert
nGrenze = (mcu2_B_max.state as Number).floatValue // nimm diese
var nAktuell = 2 // Default Wert, falls Item keine Zahl liefert
if(mcu2_L.state instanceof Number) // falls Item Zahl liefert
var nAktuell = (mcu2_L.state as Number).floatValue // nimm diese
var swSoll = OFF // Default Sollzustand OFF
if(nGrenze > nAktuell && now.getHour > 16 && now.getHour < 23 && now.getDayOfWeek.getValue > 4) // Falls Bedingungen für ON erfüllt
swLicht = ON // Setze Sollzustnad ON
if(mcu2_B_Beleuchtung.state != swSoll) // Falls Soll von Ist abweicht
mcu2_B_Beleuchtung.sendCommand(swSoll.toString) // Sende Schaltbefehl
end
Die Bedingungen im Einzelnen:
- gesetzter Grenzwert muss über aktueller Helligkeit liegen
- Die aktuelle Stunde muss größer 16 sein (also ab 17:00:00 Uhr bis 23:59:59 Uhr der Fall)
- Der aktuelle Wochentag als Zahl muss größer 4 sein (Montag = 1, Sonntag = 7)
Man sollte niemals davon ausgehen, dass ein Number Item immer eine Zahl als Status hält, es gibt mindestens noch die Status NULL und UNDEV, welche beide keine gültige Zahl darstellen und somit bei .state as Number eine null-Pointer Exception auslösen. Das .floatValue stellt sicher, dass keine der Variablen im Anschluss eventuell eine Einheit mitführt (Units of Measurement).
Im Allgemeinen wird es nicht auf das sekundengenaue Ein- und Ausschalten ankommen, sondern nur, dass dies bei Helligkeitsänderungen innerhalb des Zeitfensters automatisch geschieht. Es könnte aber sein, dass es im Zeitfenster gar keine Helligkeitsänderungen mehr gibt, weil es schon stockdunkel ist, deshalb die beiden zusätzlichen Trigger zu Beginn und zum Ende des Zeitfensters.
Die Rule schaltet das Licht nicht nur ein, sondern auch aus.
EDIT: Typo und Anpassungen an der Rule
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet