Seite 1 von 2

JodaTime to JavaTime

Verfasst: 4. Mär 2021 17:40
von SaschaQ
Hallo zusammen,

ich bin nun auf Openhab 3 umgestiegen und habe in meinen Rules mehrfach die JodaTime verwendet.

Wie kann ich das am einfachsten umstellen?

Hier ein paar Rules, wo ich es umstellen müsste:

Code: Alles auswählen


if (now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {	
	createTimer(now.plusSeconds(3), [ |
	echo_dot_schlafzimmer_TTS_Volume.sendCommand(60)
	echo_dot_schlafzimmer_TTS.sendCommand('Test')
	])
	createTimer(now.plusSeconds(3), [ |
	echo_dot_schlafzimmer_TTS_Volume.sendCommand(30)
	])
	}
	
	}
	
end

Code: Alles auswählen


rule "Weihnachtsbeleuchtung Ende November bis Anfang Januar"
when
    Item ws_daemmerung changed
then
    if((now.getDayOfYear > now.withDate(now.getYear,11,26).getDayOfYear || now.getDayOfYear < 8)) {
        if(ws_daemmerung.state == OPEN) { 
            au_terrasse_st.sendCommand(ON)
            au_eingang_st.sendCommand(ON)
			
			createTimer(now.plusSeconds(10), [ |
			
			var DecimalType hue = new DecimalType(43)
            var PercentType sat = new PercentType(76)
            var PercentType bright = new PercentType(70)
            var HSBType light = new HSBType(hue,sat,bright)
            au_garten_color.sendCommand(light.toString)
			au_vorgarten_color.sendCommand(light.toString)
					
			])
			
        } else {
            au_eingang_st.sendCommand(OFF)
            au_terrasse_st.sendCommand(OFF)
        }
    }
end

Code: Alles auswählen

rule "Jalousie Abendverschattung inkl Lüftungsstufe"

when

Time cron "0 45 22 24-30 APR ?" or // vom 24. - 30. April
Time cron "0 45 22 * MAY-AUG ?" or // vom 1. Mai bis 31. August
Time cron "0 45 22 1-15 SEP ?" or // vom 1. bis 15. September
Time cron "0 45 21 16-30 SEP ?" or // vom 16. bis 30. September
Time cron "0 45 21 * JAN-MAR,OCT-DEC ?" or // vom 1. Oktober bis 31. März
Time cron "0 45 21 1-23 APR ?" // vom 1. bis 23. April

then
	eg_wohnzimmer_rechts_rol.sendCommand(100)
    gEGOGRolladen.members.forEach[r|
        val cKontakt = gEGOGMagnetkontakte.members.filter[c|c.name.split("_").get(1) == r.name.split("_").get(1)].head
        r.sendCommand(
            if(cKontakt.state == CLOSED) 100 else 80
        )
    ]
end

Code: Alles auswählen


rule "Pollenwarnung NRW Sascha"
when
    Time cron "30 10 6,13,20 * * ?" // fixe Zeiten 06:10:30, 13:10:30, 20:10:30
                                    // die Zeiten sind willkürlich gewählt...
then
    gPollen.members.filter[i|i.name.split("_").get(2) == "0"].forEach[p|
        var String strMessage = "Achtung! Pollenflugvorhersage für "
        var String strSorte = p.name.split("_").get(1)
        strMessage = strMessage + strSorte + ": "
        gPollen.members.filter[j|j.name.split("_").get(1) == strSorte && j.state.toString != "-1" && j.state.toString != "0"].sortBy[name].forEach[q|
//      gPollen.members.filter[j|j.name.split("_").get(1) == strSorte && j.state.toString != "-1"].sortBy[name].forEach[q|
            if(strMessage.endsWith(" Pollenflug"))
                strMessage = strMessage + "; "
            switch (q.name.split("_").get(2)) {
                case "0" : strMessage = strMessage + "Heute "
                case "1"   : strMessage = strMessage + "Morgen "
                case "2"   : strMessage = strMessage + "Übermorgen "
            }
            switch (q.state.toString) {
                case "0"   : strMessage = strMessage + "kein"
                case "0-1" : strMessage = strMessage + "kein bis niedriger"
                case "1"   : strMessage = strMessage + "niedriger"
                case "1-2" : strMessage = strMessage + "niedriger bis mittlerer"
                case "2"   : strMessage = strMessage + "mittlerer"
                case "2-3" : strMessage = strMessage + "mittlerer bis starker"
                case "3"   : strMessage = strMessage + "starker"
            }
            strMessage = strMessage + " Pollenflug"
        ]
        strMessage = strMessage + "."
        if(strMessage.endsWith(" Pollenflug."))  // diese Zeile gegebenenfalls auskommentieren
            sendBroadcastNotification(strMessage)
//        else {
//            strMessage = "Achtung! Pollenflugvorhersage für "+strSorte+": Kein Pollenflug."
//            sendBroadcastNotification(strMessage)
//        }
    ]
end

Code: Alles auswählen


rule "Regendauer berechnen"
when
    Item ws_regen changed
then
    var Number nDuration = 0

    if(ws_regen.state == CLOSED) {
        if(RegenOffTime != null)
            nDuration = ((now.millis - RegenOffTime)/1000).intValue
        val Number nMin = (nDuration/60).intValue
        val Number nSec = nDuration - nMin * 60
        logInfo("timeRegen","Es hat {} Minute(n) und {} Sekunde(n) geregnet",nMin,nSec)
        ws_Regendauer.postUpdate(nMin.toString+":"+nSec.toString)
    } else {
        RegenOffTime = now.millis
    }
end



Viele Grüße
Sascha

Re: JodaTime to JavaTime

Verfasst: 4. Mär 2021 19:10
von udo1toni
Na indem Du die entsprechenden Funktionen nachschlägst und ersetzt. JavaTime bietet weitgehend gleiche Funktionen. Was am ehesten fehlt ist getMinuteOfDay und millis, für ersteres müsste man im Zweifel getHour*60 + getMinute nutzen, für Letzteres muss man auf nanos ausweichen (1 milli sind 1.000.000 nanos)
Statt now wirst Du vermutlich ZonedDateTime.now schreiben müssen, ich bin aber noch nicht tiefer eingestiegen...

Re: JodaTime to JavaTime

Verfasst: 4. Mär 2021 19:52
von SaschaQ
Wärst du so nett und würdest mir die JavaTime Pendants zu den Rules nennen? Ich kann das irgendwie nicht richtig zuordnen.

Re: JodaTime to JavaTime

Verfasst: 4. Mär 2021 20:34
von sihui
SaschaQ hat geschrieben: 4. Mär 2021 19:52 JavaTime Pendants
HIer ist eine komplette Auflistung:

https://community.openhab.org/t/datetim ... 3-x/107197

Re: JodaTime to JavaTime

Verfasst: 4. Mär 2021 20:39
von udo1toni
Ich glaube, es geht ihm mehr darum, eine Gegenüberstellung altes Statement <-> neues Statement zu haben. also z.B.

now <-> ZonedDateTime.now
.getHourOfDay <-> .getHour

usw.

Aber da bin ich ehrlich gesagt raus, das ist reine Fleißarbeit ;)

Re: JodaTime to JavaTime

Verfasst: 4. Mär 2021 21:04
von SaschaQ
Kann man denn noch direkt Vergleiche machen wie hier?

(now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {

Re: JodaTime to JavaTime

Verfasst: 4. Mär 2021 21:08
von sihui
udo1toni hat geschrieben: 4. Mär 2021 20:39 das ist reine Fleißarbeit ;)
Ich bin auch raus, dafür ist mir die Zeit zu schade :D

Re: JodaTime to JavaTime

Verfasst: 4. Mär 2021 21:11
von sihui
SaschaQ hat geschrieben: 4. Mär 2021 21:04 Kann man denn noch direkt Vergleiche machen wie hier?
Das solltest du dir direkt selbst beantworten können: wenn es in deiner openHAB3 Installation funktioniert: ja. Wenn nicht: nein.
SaschaQ hat geschrieben: 4. Mär 2021 21:04 (now.getHourOfDay() <= 19 && now.getHourOfDay() >= 8) {
Versuch es mal mit

Code: Alles auswählen

(now.getHour() <= 19 && now.getHour() >= 8) {
(diese Lösung steht übrigens schon in Udo's vorheriger Antwort :mrgreen: )

Re: JodaTime to JavaTime

Verfasst: 4. Mär 2021 21:20
von SaschaQ
Okay das hat geklappt, vielen Dank, damit sind schonmal ein Großteil der Rules erschlagen.
Können die Timer denn so bleiben:

createTimer(now.plusSeconds(3)

und die crons:

Time cron "0 45 22 24-30 APR ?" or // vom 24. - 30. April
Time cron "0 45 22 * MAY-AUG ?" or // vom 1. Mai bis 31. August
Time cron "0 45 22 1-15 SEP ?" or // vom 1. bis 15. September
Time cron "0 45 21 16-30 SEP ?" or // vom 16. bis 30. September
Time cron "0 45 21 * JAN-MAR,OCT-DEC ?" or // vom 1. Oktober bis 31. März
Time cron "0 45 21 1-23 APR ?" // vom 1. bis 23. April

dann würde nur noch der hier:

if((now.getDayOfYear > now.withDate(now.getYear,11,26).getDayOfYear || now.getDayOfYear < 8)) {


und der hier bleiben:

nDuration = ((now.millis - RegenOffTime)/1000).intValue

Re: JodaTime to JavaTime

Verfasst: 5. Mär 2021 13:24
von peter-pan
SaschaQ hat geschrieben: 4. Mär 2021 21:20 dann würde nur noch der hier:
if((now.getDayOfYear > now.withDate(now.getYear,11,26).getDayOfYear || now.getDayOfYear < 8)) {
Hier mal was zum "Spielen": :)

Code: Alles auswählen

var vDayOfYear = LocalDate.now.getDayOfYear()
var vDayOfYear1 = LocalDate.of(now.getYear(), 11, 26).getDayOfYear()
logInfo("test","Tag des Jahres ist: {} der 26.11 ist der {} Tag", vDayOfYear,vDayOfYear1)
Das kannst du ja leicht in deine Rule einbauen, oder ? ;)