Seite 1 von 1

calendar.timeInMillis Konvertierung

Verfasst: 14. Mär 2021 18:24
von shuo
Hallo zusammen,
ich habe eine Rule bei der ich den Status eines Items von Nacht auf Tag (und umgekehrt) abhängig von Astro umschalte.
Die Rule schaut folgendermaßen aus:

Code: Alles auswählen

rule "OpenHAB system started - astro"
when
    System started
then
    createTimer(now.plusSeconds(180)) [ |
        logInfo("RULE", "--> astro init")
        if (now.isAfter((Sunset_Time.state as DateTimeType).calendar.timeInMillis) ||
            now.isBefore((Sunrise_Time.state as DateTimeType).calendar.timeInMillis)
        ) {
            logInfo("RULE", "--> Night_State ON")
            postUpdate(Night_State, ON)
        } else {
            logInfo("RULE", "--> Night_State OFF")
            postUpdate(Night_State, OFF)
        }
    ]
end
Allerdings bekomme ich immer folgenden Fehler angezeigt:

Code: Alles auswählen

The method or field calendar is undefined for the type DateTimeType
Ich habe dann irgendwo in einer Hilfe gefunden, dass ich zonedDateTime.toInstant.toEpochMilli verwenden sollte.
Allerdings ein

Code: Alles auswählen

(now.isAfter((Sunset_Time.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
bringt den Fehler:

Code: Alles auswählen

Type mismatch: cannot convert from long to ChronoZonedDateTime<?>(org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types)
Hat jemand eine Idee was ich falsch mache und ich es beheben kann?

Re: calendar.timeInMillis Konvertierung

Verfasst: 14. Mär 2021 20:16
von udo1toni
Ich möchte empfehlen, komplett anders an das Problem heranzugehen:

Code: Alles auswählen

rule "Tag oder Nacht"
when
    Item AstroElevation changed
then
    var Nacht = OFF
    if((AstroElevation.state as Number).intValue < -3) 
        Nacht = ON
    if(Night_State.state != Nacht)
        Night_State.postUpdate(Nacht.toString)
end
Die Rule benötigt ein Item (AstroElevation), welches mit dem Channel astro:sun:local:position#elevation verbunden ist. Die Rule triggert bei jeder Aktualisierung von astro, was auch beim Systemstart geschieht ;) Wenn die Sonne unterhalb des festgelegten Grenzwertes liegt, wird der Status entsprechend gekippt. Der Status wird nur gesetzt, wenn dies notwendig ist.

Re: calendar.timeInMillis Konvertierung

Verfasst: 15. Mär 2021 10:51
von shuo
Hi Udo,
danke für die Rückmeldung.
Ich habe bereits eine zweite Rule die sowas wie Du vorgeschlagen hast abdeckt:

Code: Alles auswählen

rule "Update NightState"
when
    Item Sun_Elevation changed
then
    if(Sun_Elevation.state >  0){
        if(Night_State.state != OFF) postUpdate(Night_State, OFF)
    } else {
        if(Night_State.state != ON) postUpdate(Night_State, ON)
    }
end
Die erste Rule "system started" hatte ich eingebunden um bei einem Neustart den richtigen Zustand zu haben, sodass wir nicht auf ein update von Sun Evelation warten müssen.

Re: calendar.timeInMillis Konvertierung

Verfasst: 16. Mär 2021 05:09
von udo1toni
Der Punkt ist, dass Du die Rule für System started gar nicht brauchst. Sun_Elevation wird ja gesetzt, sobald astro online geht. Das dürfte wesentlich früher geschehen als 3 Minuten nach dem Start der Rules Engine.

Re: calendar.timeInMillis Konvertierung

Verfasst: 16. Mär 2021 22:20
von shuo
Hi Udo. Klassischer Fall von Overengineering. Danke für die Antwort

Nachtrag: Aber aus reinem Interesse: Was habe ich denn oben in der Rule falsch gemacht?

Re: calendar.timeInMillis Konvertierung

Verfasst: 16. Mär 2021 22:45
von udo1toni
:)