Solche Einschränkungen kann man auf unterschiedliche Weise erreichen. Enweder Du fragst die entsprechenden Werte in der Rule ab:
Code: Alles auswählen
if(now.getDayOfMonth < 21 && now.getMonthOfYear == 8 && now.getYear == 2019)
oder Du setzt z.B. ein Item in Abhängigkeit vom Datum über entsprechende Rules und wertest dieses Item aus. Letzteres kann von Vorteil sein, wenn die Bedingungen ansonsten zu kompliziert werden. Man kann ja Rules über Time cron Trigger auslösen lassen...
Deine Schreibweise des Lambdas ist fehlerhaft. Mag sein, dass Du mit den geschweiften Klammern zum Ziel kommst, es ist aber verkehrt. Korrekt sieht die Rule so aus:
Code: Alles auswählen
var Timer tSunset = null
rule "zwei Minuten nach sunset"
when
Channel 'astro:sun:xxxx:set#event' triggered START
then
tSunset?.cancel
tSunset = createTimer(now.plusMinutes(2), [|
gSUG.allMembers.forEach[i | i.sendCommand(DOWN)]
])
end
Alternativ kannst Du das Lambda auch nach dem createTimer() definieren, aber so wie ich es geschrieben habe, wird deutlich, dass es sich beim Lambda um ein Argument der Funktion createTimer() handelt.
Alles innerhalb eines Lambdas befindet sich in einem eigenen Kontext, es ist also nicht nötig, noch geschweifte Klammern zu setzen.
Man sollte einen Timer möglichst nicht ohne Handler anlegen, sonst verliert man die Kontrolle darüber. So, wie ich es geschrieben habe, ist sichergestellt, dass der Timer exakt einmal läuft, gleichgültig, wie oft die Rule triggert. dabei gewinnt der letzte Trigger, da vor Anlegen des Timers ein eventuell laufender Timer abgebrochen wird.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet