OH 2.5.11 to OH 3.0 Migration problems java time

Hi community,

I will switch over from OH 2.5.11 to 3.0.0 but because many important systems in my house are fully automated via OH I fear if something wents wrong I have no time to fixe it cause my wife will kill me. :wink:
Iā€™ve read the documentations and I think most of my rules will work without problems.
But I have four rules (three are quite similar) that ned to be changed because of joda/java time and I canā€™t find a solution in this forum yet. So I need your help.

Thanks a lot!

Here is code 1:

var Timer verdunklungs_wz_timer_zwei = null
var Timer verdunklungstimer_wz_ende = null
var Timer verdunklungstimer_wz_start = null

rule "Ende der Verdunklung im WZ unter der Woche - prĆ¼fen"
when 
    Time cron "0 0/1 * * * ?"  
then
    var verdunklungsendeATStunde_WZ =  (VerdunklungsEndeATZeitStunde_WZ.state as DecimalType).intValue
    var verdunklungsendeATMinute_WZ =  (VerdunklungsEndeATZeitMinute_WZ.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == verdunklungsendeATStunde_WZ) && (now.getMinuteOfHour.intValue >= verdunklungsendeATMinute_WZ)) || (now.getHourOfDay.intValue > verdunklungsendeATStunde_WZ))
        && (now.getDayOfWeek == 1 || now.getDayOfWeek == 2 || now.getDayOfWeek == 3 || now.getDayOfWeek == 4 || now.getDayOfWeek == 5) && (Komplett_Verdunkelung_WZ.state==ON) 
        && (now.getHourOfDay() >= 1  && now.getHourOfDay() <= 11) && (Zeitsteuerung_Ende_WZ.state==ON)) {
        Komplett_Verdunkelung_WZ.sendCommand(OFF)
    }
end

rule "Ende der Verdunklung im WZ unter der Woche - Aenderung der Konfiguration"
when
    Item VerdunklungsEndeATZeitStunde_WZ received update or
    Item VerdunklungsEndeATZeitMinute_WZ received update 
then
    var verdunklungsendeATStunde_WZ =  VerdunklungsEndeATZeitStunde_WZ.state as DecimalType
    var verdunklungsendeATMinute_WZ =  VerdunklungsEndeATZeitMinute_WZ.state as DecimalType
    
    var String verdunklungsendeatText_WZ = ''
    if (verdunklungsendeATStunde_WZ.intValue < 10) verdunklungsendeatText_WZ = '0'
    verdunklungsendeatText_WZ = verdunklungsendeatText_WZ + verdunklungsendeATStunde_WZ.intValue + ':'
    if (verdunklungsendeATMinute_WZ.intValue < 10) verdunklungsendeatText_WZ = verdunklungsendeatText_WZ + '0'
    verdunklungsendeatText_WZ = verdunklungsendeatText_WZ + verdunklungsendeATMinute_WZ.intValue
    
    postUpdate(verdunklungsendeATZeitMessage_WZ, verdunklungsendeatText_WZ)
end

rule "Ende der Verdunklung im WZ am Wochenende - prĆ¼fen"
when 
    Time cron "0 0/1 * * * ?"  
then
    var verdunklungsendeWEStunde_WZ =  (VerdunklungsEndeWEZeitStunde_WZ.state as DecimalType).intValue
    var verdunklungsendeWEMinute_WZ =  (VerdunklungsEndeWEZeitMinute_WZ.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == verdunklungsendeWEStunde_WZ) && (now.getMinuteOfHour.intValue >= verdunklungsendeWEMinute_WZ)) || (now.getHourOfDay.intValue > verdunklungsendeWEStunde_WZ))
        && (now.getDayOfWeek == 6 || now.getDayOfWeek == 7) && (Komplett_Verdunkelung_WZ.state==ON) 
        && (now.getHourOfDay() >= 1  && now.getHourOfDay() <= 11) && (Zeitsteuerung_Ende_WZ.state==ON)) {
        Komplett_Verdunkelung_WZ.sendCommand(OFF)
    }
end

rule "Ende der Verdunklung im WZ am Wochenende - Aenderung der Konfiguration"
when
    Item VerdunklungsEndeWEZeitStunde_WZ received update or
    Item VerdunklungsEndeWEZeitMinute_WZ received update 
then
    var verdunklungsendeWEStunde_WZ =  VerdunklungsEndeWEZeitStunde_WZ.state as DecimalType
    var verdunklungsendeWEMinute_WZ =  VerdunklungsEndeWEZeitMinute_WZ.state as DecimalType
    
    var String verdunklungsendeweText_WZ = ''
    if (verdunklungsendeWEStunde_WZ.intValue < 10) verdunklungsendeweText_WZ = '0'
    verdunklungsendeweText_WZ = verdunklungsendeweText_WZ + verdunklungsendeWEStunde_WZ.intValue + ':'
    if (verdunklungsendeWEMinute_WZ.intValue < 10) verdunklungsendeweText_WZ = verdunklungsendeweText_WZ + '0'
    verdunklungsendeweText_WZ = verdunklungsendeweText_WZ + verdunklungsendeWEMinute_WZ.intValue
    
    postUpdate(verdunklungsendeWEZeitMessage_WZ, verdunklungsendeweText_WZ)
end

rule "Start der Verdunklung im WZ unter der Woche - prĆ¼fen"
when 
    Time cron "0 0/1 * * * ?"  
then
    var verdunklungsStartATStunde_WZ =  (VerdunklungsStartATZeitStunde_WZ.state as DecimalType).intValue
    var verdunklungsStartATMinute_WZ =  (VerdunklungsStartATZeitMinute_WZ.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == verdunklungsStartATStunde_WZ) && (now.getMinuteOfHour.intValue >= verdunklungsStartATMinute_WZ)) || (now.getHourOfDay.intValue > verdunklungsStartATStunde_WZ))
        && (now.getDayOfWeek == 1 || now.getDayOfWeek == 2 || now.getDayOfWeek == 3 || now.getDayOfWeek == 4 || now.getDayOfWeek == 5) && (Komplett_Verdunkelung_WZ.state==OFF) 
        && (now.getHourOfDay() >= 13  && now.getHourOfDay() <= 23) && (Zeitsteuerung_Start_WZ.state==ON)) {
        Komplett_Verdunkelung_WZ.sendCommand(ON)
    }
end

rule "Start der Verdunklung im WZ unter der Woche - Aenderung der Konfiguration"
when
    Item VerdunklungsStartATZeitStunde_WZ received update or
    Item VerdunklungsStartATZeitMinute_WZ received update 
then
    var verdunklungsStartATStunde_WZ =  VerdunklungsStartATZeitStunde_WZ.state as DecimalType
    var verdunklungsStartATMinute_WZ =  VerdunklungsStartATZeitMinute_WZ.state as DecimalType
    
    var String verdunklungsStartatText_WZ = ''
    if (verdunklungsStartATStunde_WZ.intValue < 10) verdunklungsStartatText_WZ = '0'
    verdunklungsStartatText_WZ = verdunklungsStartatText_WZ + verdunklungsStartATStunde_WZ.intValue + ':'
    if (verdunklungsStartATMinute_WZ.intValue < 10) verdunklungsStartatText_WZ = verdunklungsStartatText_WZ + '0'
    verdunklungsStartatText_WZ = verdunklungsStartatText_WZ + verdunklungsStartATMinute_WZ.intValue
    
    postUpdate(verdunklungsstartATZeitMessage_WZ, verdunklungsStartatText_WZ)
end

rule "Start der Verdunklung im WZ am Wochenende - prĆ¼fen"
when 
    Time cron "0 0/1 * * * ?"  
then
    var verdunklungsStartWEStunde_WZ =  (VerdunklungsStartWEZeitStunde_WZ.state as DecimalType).intValue
    var verdunklungsStartWEMinute_WZ =  (VerdunklungsStartWEZeitMinute_WZ.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == verdunklungsStartWEStunde_WZ) && (now.getMinuteOfHour.intValue >= verdunklungsStartWEMinute_WZ)) || (now.getHourOfDay.intValue > verdunklungsStartWEStunde_WZ))
        && (now.getDayOfWeek == 6 || now.getDayOfWeek == 7) && (Komplett_Verdunkelung_WZ.state==OFF) && (now.getHourOfDay() >= 13  && now.getHourOfDay() <= 23) && (Zeitsteuerung_Start_WZ.state==ON)) {
        Komplett_Verdunkelung_WZ.sendCommand(ON)
    }
end

rule "Start der Verdunklung im WZ am Wochenende - Aenderung der Konfiguration"
when
    Item VerdunklungsStartWEZeitStunde_WZ received update or
    Item VerdunklungsStartWEZeitMinute_WZ received update 
then
    var verdunklungsStartWEStunde_WZ =  VerdunklungsStartWEZeitStunde_WZ.state as DecimalType
    var verdunklungsStartWEMinute_WZ =  VerdunklungsStartWEZeitMinute_WZ.state as DecimalType
    
    var String verdunklungsStartweText_WZ = ''
    if (verdunklungsStartWEStunde_WZ.intValue < 10) verdunklungsStartweText_WZ = '0'
    verdunklungsStartweText_WZ = verdunklungsStartweText_WZ + verdunklungsStartWEStunde_WZ.intValue + ':'
    if (verdunklungsStartWEMinute_WZ.intValue < 10) verdunklungsStartweText_WZ = verdunklungsStartweText_WZ + '0'
    verdunklungsStartweText_WZ = verdunklungsStartweText_WZ + verdunklungsStartWEMinute_WZ.intValue
    
    postUpdate(verdunklungsstartWEZeitMessage_WZ, verdunklungsStartweText_WZ)
end



rule "Start der Verdunklung im WZ am Wochenende - Zeit wird im laufenden Betrieb umgestellt"
when 
    Item VerdunklungsStartWEZeitStunde_WZ received update or
    Item VerdunklungsStartWEZeitMinute_WZ received update   
then
    var verdunklungsStartWEStunde_WZ =  (VerdunklungsStartWEZeitStunde_WZ.state as DecimalType).intValue
    var verdunklungsStartWEMinute_WZ =  (VerdunklungsStartWEZeitMinute_WZ.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == verdunklungsStartWEStunde_WZ) && (now.getMinuteOfHour.intValue < verdunklungsStartWEMinute_WZ)) || (now.getHourOfDay.intValue < verdunklungsStartWEStunde_WZ))
        && (now.getDayOfWeek == 6 || now.getDayOfWeek == 7) && (Komplett_Verdunkelung_WZ.state==ON) && (now.getHourOfDay() >= 13  && now.getHourOfDay() <= 23) && (verdunklungs_wz_timer_zwei === null) && (Zeitsteuerung_Start_WZ.state==ON)) {
        logInfo ("RULE", "verdunklungs_wzsaenderungstimer startet")
        verdunklungs_wz_timer_zwei = createTimer(now.plusMinutes(1), [|
        verdunklungs_wz_timer_zwei = null
        Komplett_Verdunkelung_WZ.sendCommand(OFF)
        ])
    }
end

rule "Start der Verdunklung im WZ unter der Woche - Zeit wird im laufenden Betrieb umgestellt"
when 
    Item VerdunklungsStartATZeitStunde_WZ received update or
    Item VerdunklungsStartATZeitMinute_WZ received update   
then
    var verdunklungsStartATStunde_WZ =  (VerdunklungsStartATZeitStunde_WZ.state as DecimalType).intValue
    var verdunklungsStartATMinute_WZ =  (VerdunklungsStartATZeitMinute_WZ.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == verdunklungsStartATStunde_WZ) && (now.getMinuteOfHour.intValue < verdunklungsStartATMinute_WZ)) || (now.getHourOfDay.intValue < verdunklungsStartATStunde_WZ))
        && (now.getDayOfWeek == 1 || now.getDayOfWeek == 2 || now.getDayOfWeek == 3 || now.getDayOfWeek == 4 || now.getDayOfWeek == 5) && (Komplett_Verdunkelung_WZ.state==ON) 
        && (now.getHourOfDay() >= 13  && now.getHourOfDay() <= 23) && (verdunklungs_wz_timer_zwei === null) && (Zeitsteuerung_Start_WZ.state==ON)) {
        logInfo ("RULE", "verdunklungs_wzsaenderungstimer startet")
        verdunklungs_wz_timer_zwei = createTimer(now.plusMinutes(1), [|
        verdunklungs_wz_timer_zwei = null
        Komplett_Verdunkelung_WZ.sendCommand(OFF)
        ])
    }
end

rule "Ende der Verdunklung im WZ Ć¼ber Helligkeit"
when
  Time cron "0 0/1 * * * ?"
then
  if((Wetterstation_Helligkeit.state > Verdunkelungsende_WZ_Helligkeit.state) && (Komplett_Verdunkelung_WZ.state==ON) && (now.getHourOfDay() <= 12) && (Zeitsteuerung_Ende_WZ.state==OFF) && (verdunklungstimer_wz_ende === null)) {
      logInfo ("RULE", "Verdunklungsendtimer WZ startet")
      verdunklungstimer_wz_ende = createTimer(now.plusMinutes(5), [|
                verdunklungstimer_wz_ende = null
                Komplett_Verdunkelung_WZ.sendCommand(OFF)
            ])
  }
end

rule "Verdunklungstimer aus falls in einer Minuten die Helligkeit wieder steigt"
when
  Item Wetterstation_Helligkeit changed or
  Item Verdunkelungsende_WZ_Helligkeit changed
then	
    if ((verdunklungstimer_wz_ende !== null) && (Wetterstation_Helligkeit.state <= Verdunkelungsende_WZ_Helligkeit.state)) {
      logInfo ("RULE", "Verdunklungsendtimer WZ vorzeitig aus")
      verdunklungstimer_wz_ende.cancel
      verdunklungstimer_wz_ende = null
    }
end

rule "Start der Verdunklung im WZ Ć¼ber Helligkeit"
when
  Time cron "0 0/1 * * * ?"
then
  if((Wetterstation_Helligkeit.state <= Verdunkelungsstart_WZ_Helligkeit.state) && (Komplett_Verdunkelung_WZ.state==OFF) && (now.getHourOfDay() >= 15) && (Zeitsteuerung_Start_WZ.state==OFF) && (verdunklungstimer_wz_start === null)) {
      logInfo ("RULE", "Verdunklungsstarttimer WZ startet")
      verdunklungstimer_wz_start = createTimer(now.plusMinutes(5), [|
                verdunklungstimer_wz_start = null
                Komplett_Verdunkelung_WZ.sendCommand(ON)
            ])
  }
end

rule "Verdunklungstimer aus falls in einer Minuten die Helligkeit wieder sinkt"
when
  Item Wetterstation_Helligkeit changed or
  Item Verdunkelungsstart_WZ_Helligkeit changed
then	
    if ((verdunklungstimer_wz_start !== null) && (Wetterstation_Helligkeit.state > Verdunkelungsstart_WZ_Helligkeit.state)) {
      logInfo ("RULE", "Verdunklungsstarttimer WZ vorzeitig aus")
      verdunklungstimer_wz_start.cancel
      verdunklungstimer_wz_start = null
    }
end

Here is code 2:

rule "Umrechnung Regenmenge Number"
when
    Item Wetterstation_Regenmenge received update
then
    Insgesamt_Regenmenge.sendCommand(Wetterstation_Regenmenge.state as Number)
end

rule "Regenmenge letzte Stunde"
when
    Time cron "0 0/1 * 1/1 * ? *"
then
    if (Insgesamt_Regenmenge.deltaSince(now.minusHours(1)) != null && Insgesamt_Regenmenge.deltaSince(now.minusHours(1)) < 0.00) {
       postUpdate(Regenmenge_H, 0.00)
    }
    else if (Insgesamt_Regenmenge.deltaSince(now.minusHours(1)) != null && Insgesamt_Regenmenge.deltaSince(now.minusHours(1)) >= 0.00) {
       Regenmenge_H.postUpdate(Insgesamt_Regenmenge.deltaSince(now.minusHours(1)), 'rrd4j')
    }
end

rule "Regenmenge letzte 24 Stunden"
when
    Time cron "0 0/1 * 1/1 * ? *"
then
    if (Insgesamt_Regenmenge.deltaSince(now.minusDays(1)) != null && Insgesamt_Regenmenge.deltaSince(now.minusDays(1)) < 0.00) {
       postUpdate(Regenmenge_D, 0.00)
    }
    else if (Insgesamt_Regenmenge.deltaSince(now.minusDays(1)) != null && Insgesamt_Regenmenge.deltaSince(now.minusDays(1)) >= 0.00) {
       Regenmenge_D.postUpdate(Insgesamt_Regenmenge.deltaSince(now.minusDays(1)), 'rrd4j')
    }
end

rule "Regenmenge heute"
when
    Time cron "0 0/1 * 1/1 * ? *"
then
    if (Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay) != null && Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay) < 0.00) {
       postUpdate(Regenmenge_T, 0.00)
    }
    else if (Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay) != null && Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay) >= 0.00) {
       Regenmenge_T.postUpdate(Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay), 'rrd4j')
    }
end

rule "Regenmenge gestern"
when
    Time cron "0 0/1 * 1/1 * ? *"
then
    if (Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay.minusDays(1)) != null && Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay.minusDays(1)) < 0.00 && Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay) != null && Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay) < 0.00) {
       postUpdate(Regenmenge_Y, 0.00)
    }
    else if (Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay.minusDays(1)) != null && Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay.minusDays(1)) >= 0.00 && Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay) != null && Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay) >= 0.00) {
       Regenmenge_Y.postUpdate(Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay.minusDays(1), 'rrd4j') - Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay, "rrd4j"))
    }
    else if (Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay.minusDays(1)) == null || Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay) == null) {
       postUpdate(Regenmenge_Y, 0.00)
    }
    else if ((Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay.minusDays(1)) - Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay)) == null || (Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay.minusDays(1)) - Insgesamt_Regenmenge.deltaSince(now.withTimeAtStartOfDay)) < 0.00) {
       postUpdate(Regenmenge_Y, 0.00)
    }
end

rule "Regenmenge letzte 7 Tage"
when
    Time cron "0 0/1 * 1/1 * ? *"
then
    if (Insgesamt_Regenmenge.deltaSince(now.minusDays(7)) != null && Insgesamt_Regenmenge.deltaSince(now.minusDays(7)) < 0.00) {
       postUpdate(Regenmenge_W, 0.00)
    }
    else if (Insgesamt_Regenmenge.deltaSince(now.minusDays(7)) != null && Insgesamt_Regenmenge.deltaSince(now.minusDays(7)) >= 0.00) {
       Regenmenge_W.postUpdate(Insgesamt_Regenmenge.deltaSince(now.minusDays(7)), 'rrd4j')
    }
end

rule "Regenmenge gestern nicht null"
when
    Item Regenmenge_Y received update
then
    if (Regenmenge_Y.state < 0.00) {
       postUpdate(Regenmenge_Y, 0.00)
    }
end

Here is code 3:

var Timer heizung_timer_zwei = null

rule "Start der Heizung unter der Woche - prĆ¼fen"
when 
    Time cron "0 0/1 * * * ?"  
then
    var heizungsStartATStunde =  (HeizungsStartATZeitStunde.state as DecimalType).intValue
    var heizungsStartATMinute =  (HeizungsStartATZeitMinute.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == heizungsStartATStunde) && (now.getMinuteOfHour.intValue >= heizungsStartATMinute)) || (now.getHourOfDay.intValue > heizungsStartATStunde))
        && (now.getDayOfWeek == 1 || now.getDayOfWeek == 2 || now.getDayOfWeek == 3 || now.getDayOfWeek == 4 || now.getDayOfWeek == 5) && (Heizung_Tagesbetrieb.state==OFF) 
        && (now.getHourOfDay() >= 1  && now.getHourOfDay() <= 11)) {
        Heizung_Tagesbetrieb.sendCommand(ON)
    }
end

rule "Start der Heizung unter der Woche - Aenderung der Konfiguration"
when
    Item HeizungsStartATZeitStunde received update or
    Item HeizungsStartATZeitMinute received update 
then
    var heizungsStartATStunde =  HeizungsStartATZeitStunde.state as DecimalType
    var heizungsStartATMinute =  HeizungsStartATZeitMinute.state as DecimalType
    
    var String heizungsstartatText = ''
    if (heizungsStartATStunde.intValue < 10) heizungsstartatText = '0'
    heizungsstartatText = heizungsstartatText + heizungsStartATStunde.intValue + ':'
    if (heizungsStartATMinute.intValue < 10) heizungsstartatText = heizungsstartatText + '0'
    heizungsstartatText = heizungsstartatText + heizungsStartATMinute.intValue
    
    postUpdate(heizungsstartatZeitMessage, heizungsstartatText)
end

rule "Start der Heizung am Wochenende - prĆ¼fen"
when 
    Time cron "0 0/1 * * * ?"  
then
    var heizungsStartWEStunde =  (HeizungsStartWEZeitStunde.state as DecimalType).intValue
    var heizungsStartWEMinute =  (HeizungsStartWEZeitMinute.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == heizungsStartWEStunde) && (now.getMinuteOfHour.intValue >= heizungsStartWEMinute)) || (now.getHourOfDay.intValue > heizungsStartWEStunde))
        && (now.getDayOfWeek == 6 || now.getDayOfWeek == 7) && (Heizung_Tagesbetrieb.state==OFF) 
        && (now.getHourOfDay() >= 1  && now.getHourOfDay() <= 11)) {
        Heizung_Tagesbetrieb.sendCommand(ON)
    }
end

rule "Start der Heizung am Wochenende - Aenderung der Konfiguration"
when
    Item HeizungsStartWEZeitStunde received update or
    Item HeizungsStartWEZeitMinute received update 
then
    var heizungsStartWEStunde =  HeizungsStartWEZeitStunde.state as DecimalType
    var heizungsStartWEMinute =  HeizungsStartWEZeitMinute.state as DecimalType
    
    var String heizungsstartweText = ''
    if (heizungsStartWEStunde.intValue < 10) heizungsstartweText = '0'
    heizungsstartweText = heizungsstartweText + heizungsStartWEStunde.intValue + ':'
    if (heizungsStartWEMinute.intValue < 10) heizungsstartweText = heizungsstartweText + '0'
    heizungsstartweText = heizungsstartweText + heizungsStartWEMinute.intValue
    
    postUpdate(heizungsstartweZeitMessage, heizungsstartweText)
end

rule "Ende der Heizung unter der Woche - prĆ¼fen"
when 
    Time cron "0 0/1 * * * ?"  
then
    var heizungsEndeATStunde =  (HeizungsEndeATZeitStunde.state as DecimalType).intValue
    var heizungsEndeATMinute =  (HeizungsEndeATZeitMinute.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == heizungsEndeATStunde) && (now.getMinuteOfHour.intValue >= heizungsEndeATMinute)) || (now.getHourOfDay.intValue > heizungsEndeATStunde))
        && (now.getDayOfWeek == 1 || now.getDayOfWeek == 2 || now.getDayOfWeek == 3 || now.getDayOfWeek == 4 || now.getDayOfWeek == 5) && (Heizung_Tagesbetrieb.state==ON) 
        && (now.getHourOfDay() >= 13  && now.getHourOfDay() <= 23)) {
        Heizung_Tagesbetrieb.sendCommand(OFF)
    }
end

rule "Ende der Heizung unter der Woche - Aenderung der Konfiguration"
when
    Item HeizungsEndeATZeitStunde received update or
    Item HeizungsEndeATZeitMinute received update 
then
    var heizungsEndeATStunde =  HeizungsEndeATZeitStunde.state as DecimalType
    var heizungsEndeATMinute =  HeizungsEndeATZeitMinute.state as DecimalType
    
    var String heizungsEndeatText = ''
    if (heizungsEndeATStunde.intValue < 10) heizungsEndeatText = '0'
    heizungsEndeatText = heizungsEndeatText + heizungsEndeATStunde.intValue + ':'
    if (heizungsEndeATMinute.intValue < 10) heizungsEndeatText = heizungsEndeatText + '0'
    heizungsEndeatText = heizungsEndeatText + heizungsEndeATMinute.intValue
    
    postUpdate(heizungsEndeatZeitMessage, heizungsEndeatText)
end

rule "Ende der Heizung am Wochenende - prĆ¼fen"
when 
    Time cron "0 0/1 * * * ?"  
then
    var heizungsEndeWEStunde =  (HeizungsEndeWEZeitStunde.state as DecimalType).intValue
    var heizungsEndeWEMinute =  (HeizungsEndeWEZeitMinute.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == heizungsEndeWEStunde) && (now.getMinuteOfHour.intValue >= heizungsEndeWEMinute)) || (now.getHourOfDay.intValue > heizungsEndeWEStunde))
        && (now.getDayOfWeek == 6 || now.getDayOfWeek == 7) && (Heizung_Tagesbetrieb.state==ON) && (now.getHourOfDay() >= 13  && now.getHourOfDay() <= 23)) {
        Heizung_Tagesbetrieb.sendCommand(OFF)
    }
end

rule "Ende der Heizung am Wochenende - Aenderung der Konfiguration"
when
    Item HeizungsEndeWEZeitStunde received update or
    Item HeizungsEndeWEZeitMinute received update 
then
    var heizungsEndeWEStunde =  HeizungsEndeWEZeitStunde.state as DecimalType
    var heizungsEndeWEMinute =  HeizungsEndeWEZeitMinute.state as DecimalType
    
    var String heizungsEndeweText = ''
    if (heizungsEndeWEStunde.intValue < 10) heizungsEndeweText = '0'
    heizungsEndeweText = heizungsEndeweText + heizungsEndeWEStunde.intValue + ':'
    if (heizungsEndeWEMinute.intValue < 10) heizungsEndeweText = heizungsEndeweText + '0'
    heizungsEndeweText = heizungsEndeweText + heizungsEndeWEMinute.intValue
    
    postUpdate(heizungsEndeweZeitMessage, heizungsEndeweText)
end



rule "Ende der Heizung am Wochenende - Zeit wird im laufenden Betrieb umgestellt"
when 
    Item HeizungsEndeWEZeitStunde received update or
    Item HeizungsEndeWEZeitMinute received update   
then
    var heizungsEndeWEStunde =  (HeizungsEndeWEZeitStunde.state as DecimalType).intValue
    var heizungsEndeWEMinute =  (HeizungsEndeWEZeitMinute.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == heizungsEndeWEStunde) && (now.getMinuteOfHour.intValue < heizungsEndeWEMinute)) || (now.getHourOfDay.intValue < heizungsEndeWEStunde))
        && (now.getDayOfWeek == 6 || now.getDayOfWeek == 7) && (Heizung_Tagesbetrieb.state==OFF) && (now.getHourOfDay() >= 13  && now.getHourOfDay() <= 23) && (heizung_timer_zwei === null)) {
        logInfo ("RULE", "Heizungsaenderungstimer startet")
        heizung_timer_zwei = createTimer(now.plusMinutes(1), [|
        heizung_timer_zwei = null
        Heizung_Tagesbetrieb.sendCommand(ON)
        ])
    }
