Also, es gibt ja immer viele Wege, die nach Rom führen... Aber man sollte beim Programmieren immer versuchen, den einfachsten Weg zu gehen.
Code: Alles auswählen
var Timer tTuer = null
rule "Licht An - 1 Minute warten - Licht Aus" // Haustuer
when
Item eg_flur_haustuer changed to OPEN
then
if(now.getMinuteOfDay < 22*60+30 && now.getMinuteOfDay >= 6*60) // Tagsüber nicht
return;
if(eg_flur_licht_treppe.state == ON) // Falls Licht schon an, nichts tun
return;
tTuer?.cancel
eg_flur_licht_treppe.sendCommand(ON)
tTuer = createTimer(now.plusMinutes(1), [
eg_flur_licht_treppe.sendCommand(OFF)
])
end
Die Definition der globalen Variable hat peter-pan ja schon erwähnt. Die ist vielleicht auch vorhanden, aber da sie in der Rules Datei noch vor der ersten Rule erfolgen muss, wird sie gerne beim Code Kopieren vergessen
Du möchtest den Timer nur zwischen 22:30 und 6:00 Uhr ausführen. Entsprechend ist es sinnvoll, dies als Abbruchbedingung zu definieren- Dabei ist die Schreibweise 6*60 statt 360 prima, weil gut nachvollziehbar. + 00 hingegen ist nicht sinnvoll, es erhöht die Lesbarkeit nicht sondern stört nur.
Durch die Umkehr der Logik (statt den Code auszuführen, falls die Bedingung erfüllt ist, wird die Rule abgebrochen, falls die Bedingung erfüllt ist) ergeben sich natürlich Abweichungen bei den Grenzen. Das Maximum <= 23:60+59 und das Minimum >= 0*60+0 ist hingegen zu jeder Zeit wahr, es gibt also keinen Grund, dies in irgendeiner Weise zu berücksichtigen, also weg damit.
Es ist auch nicht sinnvoll, die Bedingungen zu vermischen, auch das trägt nicht zur Lesbarkeit bei, also besser für den Schaltzustand eine weitere Abfrage spendieren. Durch die Negierung könnte die Rule sogar jeweils darüber informieren, warum der Abbruch erfolgte (man muss dann natürlich noch geschweifte Klammern ergänzen).
Erst jetzt - es ist sicher, dass der Timer auch gestartet wird - wird ein eventuell laufender Timer gestoppt.
Anschließend wird das Licht eingeschaltet und ein Timer zum Ausschalten angelegt. Dabei wird für beide Befehle die Methode verwendet.
Ich dränge immer darauf, die Action nur zu nutzen, wenn sich dies nicht vermeiden lässt. Das wäre der Fall, wenn man den Itemnamen durch eine Formel errechnen muss und keine Möglichkeit hat, das entsprechende Item anderweitig als echtes Item zur Verfügung zu stellen. Dann muss man auf die Action zurückgreifen, denn hier wird kein Item übergeben, sondern ein String.
Es ist außerdem sehr schlechter Stil, einmal die Action und das andere Mal die Methode zu nutzen...
Nebenbei ist es natürlich nicht sinnvoll, Code unnötig doppelt in einer Rule zu integrieren. Warum sollte man den identischen Code für die Zeit vor Mitternacht und die Zeit nach Mitternacht getrennt nutzen? Selbst wenn man z.B. unterschiedliche Einschaltzeiten nutzen will, wäre es sinnvoller, dies über eine Variable vorher zu errechnen und anschließend diese Variable beim Anlegen des Timers zu verwenden.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet