Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
TomW80
Beiträge: 60
Registriert: 7. Mai 2021 19:11

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von TomW80 »

Hallo zusammen,

Erstmal vielen Dank für die tolle Rule!
Leider funktioniert diese noch nicht ganz korrekt bei mir. Bekomme beim Verattung beenden folgenden Fehler:
2021-04-28 20:31:32.681 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Verschattung Rollläden beenden
2021-04-28 20:31:32.699 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Rollladen werden geoeffnet
2021-04-28 20:31:32.708 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Rollladen: (Jalousie_Kueche_5M1) wird nicht geoeffnet, da dieser zwischenzeitlich manuell verändert wurde.
2021-04-28 20:31:32.714 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Rollladen: (Rollo_OG_Kind2_Sueden) wird nicht geoeffnet, da dieser zwischenzeitlich manuell verändert wurde.
2021-04-28 20:31:32.720 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Rollladen: (Rollo_OG_Kind1_Sueden) wird nicht geoeffnet, da dieser zwischenzeitlich manuell verändert wurde.
2021-04-28 20:31:32.725 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Oeffne Rollladen: EG_Gaestezimmer_Rollo
2021-04-28 20:31:32.736 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Rollladen: (Rollo_OG_Buero) wird nicht geoeffnet, da dieser zwischenzeitlich manuell verändert wurde.
2021-04-28 20:31:32.741 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Verschattung beenden': cannot invoke method public abstract int java.lang.Number.intValue() on null
Jemand eine Idee woran das liegt?

Dann hätte ich noch eine Verständnisfrage, kann mir mal jemand bei diesem Code erklären was das mit dem GroupItem shutter auf sich hat? Ich habe keine Gruppe Namens "shutter".
val shadingStart = [GroupItem shutter |

val String logPrefix = "Verschattung aktivieren - "

val Map<String, Number> targetHights = newHashMap (
"EG_Gaestezimmer_Rollo" -> 50,
"EG_Wohnzimmer_Rollo" -> 50,
"Jalousie_Wohnzimmer_3M1" -> 100,
"Jalousie_Esszimmer_West_4M1" -> 100,
Gruß Tom

TomW80
Beiträge: 60
Registriert: 7. Mai 2021 19:11

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von TomW80 »

Keiner eine Idee zum meinem Problem bzw. eine Info zu meiner Frage? :?

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

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von udo1toni »

Du wirst einen Fehler in Deiner Rule haben. Dazu müsstest Du eine Kopie Deines Codes herzeigen. Bitte Code immer als Code markieren, nie als Zitat oder gar ohne jegliche Markierung.

Was die Verständnisfrage betrifft, so ist das eine Funktion (mit Namen shadingStart). Die Funktion wird mit einem Parameter aufgerufen, der vom Typ GroupItems ist. Im nachfolgenden Code wird der Platzhalter shutter verwendet, wann immer auf das übergebene GroupItem zugegriffen werden muss.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

TomW80
Beiträge: 60
Registriert: 7. Mai 2021 19:11

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von TomW80 »

Hallo udo1toni,

Danke für deine Antwort, hier mein Code:

Code: Alles auswählen

import java.util.Map

var Boolean message = true

val String filename = "rolladensteuerung.rules"

// Values und Variablen für die Verschattung

//val Number blindClosed = 100
//val Number blindOpen = 0
//val Number blindTranslucent = 35

var Number closingAzimuth_west = 181
var Number closingAzimuth_south = 111
var Number closingAzimuth_east = 65

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

// Test 
var Number TestRain = 0
var Number TestClouds = 0
// Test Ende  

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_Gaestezimmer_Rollo" -> 50,
                "EG_Wohnzimmer_Rollo" -> 50,
                "Jalousie_Wohnzimmer_3M1" -> 100,
                "Jalousie_Esszimmer_West_4M1" -> 100,
                "Jalousie_Esszimmer_West_4M2" -> 100,
                "Jalousie_Esszimmer_Sued_4M3" -> 100,
                "Jalousie_Esszimmer_Sued_4M4" -> 100,
                "Lamelle_Esszimmer_Sued_4M3" -> 100,
                "Lamelle_Esszimmer_Sued_4M4" -> 100,
                "Jalousie_Kueche_5M1" -> 50,
                "Rollo_OG_Bad_Osten" -> 50,
                "Rollo_OG_Kind2_Sueden" -> 50,
                "Rollo_OG_Kind2_Osten" -> 50,
                "Rollo_OG_Buero" -> 50,
                "Rollo_OG_Kind1_Westen" -> 45,
                "Rollo_OG_Kind1_Sueden" -> 50
                )
                // 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(now.toString())
    return true;
]

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

val shadingEnd = [GroupItem shutter |

        val String logPrefix = "Verschattung deaktivieren - "

                    val Map<String, Number> targetHights = newHashMap ( 
                    "EG_Gaestezimmer_Rollo" -> 0,
                    "EG_Wohnzimmer_Rollo" -> 0,
                    "Jalousie_Wohnzimmer_3M1" -> 0,
                    "Lamelle_Esszimmer_West_4M1" -> 50,
                    "Lamelle_Esszimmer_West_4M2" -> 50,
                    "Lamelle_Esszimmer_Sued_4M3" -> 50,
                    "Lamelle_Esszimmer_Sued_4M4" -> 50,
                    "Jalousie_Kueche_5M1" -> 0,
                    "Rollo_OG_Bad_Osten" -> 0,
                    "Rollo_OG_Kind2_Sueden" -> 0,
                    "Rollo_OG_Kind2_Osten" -> 0,
                    "Rollo_OG_Buero" -> 0,
                    "Rollo_OG_Kind1_Westen" -> 0,
                    "Rollo_OG_Kind1_Sueden" -> 0
                     )
                    // 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(now.toString())
                    
                    //Variablen zurücksetzen
                    isActiveWest = false
                    isActiveEast = false
                    isActiveSouth = false
    return true;
]

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

rule "Verschattung starten"
when
    Item SunAzimut 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 (IsDay.state != ON) {                                                                       
        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())
    }

    //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) && (OW_localCurrentCloudiness.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 (gPresence.state != OFF) {                                                                           
    //    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 ((Temperaturen_aussen.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, Temperaturen_aussen.state)
            return;
    }

    if ((Weather_OWM_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 ({})", Weather_OWM_Cloudiness.state, AutoShading_Cloudiness_max.state)
            return;
    }

    if ((SunElevation.state as Number) <= (AutoShading_Elevation_end.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, SunElevation.state)
            return;
    }

    //Azimuth ist größer als 181° (WEST)
    if (!isActiveWest) { 
        if ((SunAzimut.state as Number).floatValue > (closingAzimuth_west)) {
            logInfo("rules", logPrefix + "Verschattung für Rollläden WEST")
            isActiveWest = shadingStart.apply(gRollos_W)
            return;
        }      
    } else {
            logInfo("rules", logPrefix + "Verschattung für Rollläden WEST bereits aktiviert")
        } 

    //Azimuth ist größer als 111° (SÜD)
if (!isActiveSouth) { 
        if ((SunAzimut.state as Number).floatValue > (closingAzimuth_south) && (SunAzimut.state as Number).floatValue < (closingAzimuth_west)) {
            logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD")
            isActiveSouth = shadingStart.apply(gRollos_S)
            return;
        }
} else {
            logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD bereits aktiviert")
        }

    //Azimuth ist größer als 65° (OST)
    if (!isActiveEast) { 
        if ((SunAzimut.state as Number).floatValue > (closingAzimuth_east) && (SunAzimut.state as Number).floatValue < (closingAzimuth_south)) {
            logInfo("rules", logPrefix + "Verschattung für Rollläden OST")
            isActiveEast = shadingStart.apply(gRollos_O)
        return;
        }
    } else {
            logInfo("rules", logPrefix + "Verschattung für Rollläden OST bereits aktiviert")
        }
end

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

rule "Verschattung beenden"
when 
    Item SunElevation 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 (IsDay.state != ON) {                                                                        
        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 = (Weather_OWM_Rain.maximumSince(now.minusHours(1), "influxdb").state >= (minPrecip))
//Test
    TestRain = Weather_OWM_Rain.maximumSince(now.minusHours(1), "influxdb").state as Number
    TestClouds = (Weather_OWM_Cloudiness.averageSince(now.minusHours(1), "influxdb") as Number)
// Test Ende      
    logInfo("rules", logPrefix + "Rain " + isRainLastHour)
//Test     
    logInfo("rules", logPrefix + "Rain2 " + TestRain)
    logInfo("rules", logPrefix + "Clouds2 " + TestClouds )
// Test Ende    
    val Boolean isCloudLastHour = (Weather_OWM_Cloudiness.averageSince(now.minusHours(1), "influxdb")as Number >= (cloudHysteresis))
    logInfo("rules", logPrefix + "Clouds " + isCloudLastHour )
    
    val Boolean isTemperature = ((Temperaturen_aussen.state as Number).intValue < (Temperaturen_aussen.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.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) {
        logInfo("rules", logPrefix + "Beende, da heute bereits ein automatisches Hochfahren stattfand")
        return;
    }

    if (!isActiveWest && !isActiveEast && !isActiveSouth) {
        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)
        AutoShading_End_last.postUpdate(now.toString())
//        AutoShadingM_End_last.postUpdate(now.toString())
        shadingEnd.apply(gRollos)
        return;
    }

    if ((Temperaturen_aussen.state as Number).floatValue > (AutoShading_Temp_raise.state as Number)) {
        logInfo("rules", logPrefix + "Beende, aktuelle Temperatur ({})° ueberschreitet den eingestellten Grenzwert zum hochfahren von ({})°",Temperaturen_aussen.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)
        AutoShading_End_last.postUpdate(now.toString())
//        AutoShadingM_End_last.postUpdate(now.toString())
        shadingEnd.apply(gRollos)
        return;
    }

    if ((SunElevation.state as Number) > (AutoShading_Elevation_end.state as Number)) {
        logInfo("rules", logPrefix + "Beende, aktuelle Elevation ({}) ueberschreitet den eingestellten Grenzwert von ({}) ", SunElevation.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(gRollos)
        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

ok-qt20
Beiträge: 3
Registriert: 23. Apr 2021 16:41

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von ok-qt20 »

Hallo zusammen,

tolle Sache die hier hier auf die Beine gestellt habt. Danke an alle Beteiligten ist sehr spannend. Ich habe bei der Anpassung an mein System nach Peters Version einen Fehler.

Code: Alles auswählen

2021-05-28 14:35:59.598 [WARN ] [b.core.model.script.actions.BusEvent] - Cannot convert '2021-05-28T14:35:59.596940+02:00[Europe/Berlin]' to a state type which item 'Rolloautomatik_start_last' accepts: [DateTimeType, UnDefType].
Meine ITEMS sind:

Code: Alles auswählen

Group gruppeRollos
// Konfiguration Rollo-Automatik 
Switch Rolloautomatik "Rollo-Automatik aus/an"
Switch Rolloautomatik_oeffnen "Rolladen öffnen aus/an"
Number Rolloautomatik_zielwert "Schließen auf [%d Prozent]"
Number Rolloautomatik_temp_min "Temperatur größer [%d °C]"
Number Rolloautomatik_wolken_max "Bewölkung weniger als [%d Prozent]"
Number Rolloautomatik_azimuth_start "Sonnenrichtung größer gleich [%d °]"
Number Rolloautomatik_elevation_ende "Sonnenhöhe kleiner gleich [%d °]"
DateTime Rolloautomatik_start_last "Letzte Ausführung (Rollo ab)"
DateTime Rolloautomatik_ende_last "Letzte Ausführung (Rollo hoch)"
Ich nutze openHAB 3.0.2 auf einem Pi4

Ich habe einen Post gefunden in der Doku zu dem Thema
https://community.openhab.org/t/datetim ... 3-x/107197

Meiner Meinung nach muss ich #1 nutzen. Ist das richtig? Muss ich das in die Rule integrieren?
Wenn ja, kann mir jemand helfen bei der Konvertierung? Wenn nein freue ich mich über einen Lösungsweg.

Grüße vom Newbi
Maik

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

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von udo1toni »

Ja, meist ist die Umstellung von Joda Time auf JavaTime eine wichtige Fehlerquelle.

Es geht also vermutlich in dem Link um #3, JavaTime to DateTimeType, now ist JavaTime (und die Abkürzung über den String funktioniert offensichtlich nicht mehr).

Was den Fehler von TomW80 betrifft, so möchte ich behaupten, dass diese Zeile das Problem verursacht:

Code: Alles auswählen

    val Boolean isTemperature = ((Temperaturen_aussen.state as Number).intValue < (Temperaturen_aussen.minimumSince(now.minusHours(1), "influxdb").state as DecimalType -(temperatureHysteresis)))
Dabei wird das Item Temperaturen_aussen keinen gültigen Wert enthalten (weshalb dann intValue fehlschlägt).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

ok-qt20
Beiträge: 3
Registriert: 23. Apr 2021 16:41

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von ok-qt20 »

ich habe die Lösung darin gefunden, dass ich die ITEMS in openHAB neu angelegt habe. Diesmal nicht über VSC sondern direkt als ITEM in openHAB. Die beiden ITEMS sind als Typ: String
Damit hab ich nun auch die entsprechenden Einträge. Ist das so ok?

Frage in die Runde. Für das Probieren möchte ich den Inhalt der beiden ITEMS für das letzte Ausführen löschen. Geht das? Sonst muss ich immer einen Tag warten bis die Rule wieder startet.

Grüße vom Newbi

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von PeterA »

Ja das geht über die Rest Api
- OpenHab 2.4
#PWRUP

TomW80
Beiträge: 60
Registriert: 7. Mai 2021 19:11

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von TomW80 »

udo1toni hat geschrieben: 28. Mai 2021 19:28 Was den Fehler von TomW80 betrifft, so möchte ich behaupten, dass diese Zeile das Problem verursacht:

Code: Alles auswählen

    val Boolean isTemperature = ((Temperaturen_aussen.state as Number).intValue < (Temperaturen_aussen.minimumSince(now.minusHours(1), "influxdb").state as DecimalType -(temperatureHysteresis)))
Dabei wird das Item Temperaturen_aussen keinen gültigen Wert enthalten (weshalb dann intValue fehlschlägt).
Hallo udo1toni,

Der Wert wird aber geliefert, siehe den Log-Eintrag in Rot.
2021-05-29 20:18:37.456 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung aktivieren - Verschattung (Rollläden) wird nicht ausgeführt, Mindesttemperatur von (20) wurde nicht erreicht. Aktuelle Temperatur (17.900000000000001)
2021-05-29 20:18:37.464 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Rain false
2021-05-29 20:18:37.478 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Clouds false
2021-05-29 20:18:37.487 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Temperatur false
2021-05-29 20:18:37.496 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Verschattung Rollläden beenden
2021-05-29 20:18:37.507 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Rollladen werden geoeffnet
2021-05-29 20:18:37.512 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Rollladen: (Jalousie_Kueche_5M1) wird nicht geoeffnet, da dieser zwischenzeitlich manuell verändert wurde.
2021-05-29 20:18:37.515 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Rollladen: (Rollo_OG_Kind2_Sueden) wird nicht geoeffnet, da dieser zwischenzeitlich manuell verändert wurde.
2021-05-29 20:18:37.520 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Rollladen: (Rollo_OG_Kind1_Sueden) wird nicht geoeffnet, da dieser zwischenzeitlich manuell verändert wurde.
2021-05-29 20:18:37.523 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Oeffne Rollladen: EG_Gaestezimmer_Rollo
2021-05-29 20:18:37.532 [INFO ] [eclipse.smarthome.model.script.rules] - Verschattung deaktivieren - Rollladen: (Rollo_OG_Buero) wird nicht geoeffnet, da dieser zwischenzeitlich manuell verändert wurde.
2021-05-29 20:18:37.542 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Verschattung beenden': cannot invoke method public abstract int java.lang.Number.intValue() on null
Meiner Meinung nach passiert das her hier:

Code: Alles auswählen

                    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)
                        } else {
                            logInfo("rules", logPrefix + "Rollladen: (" + blind.name.toString() + ") wird nicht geoeffnet, da dieser zwischenzeitlich manuell verändert wurde.")
                        }    
                    ]
Dann müsste der Fehler in diesem Abschnitt liegen, oder?

Code: Alles auswählen

val shadingEnd = [GroupItem shutter |

        val String logPrefix = "Verschattung deaktivieren - "

                    val Map<String, Number> targetHights = newHashMap ( 
                    "EG_Gaestezimmer_Rollo" -> 0,
                    "EG_Wohnzimmer_Rollo" -> 0,
                    "Jalousie_Wohnzimmer_3M1" -> 0,
                    "Lamelle_Esszimmer_West_4M1" -> 50,
                    "Lamelle_Esszimmer_West_4M2" -> 50,
                    "Lamelle_Esszimmer_Sued_4M3" -> 50,
                    "Lamelle_Esszimmer_Sued_4M4" -> 50,
                    "Jalousie_Kueche_5M1" -> 0,
                    "Rollo_OG_Bad_Osten" -> 0,
                    "Rollo_OG_Kind2_Sueden" -> 0,
                    "Rollo_OG_Kind2_Osten" -> 0,
                    "Rollo_OG_Buero" -> 0,
                    "Rollo_OG_Kind1_Westen" -> 0,
                    "Rollo_OG_Kind1_Sueden" -> 0
                     )
                    // Rollladen öffnen
                    logInfo("rules", logPrefix + "Rollladen werden geoeffnet")
In welcher Reihenfolge werden die geöffnet? Denn die Einträge passen ja nicht zur Reihenfolge in der Logdatei.

Iritieren tut mich auch diese Meldung, weil hier kein Rollo verändert wurde:
wird nicht geoeffnet, da dieser zwischenzeitlich manuell verändert wurde.

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

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag von udo1toni »

Wir reden von diesem Fehler:

Code: Alles auswählen

2021-04-28 20:31:32.741 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Verschattung beenden': cannot invoke method public abstract int java.lang.Number.intValue() on null
Der findet in der Rule 'Verschattung beenden' statt und betrifft die Funktion .intValue()

Diese Zeile:

Code: Alles auswählen

    val Boolean isTemperature = ((Temperaturen_aussen.state as Number).intValue < (Temperaturen_aussen.minimumSince(now.minusHours(1), "influxdb").state as DecimalType -(temperatureHysteresis)))
ist die einzige Zeile in der besagten Rule, welche .intValue() verwendet. Der Ausdruck (Temperaturen_aussen.state as Number) ist also null.


EDIT:

Ah, zu kurz gedacht. Innerhalb der Rule wird die Funktion shadingEnd aufgerufen, in der .intValue ebenfalls verwendet wird.

Und da ist auch der Fehler sofort sichtbar. Vergleiche die Variable targetHeights in den beiden Funktionen shadingStart und shadingEnd, Du wirst feststellen, dass die Werte differieren, in shadingStart gibt es

Code: Alles auswählen

"Jalousie_Esszimmer_West_4M1" 
"Jalousie_Esszimmer_West_4M2" 
"Jalousie_Esszimmer_Sued_4M3" 
"Jalousie_Esszimmer_Sued_4M4" 
und in shadingEnd gibt es

Code: Alles auswählen

"Lamelle_Esszimmer_West_4M1" 
"Lamelle_Esszimmer_West_4M2" 
die anderen Werte gibt es in beiden Hashmaps. In den Hashmaps müssen für jedes Item der Gruppe gRollos Werte vorhanden sein (mehr stört nicht, hat aber auch nichts in der Hashmap zu suchen).

Und daran kann man erkennen, dass diese Art, eine Rule zu programmieren eher suboptimal ist, die Zusmmenhänge sind nicht eindeutig, das Log ist nicht wirklich hilfreich, der Code ist unübersichtlich.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten