peter-pan hat geschrieben: ↑21. Jan 2025 15:37
Welchen Code meinst du ? Deinen oder meinen Schnipsel ?
Schon den meinigen

deshalb habe ich ihn ja eingefügt.
Erfahrungsgemäß ist es oftmals nicht gut, zu viel Code stehen zu lassen, damit wird die Rule nur unübersichtlich und man übersieht vielleicht am Ende einen Fehler, der sich durch das Auskommentieren eingeschlichen hat.
So sollte die Rule sauber laufen:
Code: Alles auswählen
rule "Haustuer Status Wechsel"
when
Item Dummy_4 changed to ON or // Für Tests
Item HmIP_SWDO_I_E754_1STATE changed to "OPEN" // String-Item
then
val sunSet = (Sunset_Time.state as DateTimeType).getZonedDateTime(ZoneId.systemDefault()) // https://community.openhab.org/t/solved-datetimetype-is-deprecated/37296/31
val sunRise = (Sunrise_Time.state as DateTimeType).getZonedDateTime(ZoneId.systemDefault())
logInfo("homematic.doorEntry","Rule durch {} ausgelöst", triggeringItemName)
logInfo("homematic.doorEntry","Sonnenuntergang um {}", sunSet)
logInfo("homematic.doorEntry"," Sonnenaufgang um {}", sunRise)
logInfo("homematic.doorEntry"," aktuelle Zeit {}")
if(HmIP_SWDO_I_E754_1STATE.state.toString != "OPEN") { // Türkontakt meldet NICHT OPEN
logInfo("homematic.doorEntry","Status Haustür {} - Abbruch", HmIP_SWDO_I_E754_1STATE.state)
return;
}
if(Pow_02.state == ON) { // Stehleuchte bereits eingeschaltet
logInfo("homematic.doorEntry","Stehlampe ist an - Abbruch")
return;
}
if(now.isAfter(sunSet)) {
logInfo("homematic.doorEntry","Es ist nach Sonnenuntergang")
/* Schaltbefehl zu Testzwecken deakiviert
Pow_02.sendCommand(ON) // Licht einschalten
*/
return;
}
if(now.isBefore(sunRise)) {
logInfo("homematic.doorEntry","Es ist vor Sonnenaufgang")
/* Schaltbefehl zu Testzwecken deakiviert
Pow_02.sendCommand(ON) // Licht einschalten
*/
return;
}
logInfo("homematic.doorEntry","Nix passiert") // wird tagsüber bei ausgeschalteter Leuchte ausgegeben
end
Natürlich ist der Itemname HmIP_SWDO_I_E754_1STATE nicht so wirklich elegant

aber sei's drum.
Der Vergleich != "OPEN" ist nur drin, damit die Ausgabe des Status überhaupt eine Berechtigung hat

im Grunde könnte der Code auch entfallen, wie Dein Kommentar ja auch anmerkt.
Zu logInfo() und den anderen Log-Befehlen habe ich ja schon häufiger was geschrieben... der erste String ist der letzte Teil des Loggernamens. Von der Karaf Konsole aus reicht ein
Code: Alles auswählen
log:set WARN org.openhab.core.model.script.homematic.doorEntry
um alle logInfo-Befehle für diese Rule zu deaktivieren. Deshalb ist es wichtig, diesen ersten String innerhalb einer Rule identisch zu setzen. Leerzeichen und Sonderzeichen sollte man nicht verwenden, auch wenn der Logger das klaglos erträgt - ob dann der set-Befehl sauber funktioniert steht auf einem anderen Blatt. Die Namenskonventionen in openHAB fordern CamelCase mit kleingeschriebenem Wortanfang.
Der Punkt nach homematic hilft übrigens, wenn Du weitere Rules hast, in denen Du ebenfalls "homematic." als ersten Teilstring einsetzt. Dann kannst Du nämlich z.B. mittels
jegliches Logging dieser Zeilen abschalten, jedoch mit dem Befehl von oben dennoch das Logging für doorEntry wieder einschalten - Die Einstellungen werden vererbt, solange kein eigener Eintrag existiert. Mittels
Code: Alles auswählen
log:set DEFAULT org.openhab.core.model.script.homematic.doorEntry
kann man die Einstellung auch gezielt erben lassen.
/* ... */ markiert alles zwischen den Sternchen als Kommentar. Vorteil: die Einrückungen des Codes bleiben so erhalten.
Zum grundsätzlichen Code:
isAfter() und
isBefore() sollten für
now() zur Verfügung stehen - wie gesagt habe ich das heute Mittag bei mir erfolgreich ausprobiert (OH4.3.2 - ging aber auch schon mit früheren Versionen).
Der Vergleichswert muss vom Typ
ZonedDateTime sein - die deprecated Meldung bezieht sich nur auf die Version
ZonedDateTime() ohne Angabe der Zeitzone. Bisher hat openHAB dann
ZoneId.systemDefault() automatisch gesetzt - das ist der Teil, der in der nächsten(?) Version nicht mehr funktionieren wird. Dabei geht es um Konsistenz über alle Module von openHAB - das Verhalten soll schlicht an jeder Stelle gleich sein.
Ansonsten wird die letzte Zeile natürlich sehr wohl ausgeführt, und zwar zwischen Sonnenauf- und -untergang, sofern die Rule getriggert wird und die Stehleuchte gerade aus ist (oder anders ausgedrückt: wenn alle vorgehenden Bedingungen nicht erfüllt sind).
