Na ja, vielleicht ist ja immer irgendeine Eigenschaft nicht erfüllt (auch wenn Dir das so scheint). Ein wenig Logging (und ordentliche Formatierung des Codes) täte gut:
Code: Alles auswählen
rule "Beleuchtung bei Dunkelheit an und aus zw. 5 und 23 Uhr"
when
Time cron "0 0/15 * * * ?"
then
val CurrentHour = now.getHourOfDay
logInfo("autoswitch","Stunde {}",CurrentHour)
logInfo("autoswitch","Onlineschaltung {}",Onlineschaltung.state)
if(!(Elevation.state instanceof Number)) {
logError("autoswitch","Elevation nicht vom Typ Number! {}",Elevation.state)
return;
}
logInfo("autoswitch","Elevation {}",Elevation.state)
var String myState = "OFF"
if (CurrentHour > 4 && CurrentHour < 23 && (Elevation.state as Number) <= 0 && Onlineschaltung.state == ON)
myState = "ON"
if(Beleuchtung.state.toString != myState) Beleuchtung.sendCommand(myState)
end
Ein paar Änderungen habe ich auch noch einfließen lassen. val statt var: Da CurrentHour sich über die Laufzeit der Rule nicht ändert, reicht es, den Wert als Konstante zu speichern. logInfo() gibt die sicheren Werte aus. Der log-Kontext heißt dann org.openhab.model.script.autoswitch (oder doch noch org.eclipse.smarthome.model.script.autoswitch? kommt auf die Version von openHAB an)
Bei Elevation gibt es eine mögliche Fehlerquelle, weshalb die Rule dann auch ein logError() verwendet und die Rule beendet, sollte Elevation unerwarteter Weise nicht vom Typ Number sein. Es gibt aber noch eine weitere Möglichkeit, nämlich dass Elevation einheitenbehaftet ist, also z.B. 0° statt 0 herauskommen. Dann müsste der Vergleich geändert werden zu
Code: Alles auswählen
if (CurrentHour > 4 && CurrentHour < 23 && (Elevation.state as Number).floatValue <= 0 && Onlineschaltung.state == ON)
Das ist auch der wahrscheinlichste Grund, warum der Vergleich nicht korrekt funktioniert.
Nun wird der neue Sollwert gesetzt, default ist OFF, falls alle Bedingungen erfüllt sind aber ON.
Anschließend - und das ist der größte Unterschied - sendet openHAB den Befehl nur, falls sich der Status vom Soll unterscheidet. Du möchtest nicht viertelstündlich einen Befehl schicken, der eigentlich unnötig ist.