OH3 - Rule - Script execution of rule with UID 'shutter-1' failed

Hi,

ive switched from OH2.5 to OH3 and my rule dont work anymore.

Ill paste the whole rule but from my point of view only in the function shadingstart is the error. Marked in fat.

import java.util.Map

var Boolean message = true

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(ZonedDateTime.now.toLocalDateTime.toString())   //              now.toLocalDateTime.toString())
    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(ZonedDateTime.now.toLocalDateTime.toString())
                    

                    //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(ZonedDateTime.now.toLocalDateTime.minusDays(1).toString())
        //AutoShading_Start_last.postUpdate(ZonedDateTime.now().minusDays(1).toString())
        return;
    }
    /*
    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(ZonedDateTime.now.toLocalDateTime.minusDays(1).toString())
            AutoShadingM_End_last.postUpdate(ZonedDateTime.now.toLocalDateTime.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(ZonedDateTime.now.toLocalDateTime.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(Date_Time.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 

The log returns if temperature is enough to start shading for south:

021-04-24 12:38:53.594 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Verschattung für Rollläden SÜD
2021-04-24 12:38:53.596 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Temperatur false
2021-04-24 12:38:53.598 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Beende, da heute noch keine automatische Verschattung stattfand
2021-04-24 12:38:53.599 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Grenzwert wurden erreicht, Rollladen werden geschlossen
2021-04-24 12:38:53.601 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Fahre Rollladen (OG_Elternschlafen_Sued) auf (75) %
2021-04-24 12:38:53.603 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID ‘shutter-1’ failed: cannot invoke method public abstract int java.lang.Number.intValue() on null in shutter
2021-04-24 12:43:53.590 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Verschattung für Rollläden SÜD
2021-04-24 12:43:53.595 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Rain false
2021-04-24 12:43:53.598 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Clouds false
2021-04-24 12:43:53.599 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Grenzwert wurden erreicht, Rollladen werden geschlossen
2021-04-24 12:43:53.600 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Rollladen ist bereits weiter geschlossen (75%) als er geschlossen werden sollte und wird daher ignoriert
2021-04-24 12:43:53.601 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Temperatur false
2021-04-24 12:43:53.601 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID ‘shutter-1’ failed: cannot invoke method public abstract int java.lang.Number.intValue() on null in shutter
2021-04-24 12:43:53.603 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Beende, da heute noch keine automatische Verschattung stattfand
2021-04-24 12:48:53.588 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Verschattung für Rollläden SÜD
2021-04-24 12:48:53.595 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Grenzwert wurden erreicht, Rollladen werden geschlossen
2021-04-24 12:48:53.596 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Rain false
2021-04-24 12:48:53.597 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Rollladen ist bereits weiter geschlossen (75%) als er geschlossen werden sollte und wird daher ignoriert
2021-04-24 12:48:53.598 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID ‘shutter-1’ failed: cannot invoke method public abstract int java.lang.Number.intValue() on null in shutter

Thanks and BR

Note that this won’t be very effective. I understand it is to set start-up conditions, maybe you usually persist and restore these Items?
But on the occasion when they do run - postUpdate() is asynchronous and does not update the Item immediately. If you try to use the Item’s state later in the rule, it will probably still be NULL.

So most likely it is blowing up on this line?

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

You could log out the parts to see what is going on. Just what is blind.name, for example?

I know that in OH2 that when a Group is churning around updating members, some internal timing race would produce the occasional null result during operations like forEach.
Given that you’ve got both rules running in parallel here operating on the same Group, I’m surprised it mostly worked in OH2 and unsurprised it does not in OH3.

You can make your lambda code more tolerant of nulls, as a quick fix.

In the longer term, you might choose to write rules in some other language where you have access to Item’s metadata. Then you could set target heights etc.as Item metadata properties, avoid having those hardcoded hash maps.

Very thanks for your reply but im using the rule without a clue of lambda code. Is it possible to rewrite it or give me some advice?

Alright, it’s going to be difficult if you’re not understanding your own code.

This part is the “lambda”, it means bit like a function

val shadingStart = [GroupItem shutter |
     //your code
   ]

First thing I’d do is simplify the rules; you’ve got one triggered from azimuth and one from elevation. I assume that’s solar. These always change together, just one rule should do surely?
That might help on its own, just by reducing the amount of churning around in the shared Group at the same time.

The next thing I’d do is try to check out my theory - null returned sometimes from group forEach. As I understand it, this came from OH2 core timing issues, and I do not think much changed in this area for OH3.

Just guessing this part goes wrong -

    shutter.allMembers.forEach[ blind |
         if ((blind.state as Number) == targetHights.get(blind.name.toString()).intValue) {
  

so let’s find out

    shutter.allMembers.forEach[ blind |
         if (blind === null) {
            logInfo("shutterlambda", "Group member returned null")
         } else {
            logInfo("shutterlambda", "processing Group member " + blind.name)
            if ((blind.state as Number) == targetHights.get(blind.name.toString()).intValue) {
            // rest of your code
         }

Thanks and i will try your suggestions and give feedback soon.

Thats the new log. No clue what to do…

2021-05-08 16:56:05.497 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Grenzwert wurden erreicht, Rollladen werden geschlossen
2021-05-08 16:56:05.502 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Temperatur false
2021-05-08 16:56:05.505 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Beende, da heute noch keine automatische Verschattung stattfand
2021-05-08 16:56:05.517 [INFO ] [nhab.core.model.script.shutterlambda] - processing Group member EG_Jalousie_Essen_Tuere_West
2021-05-08 16:56:05.524 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Rollladen ist bereits weiter geschlossen (0%) als er geschlossen werden sollte und wird daher ignoriert
2021-05-08 16:56:05.525 [INFO ] [nhab.core.model.script.shutterlambda] - processing Group member OG_Ankleide
2021-05-08 16:56:05.526 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung aktivieren - Rollladen ist bereits weiter geschlossen (67%) als er geschlossen werden sollte und wird daher ignoriert
2021-05-08 16:56:05.527 [INFO ] [nhab.core.model.script.shutterlambda] - processing Group member EG_Jalousie_Essen_Tuere_West_Lamellen
2021-05-08 16:56:05.567 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'shutter-1' failed: cannot invoke method public abstract int java.lang.Number.intValue() on null in shutter

It’s a step forward.

2021-05-08 16:56:05.527 [INFO ] [nhab.core.model.script.shutterlambda] - processing Group member EG_Jalousie_Essen_Tuere_West_Lamellen
2021-05-08 16:56:05.567 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'shutter-1' failed: cannot invoke method public abstract int java.lang.Number.intValue() on null in shutter

Now you know you’ve got an Item successfully, but this targetHights.get() lookup failed.

So now you follow that through … what is it using to lookup? You just logged that out - EG_Jalousie_Essen_Tuere_West_Lamellen
Do you actually have an entry for that in your targetHights hashmap
?
I don’t think you do.

Thanks for pointing me in that direction. Youre right, there werent targetHights for that entry. I excluded and will test it today.

Next error is:

> 2021-05-14 20:10:10.184 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Verschattung Rollläden beenden
> 2021-05-14 20:10:10.187 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Rollladen werden geoeffnet
> 2021-05-14 20:10:10.190 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Oeffne Rollladen: OG_Elternschlafen_Sued
> 2021-05-14 20:10:10.195 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Oeffne Rollladen: EG_Tuere_Kueche
> 2021-05-14 20:10:10.197 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'shutter-2' failed: cannot invoke method public abstract int java.lang.Number.intValue() on null in shutter

I think it is in the function:

//-------------  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(ZonedDateTime.now.toLocalDateTime.toString())
                    

                    //Variablen zurücksetzen
                    isActiveWest = false
                    isActiveEast = false
                    isActiveSouth = false
    return true;
]

In the hashmap it is correct but maybe there is no value?

How do you know? You’re not logging out the name that you are using for hashmap lookup until after you’ve done the lookup and intValue. So when that fails, you don’t know what name it failed with.

Im expecting it is:
> 2021-05-14 20:10:10.195 [INFO ] [org.openhab.core.model.script.rules ] - Verschattung deaktivieren - Oeffne Rollladen: EG_Tuere_Kueche

Yes, that one worked. The log takes place after the intValue. The next member fails, and you don’t know what that is.

shutter.allMembers.forEach[ blind |
                       logInfo("test", "Now processing " + blind.name)
                       if (( ...

Hi. I have a problem similar to Hand_ASDwe after switching from oH 2.5 to OH3. Now a rule is no longer being performed correctly. The error message says:

2022-01-07 17:03:52.616 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID ‘beschattung-1’ failed: Could not cast NULL to org.openhab.core.library.types.DecimalType; line 146, column 18, length 48 in beschattung

That’s the part of the rule:

> //Ost-Seite    
> 
>         if (azimuth > 198.0) {
> 
>             if ((Rollladenaktor_Bad_OG_Seite.state as DecimalType).intValue == 65) {
> 
>                 Rollladenaktor_Bad_OG_Seite.sendCommand(1)
> 
>             }
> 
>         }

Who can help me? thank you in advance

That Item has a state of NULL. It hasn’t been initialised. You can’t get a numeric version of NULL.
What would you like to do about that? Are you expecting the Item to have been initialised by some binding linking it to a device? Do you need a start-up rule to initialise it for you? Do you want your rule just to skip this action if the Item happens to be NULL state?

My problem was the gRolladen because of the group members. It was a wrong group. Check that please.