Der Timer ist ein Eintrag im Scheduler. Die Rule startet, macht den Eintrag im Scheduler und ist wieder beendet.
Wenn Du also einen Timer verwenden willst, um übereifriges Schalten zu verhindern, gibt es einen extrem simplen Ansatz:
Code: Alles auswählen
var Timer tSperre = null
rule ...
then
if(tSperre !== null) // tSperre ist nicht identisch mit null -> Timer gesetzt
return; // also Abbruch der Rule
tSperre = createTimer(now.plusMinutes(5),[|
tSperre = null
])
// ab hier das, was die Rule erledigen soll
Die Rule wird getriggert und prüft, ob der Timer vorhanden ist (tSperre !== null). Ist das der Fall, wird die Ausfühung der Rule abgebrochen.
Läuft der Timer ab, so löscht er die Timer Variable, so dass nun die Abfrage beim nächsten Durchlauf nicht mehr erfüllt ist.
Entsprechend ist das erste, was man im Code erledigt, den Timer zu aktivieren, um die Rule gleich mal für die weitere Ausführung zu sperren.
Deine Logzeile ist ein Verbrechen.
Die Log-Befehle erwarten zwei Strings als Parameter, wobei der erste String der Loggername ist - allerdings nur ein Teil des Loggernamens, da alle Logger für Rules den gleichen Vorfahren haben. Der Loggername ist möglichst kurz und enthält keine Zeichen außer das englische Alphabet, evtl. noch die arabischen Ziffern und vielleicht einen Punkt. Im schlimmsten Fall meinetwegen noch einen Unterstrich oder ein Minuszeichen, das ist aber schon unüblich.
in openHAB wird gewöhnlich CamelCase verwendet, also z.B. rolloSteuerung - wobei das schon viel zu lang ist, natürlich handelt es sich um eine Steuerung, was denn sonst? Sinnvoll wäre also "rollo" als Loggername, zusammen mit dem Vorfahren erscheint dann [org.openhab.core.model.script.rollo] im Log. Der zweite String ist die eigentliche Meldung die geloggt wird.
Nutzt man die Loggernamen korrekt

, dann kann man einfach im laufenden Betrieb über die Karaf Konsole das Logging gezielt ein- und ausschalten, aber nicht nur
ON/
OFF, sondern in Stufen (
DEFAULT,
DEBUG,
INFO,
WARN,
ERROR,
OFF)
DEFAULT erbt den Loglevel vom Vorfahren (der steht gewöhnlich auf
INFO)
DEBUG gibt alle Logmeldungen aller Logbefehle aus.
INFO loggt keine
logDebug() Anweisungen
WARN loggt nur
logWarn() und
logError()
ERROR loggt ausschließlich
logError() Meldungen
OFF schaltet das Logging für diesen einen Logger komplett aus.
Es ist großer Bullshit, das über ein
if(log) zu erledigen, man sollte stattdessen die komfortablen Systemwerkzeuge nutzen.
Und falls man das partout über die UI in openHAB schalten will (das geht momentan leider noch nicht für die Rules, wohl aber für die meisten Addons), dann wäre ein gangbarer Weg, über das Exec Binding - oder aus einer Rule heraus über executeCommandLine() - einen einzelnen Befehl an die Karaf Konsole zu senden, der dann den Loglevel wunschgemäß setzt.
Die Umschaltung ist in jedem Fall unmittelbar und persistent.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet