JodaTime to JavaTime

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

JodaTime to JavaTime

Beitrag 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

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: JodaTime to JavaTime

Beitrag 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...
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: JodaTime to JavaTime

Beitrag 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.

Benutzeravatar
sihui
Beiträge: 1827
Registriert: 11. Apr 2018 19:03
Answers: 21

Re: JodaTime to JavaTime

Beitrag 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
openHAB3 mit Zwave, Alexa, ESPEasy, MQTT, Logitech Harmony, Philips HUE und ZigBee Hardware auf Proxmox VE.

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: JodaTime to JavaTime

Beitrag 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 ;)
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: JodaTime to JavaTime

Beitrag von SaschaQ »

Kann man denn noch direkt Vergleiche machen wie hier?

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

Benutzeravatar
sihui
Beiträge: 1827
Registriert: 11. Apr 2018 19:03
Answers: 21

Re: JodaTime to JavaTime

Beitrag 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
openHAB3 mit Zwave, Alexa, ESPEasy, MQTT, Logitech Harmony, Philips HUE und ZigBee Hardware auf Proxmox VE.

Benutzeravatar
sihui
Beiträge: 1827
Registriert: 11. Apr 2018 19:03
Answers: 21

Re: JodaTime to JavaTime

Beitrag 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: )
openHAB3 mit Zwave, Alexa, ESPEasy, MQTT, Logitech Harmony, Philips HUE und ZigBee Hardware auf Proxmox VE.

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: JodaTime to JavaTime

Beitrag 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

Benutzeravatar
peter-pan
Beiträge: 2773
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: JodaTime to JavaTime

Beitrag 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 ? ;)
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Antworten