end

rule "Ende der Heizung unter der Woche - Zeit wird im laufenden Betrieb umgestellt"
when 
    Item HeizungsEndeATZeitStunde received update or
    Item HeizungsEndeATZeitMinute received update   
then
    var heizungsEndeATStunde =  (HeizungsEndeATZeitStunde.state as DecimalType).intValue
    var heizungsEndeATMinute =  (HeizungsEndeATZeitMinute.state as DecimalType).intValue
    if ((((now.getHourOfDay.intValue == heizungsEndeATStunde) && (now.getMinuteOfHour.intValue < heizungsEndeATMinute)) || (now.getHourOfDay.intValue < heizungsEndeATStunde))
        && (now.getDayOfWeek == 1 || now.getDayOfWeek == 2 || now.getDayOfWeek == 3 || now.getDayOfWeek == 4 || now.getDayOfWeek == 5) && (Heizung_Tagesbetrieb.state==OFF) 
        && (now.getHourOfDay() >= 13  && now.getHourOfDay() <= 23) && (heizung_timer_zwei === null)) {
        logInfo ("RULE", "Heizungsaenderungstimer startet")
        heizung_timer_zwei = createTimer(now.plusMinutes(1), [|
        heizung_timer_zwei = null
        Heizung_Tagesbetrieb.sendCommand(ON)
        ])
    }
end

And sorry for those changes made in my topic post, I forgot how to post a code.

What I already found out was ā€˜getMinuteOfHourā€™ has to be changed into ā€˜getMinuteā€™, similar with hour.

But what about day.

Or with this code:

(((now.getHour.intValue == verdunklungsendeATStunde_SZ) && (now.getMinute.intValue >= verdunklungsendeATMinute_SZ)) 

Do you need more information to give me advise?

The OH3 release notes says, that rules now use Java Time API instead of Jodatime. Therefore some expressions have to be adapted.

To get a better feeling about the handling of the new time handling for rules, it could be a good idea to take a closer look at the java docs, e.g.

Example:

The method getDayOfWeek now returns not an oject resp. enum of type DayOfWeek. But this enum has also a method called getValue() to get the former integer value. The example mentioned beforehand

now.getDayOfWeek == 1 ...

could now be coded like

now.getDayOfWeek.getValue() == 1

I know, the java docs are not great stuff as bedtime reading. But they give good ā€œbaseā€ hints. Afterwards a little bit ā€œtry and errorā€ with the new rule editor and after half an hour you will be the new ā€œrule date and time expertā€ :wink:

3 Likes

Wow thanks!! Now I got a lot documentation to reed to prepare the change as good as possible!
And maybe I ll install it on my old raspberry first an see if it works!

From my point of view, the tree structure and the methods of classes like LocalDate are very useful.

Just an amendment to my last post: In your case, it might be suitable to use the enum instead of the integer values. By using the enum, the code is more ā€œhuman readableā€. Example:

The line

now.getDayOfWeek().getValue() == 1

requires that the reader knows, that 1 is monday. In such cases, you could comment the line, define own constants or use the enum to compare:

now.getDayOfWeek() == DayOfWeek.MONDAY

That makes the code more readable and maintainable (e.g. if you look half a year later in your rules).

3 Likes

Well another good idea thanks!

just a little offtopicā€¦ but I always thought ā€œverdunklungā€ wasnā€™t necessary in germany since end of WW:2 but maybe Iā€™m mistaking :rofl:

1 Like

Sorry what ended? I donā€™t get much news in my bunker :wink:

ā€¦another OFFTOPIC:
You seem tobe able to use timers, why do you use rules (plural!) which trigger every minute to check if a specific hour and minute has been reached? A single timer instead of a rule would be enough!

Because I sometimes have to change the time when the blinds open.
And I like to do this in the app.