Also, mal ein paar Schritte zurück... Ausgehend von der (fehlerkorrigierten) Rule ist es sinnvoll,
strategisch Logging einzubauen.
Code: Alles auswählen
// Globale Variablen immer zu Beginn der Datei definieren!
var Timer tLum = null
var Number nLum = 0
rule "Luminanz"
when
Item dataLum changed
then
logInfo("luminanz","Rule getriggert!")
if(!(dataLum.state instanceof Number)) {
logWarn("luminanz","dataLum enthält keinen gültigen Wert!")
return;
}
logInfo("luminanz","dataLum: {}; tLum: {}",dataLum.state,tLum)
if ((dataLum.state as Number) < 4 && now.getHourOfDay > 17 && now.getHourOfDay < 23 && tLum === null) {
logInfo("luminanz","Timer wird angelegt!")
nLum = 0
tLum = createTimer(now.plusSeconds(1), [|
logInfo("luminanz","Timer wird ausgeführt! nLum: {}",nLum)
var Number nTime = 1
nLum += 1
switch nLum {
case 1: {
Markise.sendCommand(DOWN)
nTime = 60
}
case 2: {
Roll_WZ_W_li.sendCommand(DOWN)
}
case 3: {
Roll_WZ_W_re.sendCommand(DOWN)
}
case 4: {
Markise.sendCommand(DOWN)
}
case 5: {
Roll_WZ_W_li.sendCommand(DOWN)
}
case 6: {
Roll_WZ_W_re.sendCommand(DOWN)
nTime = 600
}
default: {
nTime = 0
}
}
if(nTime > 0)
tLum.reschedule(now.plusSeconds(nTime))
else {
tLum = null
}
])
}
end
Die Rule ist eigentlich narrensicher
Das erste Logging ist zu Beginn der Rule. Falls kein gültiger Wert zur Verfügung steht, kommt ohnehin eine Warnung.
Ist soweit erst mal alles in Ordnung, wird eine Zeile mit dem konkreten Wert und der Variablen tLum ausgegeben.
Ist der Wert zu hoch oder die Timer Variable ist nicht null, (oder das Zeitfenster stimmt nicht... Zeitstempel steht vorne) wird der Timer nicht angelegt (was ja auch korrekt ist).
Falls die Bedingungne aber erfüllt sind, wird der Timer angelegt.
Bei jeder Ausführung des Timers wird ebenfalls eine Logzeile ausgegeben, zusammen mit dem Zählerstand.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet