Der Code ist ziemlich sicher fehlerhaft...
Erst mal: Innerhalb des Timers ist die Variable myTimer niemals null (es sei denn, Du löschst sie noch an einer anderen Stelle, z.B. in einer anderen Rule)
Dann löschst Du ja beim Auslösen der Rule den Timer, falls er vorhanden ist. Da es sonst keine Überprüfung zu geben scheint, gibt es auch keine Grund, die Timer Variable innerhalb des Timers zu löschen.
Du hast innerhalb des Timers einen Vergleich
, der dazu führt, dass der Timer abgebrochen wird. Der Abbruch geschieht in zwei Situationen. Entweder der Status von LuefterStufe ist 2, dann spielt der Status von Luefter1 keine Rolle, oder Luefter1 hat den Status 60, dann spielt der Status von LuefterStufe keine Rolle. Dein Kommentar besagt aber etwas anderes:
Code: Alles auswählen
// Wenn die Bedingung aus dem Vergleich erfüllt wurde (LuefterStufte==2 und Luefter1 nicht 60)
Wobei der Code nach der Bedingung genau dann ausgeführt wird, wenn
keine der Bedingungen zutrifft, also LuefterStufe != 2 UND Luefter1 != 60
Dann verwendest Du ein Number Item um den Alarm zu speichern, was eher ungewöhnlich ist. Vielleicht willst Du das zur grafischen Auswertung so haben?
So, wie Du die Rule geschrieben hast, passiert folgendes: Du sendest den Befehl "2" an das Item LuefterStufe. Daraufhin wird ein eventuell noch vorhandener Timer gelöscht und anschließend neu angelegt (unter der Voraussetzung, dass WAC350_Geringe_Feuchte zu diesem Zeitpunkt ON ist).
Nach 60 Sekunden läuft der Timer ab (falls bis dahin kein weiterer Befehl "2" an das Item LuefterStufe gesendet wurde). Ist bis dahin auch keine andere Lüfterstufe gewählt worden (der Status von LuefterStufe ist immer noch 2) wird der Timer gelöscht.
Falls die Stufe nicht mehr 2 ist, aber Luefter1 den Wert 60 hat, wird der Timer gelöscht.
Trifft beides nicht zu, werden verschiedene Alarme aktiviert.
Ich denke nicht, dass dies Dein Ziel war

insbesondere das mit dem Item1 Status 2 ODER Item2 Status 60.
Die Kommentare machen den Code so etwas unübersichtlich. Ohne Ballast sieht die Rule so aus:
Code: Alles auswählen
// globale Variablen zu vor der ersten Rule der Datei definieren
var Timer myTimer = null
rule "WAC350 Geringe feuchte Alarm"
when
Item LuefterStufe received command 2
then
if(WAC350_Geringe_Feuchte.state != ON)
return;
myTimer?.cancel
myTimer = createTimer(now.plusSeconds(60), [ |
if(LuefterStufe.state == 2 || Luefter1.state == 60)
return;
WAC350_Geringe_Feuchte_Alarm.postUpdate(1)
sendBroadcastNotification("Alarm geringe Feuchte um " + now.toString("HH:mm") + " Uhr")
logWarn("WAC Alarme","Geringe Feuchte Alarm")
])
end
Insbesondere möchte ich auf die Zeile
myTimer?.cancel hinweisen, das ist gleichbedeutend mit
if(myTimer !== null) myTimer.cancel, aber wesentlich besser lesbar.
Was ist Luefter1? Was ist WAC350_Geringe_Feuchte? Wo wird die eigentliche Messung vorgenommen?
Gewöhnlich wird man die Luftfeuchte in % angeben, falls also Luefter1 in Wirklichkeit die Luftfeuchte ist, müsstest Du eigentlich auf >= 60 prüfen, um bei 60 %
oder mehr den Timer abzubrechen. Es scheint mir aber der falsche Ansatz, dies exakt einmal 60 Sekunden nach Schalten auf Stufe 2 zu prüfen und dann nie mehr.
openHAB5.1.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.9 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte