Wie kommst Du darauf, dass die Rule so korrekt sein könnte?
Die Definition einer Rule per Textdatei hat einen exakt festgelegten Rahmen:
Code: Alles auswählen
rule "Name der Rule"
when
<Trigger der Rule>
then
<auszuführender Code>
end
Das heißt: zwischen den Schlüselworten
rule und
when steht
exakt ein String, sobald dieser Leerzeichen und/oder
Sonderzeichen enthält muss der String in Anführungszeichen gesetzt werden.
Zwischen den Schlüsselworten
when und
then steht mindestens ein Trigger, es können beliebig viele Trigger, mit dem Schlüsselwort
or getrennt, angegeben werden. Ein Trigger besteht aus dem Schlüsselwort, welches die Art des Triggers beschreibt, also z.B.
Item für ein Item, welches den Trigger liefert, dann einer Eingrenzung z.B. auf das konkrete Item (z.B. MeinItem) und danach, welche Art Trigger auftreten muss, z.B.
changed,
received update oder
received command, optional kann noch explizit der Wert genannt werden, also z.B.
Diese Trigger entsprechen zu 100% denen, die auch über die Main UI im "when" Teil der Rule gesetzt werden können (rate mal, warum der Bereich in der UI den Namen when trägt)
Zwischen den Schlüsselworten
then und
end steht der auszuführende Code, die beiden Schlüsselworte sind nicht Bestandteil des Codes.
Ein globale Variable muss zu Beginn der Datei definiert werden, nicht irgendwo wo es gerade mal passt.
Eine lokale Variable muss innerhalb des Codeblocks definiert werden, bevor sie verwendet wird, innerhalb oder oberhalb des Kontextes, in dem sie benötigt wird.
Code: Alles auswählen
// Dateikopf
var Timer tMeinTimer = null // globale Variable
rule "meine erste Rule"
when
...
then
...
end
var MeineVariable1 = iregendwas // nicht erlaubt! Globale Variablen müssen vor der ersten Rule in der Datei definiert werden!
rule "meine zweite Rule"
var MeineVariable2 = irgendwas // nicht erlaubt! hier darf gar nichts stehen (außer einem Kommentar)
when
var MeineVariable3 = irgenwas // nicht erlaubt! hier dürfen nur Trigger stehen!
then
var MeineVariable4 = 4 // lokal definierte Variable
if(true) {
var MeineVariable5 = 5
logInfo("test","MeineVariable5 = {}",MeineVariable5) // funktioniert super!
}
logInfo("test","MeineVariable5 = {}",MeineVariable5) // geht schief! die Variable ist in diesem Kontext nicht definiert!
end
Ich habe oben bewusst auf Einrückungen verzichtet, diese sind optional. Allerdings helfen sie bei der Lesbarkeit

Hier sollte aber vor allem klar werden, wo Variablen definiert werden dürfen, und wo nicht.
Interessant ist noch die Variable MeineVariable5. Die Definition der Variablen erfolgt innerhalb des Kontextes von if(), nachdem dieser Kontext beendet wurde (also außerhalb der {}) ist die Variable nicht mehr definiert.
Steht hinter if kein Klammerpaar {}, so gehört nur der nächste Befehl zum Kontext.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet