Zu 1: Ich definiere iOffset als Integer mit dem Wert 0. Da für Januar und Dezember kein Offset angegeben ist, passt der Wert 0. Natürlich kannst Du auch zwei case Anweisungen für diese beiden Fälle definieren. Der Timer kann auch direkt ausgeführt werden (also now.plusMinutes(0)), das spielt keine Rolle.
Zu 2: Das ist eben das Problem, wenn man den Offset von einem Wert abhängig macht, der dafür eigentlich nicht geeignet ist.

Die einfachste Wariante wäre, statt getMonthOfYear getDayOfYear zu verwenden. Du kannst dafür ebenfalls switch - case verwenden, allerdings in anderer Form:
Code: Alles auswählen
val Integer iDOY = now.getDayOfYear
switch (true) {
case iDOY > 0 && iDOY < 16: iOffset = 0 // von 1. bis 15. Januar
case iDOY > 15 && iDOY < 35: iOffset = 20 // von 16. Januar bis 3. Februar
...
}
Du musst also jeweils Unter- und Obergrenze setzen.
Aber wie oben schon erwähnt, wäre es das Einfachste, die in Astro integrierten Funktionen zu nutzen. Egal, welchen Trigger man nutzt, ob nun Sonnen-/auf/unter/-gang (0° Sonnenhöhe), Bürgerliche Dämmerung (-6°), Nautische Dämmerung (-12°) oder gar Astronomische Dämmerung (-18°), das Astro Addon steuert die Läden jederzeit bei einer ähnlichen Helligkeit. Zusätzlich lassen sich Ober- und Untergrenzen sowie ein Offset zum errechneten Zeitpunkt setzen, also z.B. 12 Minuten vor der Bürgerlichen Dämmerung oder 17 Minuten nach Sonnenuntergang.
openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)