OH3 - Coming from 2.5 Automatic Shutter dont work anymore

Hi,
coming from 2.5 to 3.0 some of the rules dont work because of the errors in the log:

2021-03-30 12:26:34.951 [WARN ] [b.core.model.script.actions.BusEvent] - Cannot convert ‘2021-03-29T12:26:34.950237+02:00[Europe/Berlin]’ to a state type which item ‘AutoShading_Start_last’ accepts: [DateTimeType, UnDefType].

2021-03-30 19:26:34.941 [WARN ] [b.core.model.script.actions.BusEvent] - Cannot convert ‘2021-03-29T19:26:34.940849+02:00[Europe/Berlin]’ to a state type which item ‘AutoShading_End_last’ accepts: [DateTimeType, UnDefType].
2021-03-30 19:26:34.942 [WARN ] [b.core.model.script.actions.BusEvent] - Cannot convert ‘2021-03-29T19:26:34.941689+02:00[Europe/Berlin]’ to a state type which item ‘AutoShadingM_End_last’ accepts: [DateTimeType, UnDefType].

ITEMS:

DateTime    AutoShading_Start_last              "Letzte Ausführung (Rollladen ab) [%1$td.%1$tm %1$tH:%1$tM Uhr]"        <time>          (gShading)

DateTime    AutoShading_End_last                "Letzte Ausführung (Rollladen hoch) [%1$td.%1$tm %1$tH:%1$tM Uhr]"      <time>          (gShading)

DateTime    AutoShadingM_Start_last             "Letzte Ausführung (Rollladen ab) [%1$td.%1$tm %1$tH:%1$tM Uhr]"        <time>          (gShading)

DateTime    AutoShadingM_End_last               "Letzte Ausführung (Rollladen hoch) [%1$td.%1$tm %1$tH:%1$tM Uhr]"      <time>          (gShading)

RULE:

import java.util.Map

var Boolean message = true

//val LocalDateTime MyJavaLocalDateTime = new LocalDateTime() // create a LocalDateTime value to work with`

//val DateTimeType MyDateTimeTypeFromJavaLocalDateTime = new DateTimeType(MyJavaLocalDateTime ) // conversion

val DateTimeType MyDateTimeTypeTimestamp = DateTimeType.valueOf(now.toLocalDateTime().toString())

val String filename = "shutter.rules"

// Values und Variablen für die Verschattung

//val Number blindClosed = 100

//val Number blindOpen = 0

//val Number blindTranslucent = 35

//AutoShading: ist für die automatische Verschattung(runter und rauf) zuständig.

//ManualShading: damit kann ich wenn ich "anwesend" bin, die Rollläden auf die Positionen der Verschattung(targetHights) fahren. Da die automatische Verschattung wenn ich "anwesend" bin deaktiviert ist.

//ShutterControll: übernimmt die allgemeine Rollladebsteuerung, also z.B. Wochentags oder am Wochenende oder im Urlaub.

//Shading_Var: wird in der rule "Verschattung Variablen update" verwendet um zu schauen, ob die Boolean´s TRUE oder FALSE sind z.B. isActiveWest und gibt das dann im Log aus. Man das von "aussen (RESTAPI)" sonst nicht sehen ob sie TRUE oder FALSE sind. Der Reset setzt diese einfach wieder auf FALSE.

var Number closingAzimuth_east = 65

var Number closingAzimuth_south = 101

var Number closingAzimuth_west = 171

var Number closingAzimuth_north = 290

var Number closingCloudiness = 20   

val Number cloudHysteresis = 45         //die Mindestbewölkung in der letzten Stunde

var Number openingTemperature = 22

var Number closingTemperature = 24

val Number temperatureHysteresis = 4    //Temperaturabfall von min. 4 Grad in der letzten Stunde

val Number minPrecip = 5                //die Mindestmenge an Regen in der letzten Stunde

var Boolean isActiveWest = false

var Boolean isActiveEast = false

var Boolean isActiveSouth = false

var Boolean isActiveBalkon = false

val String logPrefix = "Rollläden - "

/* -------------  Verschattung FUNKTIONEN --------------------

*/

//-------------  Verschattung starten --------------------

val shadingStart = [GroupItem shutter |

        val String logPrefix = "Verschattung aktivieren - "

                val Map<String, Number> targetHights = newHashMap ( 

                    "EG_Arbeitszimmer_Ost" -> 75,

                    "EG_Arbeitszimmer_Sued" -> 75,

                    "EG_Jalousie_Essen_Tuere_West" -> 100,

                    "EG_Jalousie_Schiebetuere_rechts_Sued" -> 100,

                    "EG_Jalousie_Schiebetuere_Sued" -> 100,

                    "EG_Fenster_West" -> 75,

                    "EG_Tuere_Kueche" -> 60,

                    "OG_Ankleide" -> 75,

                    "OG_Elternschlafen_West" -> 75,

                    "OG_Elternschlafen_Sued" -> 75,

                    "OG_Kinderbad" -> 75,

                    "OG_Amelie_Sued" -> 75,

                    "OG_Amelie_Ost" -> 75,

                    "OG_Emil_Ost" -> 75,

                    "KG_Hobbyraum_Abstellraum" -> 75

                )

                // Rollladen werden geschlossen

                logInfo("rules", logPrefix + "Grenzwert wurden erreicht, Rollladen werden geschlossen")

                shutter.allMembers.forEach[ blind |

                    if ((blind.state as Number) < targetHights.get(blind.name.toString()).intValue) {

                        logInfo("rules", logPrefix + "Fahre Rollladen (" + blind.name.toString() + ") auf (" + targetHights.get(blind.name.toString()).intValue + ") %" )

                        blind.sendCommand(targetHights.get(blind.name.toString()).intValue)

                        //Pushnachricht versenden

                        //sendPushoverMessage(pushoverBuilder("Verschattung für " + blind.name.toString + " aktiviert, schließen auf " + targetHights.get(blind.name.toString()).toString() + " %"))

                    } else {

                        logInfo("rules", logPrefix + "Rollladen ist bereits weiter geschlossen (" + blind.state.toString() + "%) als er geschlossen werden sollte und wird daher ignoriert")

                    }

                ]

                AutoShading_Start_last.postUpdate(MyDateTimeTypeTimestamp)

    return true;

]

//-------------  Verschattung beenden -------------------

val shadingEnd = [GroupItem shutter |

        val String logPrefix = "Verschattung deaktivieren - "

                    val Map<String, Number> targetHights = newHashMap ( 

                        "EG_Arbeitszimmer_Ost" -> 75,

                        "EG_Arbeitszimmer_Sued" -> 75,

                        "EG_Jalousie_Essen_Tuere_West" -> 100,

                        "EG_Jalousie_Schiebetuere_rechts_Sued" -> 100,

                        "EG_Jalousie_Schiebetuere_Sued" -> 100,

                        "EG_Fenster_West" -> 75,

                        "EG_Tuere_Kueche" -> 60,

                        "OG_Ankleide" -> 75,

                        "OG_Elternschlafen_West" -> 75,

                        "OG_Elternschlafen_Sued" -> 75,

                        "OG_Kinderbad" -> 75,

                        "OG_Amelie_Sued" -> 75,

                        "OG_Amelie_Ost" -> 75,

                        "OG_Emil_Ost" -> 75,

                        "KG_Hobbyraum_Abstellraum" -> 75

                     )

                    // Rollladen öffnen

                    logInfo("rules", logPrefix + "Rollladen werden geoeffnet")

                    shutter.allMembers.forEach[ blind |

                       if ((blind.state as Number) == targetHights.get(blind.name.toString()).intValue) {

                            logInfo("rules", logPrefix + "Oeffne Rollladen: " + blind.name.toString())

                            blind.sendCommand(UP)

                            //Pushnachricht versenden                        

                            //sendPushoverMessage(pushoverBuilder("Verschattung für (" + blind.name.toString() + ") beendet, Rollladen wird geöffnet."))

                        } else {

                            logInfo("rules", logPrefix + "Rollladen: (" + blind.name.toString() + ") wird nicht geoeffnet, da dieser zwischenzeitlich manuell verändert wurde.")

                        }    

                    ]                         

                    // Letzte Ausführung mit entsprechendem Zeitstempel belegen

                    AutoShading_End_last.postUpdate(MyDateTimeTypeTimestamp)

                    

                    //Variablen zurücksetzen

                    isActiveWest = false

                    isActiveEast = false

                    isActiveSouth = false

    return true;

]

/* -------------  Verschattung RULES --------------------

*/

//-------------  Verschattung starten --------------------

rule "Verschattung starten"

when

    Item Azimuth changed

then

    val String logPrefix = "Verschattung aktivieren - "

    

    //Prüfung auf: Verschattungsautomatik an / ob es Tag ist / Jahreszeit

    if (AutoShading.state != ON) {                                                                  

        logInfo("rules", logPrefix + "Verschattung wird nicht ausgeführt, da deaktiviert.")

        return;

    }

    if (Tag_Nacht.state != OFF) {                                                                       

        logInfo("rules", logPrefix + "Verschattung wird nicht ausgeführt, es ist Nacht.")

        return;

    }

    if (Jahreszeit.state !="SPRING" && Jahreszeit.state!= "SUMMER") {                               

        logInfo("rules", logPrefix + "Verschattung wird nicht ausgeführt, da weder, Frühling noch Sommer.")

        return;

    }

    if (AutoShading_Start_last.state == NULL) {

        logInfo("rules", logPrefix + "Letzte Ausführung unbekannt, Belegung mit Initialwert (-1 Tag)")

        AutoShading_Start_last.postUpdate(now.minusDays(1).toString())

    }

    /*

    if (Wind_Event == true) {

        logInfo("rules", logPrefix + "Verschattung wird nicht ausgeführt, da Wind_Event ausgelöst wurde")

        return; }

    */

    /*

    //Markisenautomatik

        if (!isActiveBalkon) {

        //Azimuth ist größer als 181° (WEST)

            if ((Azimuth.state as Number) > (closingAzimuth_west)) {

                if ((BalkonTemperatursensor_Temperature.state as Number).floatValue > (AutoShading_Temp_min.state as Number) && (Home_Current_Cloudiness.state as Number).floatValue < (AutoShading_Cloudiness_max.state as Number)) { 

                    logInfo("rules", logPrefix + "Markise Balkon")

                    gBalkonRollladen.sendCommand(UP)

                    AutoShadingM_Start_last.postUpdate(now.toString())

                    isActiveBalkon = true;      

                }

            }    

        } else {

            logInfo("rules", logPrefix + "Verschattung für Balkon bereits aktiviert")

        }

    */

    //Rollladenautomatik

    

    if (gPR.state != OFF && gPR.state != NULL)  {                                                                           

        logInfo("rules", logPrefix + "Verschattung (Rollläden) wird nicht ausgeführt, Anwesenheit erkannt.")

        return;

    }

    

    // Items für Sitemap füllen

    if(AutoShading_Azimuth_east.state == NULL)    AutoShading_Azimuth_east.postUpdate(closingAzimuth_east)

    if(AutoShading_Azimuth_south.state == NULL)   AutoShading_Azimuth_south.postUpdate(closingAzimuth_south)

    if(AutoShading_Azimuth_west.state == NULL)    AutoShading_Azimuth_west.postUpdate(closingAzimuth_west)

    if(AutoShading_Temp_diff.state == NULL)       AutoShading_Temp_diff.postUpdate(temperatureHysteresis)

    if(AutoShading_Cloudiness_Hyst.state == NULL) AutoShading_Cloudiness_Hyst.postUpdate(cloudHysteresis)

    if(AutoShading_Rain_min.state == NULL)        AutoShading_Rain_min.postUpdate(minPrecip)

    

    if ((gTempOut.state as Number).floatValue <= (AutoShading_Temp_min.state as Number)) {

            logInfo("rules", logPrefix + "Verschattung (Rollläden) wird nicht ausgeführt, Mindesttemperatur von ({}) wurde nicht erreicht. Aktuelle Temperatur ({}) ", AutoShading_Temp_min.state, gTempOut.state)

            return;

    }

    

    if ((gHelligkeit.state as Number).floatValue <= (19000)) { 

            logInfo("rules", logPrefix + "Verschattung (Rollläden) wird nicht ausgeführt, Aktuelle Bewoelkung ({}) ueberschreitet den eingestellten Grenzwert von 19000 lux", Home_Current_Cloudiness.state)

            return;

    }

    /*

    if ((Home_Current_Cloudiness.state as Number).floatValue > (AutoShading_Cloudiness_max.state as Number)) { 

            logInfo("rules", logPrefix + "Verschattung (Rollläden) wird nicht ausgeführt, Aktuelle Bewoelkung ({}) ueberschreitet den eingestellten Grenzwert von ({})", Home_Current_Cloudiness.state, AutoShading_Cloudiness_max.state)

            return;

    }

    */

    if ((AutoShading_Elevation_end.state as Number) <= (Elevation.state as Number)) {

            logInfo("rules", logPrefix + "Verschattung (Rollläden) wird nicht ausgeführt, Elevation für das Beenden der Verschattung ({}) ist groesser als aktuelle ({}) ", AutoShading_Elevation_end.state, Elevation.state)

            return;

    }

    //Azimuth ist größer als 181° (WEST)

    if (!isActiveWest) { 

        if ((Azimuth.state as Number).floatValue > (closingAzimuth_west)) {

            logInfo("rules", logPrefix + "Verschattung für Rollläden WEST")

            isActiveWest = shadingStart.apply(gRollladenWest)

            return;

        }      

    } else {

            logInfo("rules", logPrefix + "Verschattung für Rollläden WEST bereits aktiviert")

        } 

    //Azimuth ist größer als 111° (SÜD)

if (!isActiveSouth) { 

        if ((Azimuth.state as Number).floatValue > (closingAzimuth_south) && (Azimuth.state as Number).floatValue < (closingAzimuth_west)) {

            logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD")

            isActiveSouth = shadingStart.apply(gRollladenSouth)

            return;

        }

} else {

            logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD bereits aktiviert")

        }

    //Azimuth ist größer als 65° (OST)

    if (!isActiveEast) { 

        if ((Azimuth.state as Number).floatValue > (closingAzimuth_east) && (Azimuth.state as Number).floatValue < (closingAzimuth_south)) {

            logInfo("rules", logPrefix + "Verschattung für Rollläden OST")

            isActiveEast = shadingStart.apply(gRollladenEast)

        return;

        }

    } else {

            logInfo("rules", logPrefix + "Verschattung für Rollläden OST bereits aktiviert")

        }

end

//-------------  Verschattung beenden --------------------

rule "Verschattung beenden"

when 

    Item Elevation changed

then   

    

    val String logPrefix = "Verschattung deaktivieren - "

    //Prüfung auf: Verschattungsautomatik an / ob es Tag ist / Jahreszeit

    if (AutoShading_End.state != ON) {                                                                  

        logInfo("rules", logPrefix + "Verschattung wird nicht ausgeführt, da deaktiviert.")

        return;

    }

    if (Tag_Nacht.state != OFF) {                                                                        

        logInfo("rules", logPrefix + "Verschattung wird nicht ausgeführt, es ist Nacht.")

        return;

    }

    if (Jahreszeit.state !="SPRING" && Jahreszeit.state!= "SUMMER") {                               

        logInfo("rules", logPrefix + "Verschattung wird nicht ausgeführt, da weder, Frühling noch Sommer.")

        return;

    }

            

    val Boolean isRainLastHour = (Home_Current_RainVolume.maximumSince(now.minusHours(1), "influxdb").state >= (minPrecip))

    logInfo("rules", logPrefix + "Rain " + isRainLastHour)

    

    val Boolean isCloudLastHour = (Home_Current_Cloudiness.averageSince(now.minusHours(1), "influxdb")as Number >= (cloudHysteresis))

    logInfo("rules", logPrefix + "Clouds " + isCloudLastHour )

    

    val Boolean isTemperature = ((gTempOut.state as Number).intValue < (gTempOut.minimumSince(now.minusHours(1), "influxdb").state as DecimalType -(temperatureHysteresis)))

    logInfo("rules", logPrefix + "Temperatur " + isTemperature)

        

    if (AutoShading_End_last.state === NULL || AutoShadingM_End_last.state === NULL) {

        logInfo("rules", logPrefix + "Letzte Ausführung unbekannt, Belegung mit Initialwert (-1 Tag)")

            AutoShading_End_last.postUpdate(now.minusDays(1).toString())

            AutoShadingM_End_last.postUpdate(now.minusDays(1).toString())

        }

    var String timeNow = now.toLocalDateTime().toString()

    //now.toString().substring(0,10)

    var String timeLastEnde = AutoShading_End_last.state.toString().substring(0,10)

    

    var String timeLastEndeM = AutoShadingM_End_last.state.toString().substring(0,10)

    if (timeLastEnde == timeNow && timeLastEndeM == timeNow) {

        logInfo("rules", logPrefix + "Beende, da heute bereits ein automatisches Hochfahren stattfand")

        return;

    }

    if (!isActiveWest && !isActiveEast && !isActiveSouth && !isActiveBalkon) {

        logInfo("rules", logPrefix + "Beende, da heute noch keine automatische Verschattung stattfand")

        return;

    }

    if (isTemperature) {

        logInfo("rules", logPrefix + "Verschattung beenden, Temperaturabfall von min. ({})° erkannt", temperatureHysteresis)

        //gBalkonRollladen.sendCommand(DOWN)

        AutoShadingM_End_last.postUpdate(now.toString())

        shadingEnd.apply(gRollladen)

        return;

    }

    if ((gTempOut.state as Number).floatValue > (AutoShading_Temp_raise.state as Number)) {

        logInfo("rules", logPrefix + "Beende, aktuelle Temperatur ({})° ueberschreitet den eingestellten Grenzwert zum hochfahren von ({})°",gTempOut.state, AutoShading_Temp_raise.state )

        return;

    }

    if (isRainLastHour || isCloudLastHour) {

        logInfo("rules", logPrefix + "Verschattung beenden, Mindestregenmenge von ({}) mm oder druchschnittliche Bewölkung von ({}) % erreicht",minPrecip, cloudHysteresis)

        //gBalkonRollladen.sendCommand(DOWN)

        AutoShadingM_End_last.postUpdate(now.toString())

        shadingEnd.apply(gRollladen)

        return;

    }

    if ((Elevation.state as Number) > (AutoShading_Elevation_end.state as Number)) {

        logInfo("rules", logPrefix + "Beende, aktuelle Elevation ({}) ueberschreitet den eingestellten Grenzwert von ({}) ", Elevation.state, AutoShading_Elevation_end.state)

        return;

    }

    /*

        if (isActiveBalkon) {

        logInfo("rules", logPrefix + "Verschattung Balkon beenden")

        gBalkonRollladen.sendCommand(DOWN)

        AutoShadingM_End_last.postUpdate(now.toString())

    }

    */

    if (isActiveWest || isActiveEast || isActiveSouth ) {

        logInfo("rules", logPrefix + "Verschattung Rollläden beenden")

        shadingEnd.apply(gRollladen)

        return;

    }        

end

/* -------------  Verschattung Variablen zurücksetzen wenn kein automtisches hochfahren erfolgt --------------------

*/

rule "Verschattung Variablen zurücksetzen"

when

        Time cron "0 0 23 * * ?" or 

        Channel 'astro:sun:home:nauticDusk#event' triggered END 

then

        logInfo("rules", logPrefix + "Verschattung Variablen zurücksetzen")

        isActiveWest = false

        isActiveEast = false

        isActiveSouth = false

        isActiveBalkon = false

end

rule "Verschattung Variablen update"

when

        Item Shading_Var received command

then

        logInfo("rules", "Verschattung Variablen: " + receivedCommand)

        switch (receivedCommand) {

            case "queryState" : {

                        logInfo("rules", logPrefix + "Verschattung Variablen update")

                        if (isActiveWest) {

                            logInfo("rules", logPrefix + "Verschattung für Rollläden WEST aktiv")

                        } else { 

                            logInfo("rules", logPrefix + "Verschattung für Rollläden WEST inaktiv")

                        }

                        if (isActiveEast) {

                            logInfo("rules", logPrefix + "Verschattung für Rollläden OST aktiv")

                        } else { 

                            logInfo("rules", logPrefix + "Verschattung für Rollläden OST inaktiv")

                        }

                        if (isActiveSouth) {

                            logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD aktiv")

                        } else { 

                            logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD inaktiv")

                        }

                        /*if (isActiveBalkon) {

                            logInfo("rules", logPrefix + "Verschattung für Markise (Balkon) aktiv")

                        } else { 

                            logInfo("rules", logPrefix + "Verschattung für Markise (Balkon) inaktiv")

                        }*/

            }

            case "reset" : {

                    logInfo("rules", logPrefix + "Verschattung Variablen reset")

                    isActiveWest = false

                    isActiveEast = false

                    isActiveSouth = false

                    isActiveBalkon = false

                }

        }

        Shading_Var.postUpdate(NULL) 

end

Maybe some1 can help me to find a solution?

Thanks and BR

There must now be a hundred threads on here about how most OH2 rules that use datetime will need changing for OH3, because of underlying java changes.
Start here maybe

any hints for and OH3:

AutoShading_Start_last.postUpdate(now.minusDays(1).toString())
AutoShading_Start_last.postUpdate(now.minusDays(1).toString())
var String timeLastEnde = AutoShading_End_last.state.toString().substring(0,10)
var String timeLastEndeM = AutoShadingM_End_last.state.toString().substring(0,10)

Items are in the first posting.