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
SIDE22
Beiträge: 153
Registriert: 4. Mai 2020 01:31
Wohnort: Hagen a.T.W.

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

Beitrag von SIDE22 »

Cyrelian hat geschrieben: 7. Jun 2021 09:28 Hi salexes und Hoggle,

ja, das ist "fast" der "letzte" Stand. Meine rule läuft einwandfrei unter OH3. Das was ich angepasst habe war das:

- Versenden via Pushover (Änderung im Binding)
- "Zeitumstellung" Joda Time / Java time

Code: Alles auswählen

postUpdate(now.toString())
ersetzt durch

Code: Alles auswählen

postUpdate(now.toLocalDateTime().toString())
An der Stelle hatte er mir nämlich nen Fehler geworfen.


Hier die ganze Rule:

Code: Alles auswählen

import java.util.Map

var Boolean message = true
val actions = getActions("pushover", "pushover:pushover-account:openHAB")
var receipt = null

val String filename = "shutter.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

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 ( 
                "KuecheRollladenTuer" -> 58,
                "SchlafzimmerRollladenTuer" -> 100,
                "BadezimmerRollladen" -> 55,
                "WohnzimmerRollladenEsstisch" -> 65,
                "WohnzimmerRollladenTuer" -> 68,
                "WohnzimmerRollladenBalkon" -> 100,
                "GaesteWCRollladen_Slider" -> 100,
                "BueroRollladen" -> 100
                )
                // 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
                        val actions = getActions("pushover", "pushover:pushover-account:openHAB")
                        var receipt = actions.sendMessage("Verschattung für " + blind.name.toString + " aktiviert, schließen auf " + targetHights.get(blind.name.toString()).toString() + " %", "openHAB")
                        //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.toLocalDateTime().toString())
    return true;
]

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

val shadingEnd = [GroupItem shutter |

        val String logPrefix = "Verschattung deaktivieren - "

                    val Map<String, Number> targetHights = newHashMap ( 
                    "KuecheRollladenTuer" -> 58,
                    "SchlafzimmerRollladenTuer" -> 100,
                    "BadezimmerRollladen" -> 55,
                    "WohnzimmerRollladenEsstisch" -> 65,
                    "WohnzimmerRollladenTuer" -> 68,
                    "WohnzimmerRollladenBalkon" -> 100,
                    "GaesteWCRollladen_Slider" -> 100,
                    "BueroRollladen" -> 100
                     )
                    // 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                        
                            val actions = getActions("pushover", "pushover:pushover-account:openHAB")
                            var receipt = actions.sendMessage("Verschattung für (" + blind.name.toString() + ") beendet, Rollladen wird geöffnet.", "openHAB")                            
                            //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.toLocalDateTime().toString())
                    
                    //Variablen zurücksetzen
                    isActiveWest = false
                    isActiveEast = false
                    isActiveSouth = false
    return true;
]

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

rule "Rollladenautomatik / Markisenautomatik - 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 (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.toLocalDateTime.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.toLocalDateTime().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 ((OW_localCurrentTemperature.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, OW_localCurrentTemperature.state)
            return;
    }

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

    if ((Elevation.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, 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 "Markisenautomatik (Astro) - Verschattung beenden "
when
    Item IsNight changed from OFF to ON 
then
    if (isActiveBalkon) {
        logInfo("rules", logPrefix + "Verschattung Balkon beenden")
        gBalkonRollladen.sendCommand(DOWN)
        AutoShadingM_End_last.postUpdate(now.toLocalDateTime().toString())
    }
end


rule "Rollladenautomatik / Markisenautomatik - 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 (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 = (OW_localCurrentRainVolume.maximumSince(now.minusHours(1), "influxdb").state >= (minPrecip))
    logInfo("rules", logPrefix + "Rain " + isRainLastHour)
    
    val Boolean isCloudLastHour = (OW_localCurrentCloudiness.averageSince(now.minusHours(1), "influxdb")as Number >= (cloudHysteresis))
    logInfo("rules", logPrefix + "Clouds " + isCloudLastHour )
    
    val Boolean isTemperature = ((gTemperaturesOut.state as Number).intValue < (gTemperaturesOut.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.toLocalDateTime.minusDays(1).toString)
            AutoShadingM_End_last.postUpdate(now.toLocalDateTime.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 && 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.toLocalDateTime().toString())
        shadingEnd.apply(gRollladen)
        return;
    }

    if ((gTemperaturesOut.state as Number).floatValue > (AutoShading_Temp_raise.state as Number)) {
        logInfo("rules", logPrefix + "Beende, aktuelle Temperatur ({})° ueberschreitet den eingestellten Grenzwert zum hochfahren von ({})°",gTemperaturesOut.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.toLocalDateTime().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.toLocalDateTime().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
                }
            case "set" : {
                    logInfo("rules", logPrefix + "Verschattung Variablen set")
                    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)
                }
        }
        Shading_Var.postUpdate(NULL) 
end
CYA
Cyrelian
Guten Morgen Cyrelian,

könntest du eventuell deine benötigten Items einmal teilen ?
oder sind die aus den älteren beiträgen hier noch aktuell ?

LG
Florian
openHAB 3.1.0M5 als Debian-Container in Proxmox
Bindings (HomeMatic, Shelly, Phillips Hue, HTTP, MQTT, Spotify, Telegram)
rund 90 HomeMatic komponenten dazu 21 Shelly und ca. 126 Phillips Hue Leuchten im einsatz.
MQTT bindung für openWB (WallBox) abfrage, HTTP für DoorPi (IP Türsprechstelle)

cupra6
Beiträge: 35
Registriert: 4. Jan 2019 22:09

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

Beitrag von cupra6 »

Wäre es möglich bei dieser Collection (MAP-Konstrukt) einzelne Rollladen per Switch temporär rauszunehmen, z.B.: ich bin am Wochenende zu Hause und möchte den ganzen Tag den "WohnzimmerRollladenBalkon" nutzen und möchte nicht, dass er runterfährt.
Zwei Wochen später fahre ich in Urlaub und möchte, dass genau der "WohnzimmerRollladenBalkon" dann am WE doch runterfahrt.

Ich weiss, dass es am einfachsten wäre die Zeile auszukommentieren, aber das mit dem Switch wäre natürlich flexibler und der WAF wäre optimal :-)

2. Frage: warum werden ZWEI Maps mit genau dem Selben Inhalt angelegt? Würde eine Map nicht reichen ?

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 »

Die eine Map enthält die Sollhöhen für Abwärts, die andere Map enthält die Sollhöhen für Aufwärts. Die Maps sind mitnichten gleich.

Wenn Du einzelne Läden von der Steuerung zeitweise ausklammern willst, so musst Du das in der Rule halt einbauen (sprich: Du fragst einen Schalter ab, wenn es daran geht, den Laden zu steuern und die Steuerung wirkt dann halt nur, wenn der Schalter eine bestimmte Position hat).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1161
Registriert: 4. Nov 2019 22:08
Answers: 9

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

Beitrag von int5749 »

cupra6 hat geschrieben: 11. Jun 2021 19:18 Ich weiss, dass es am einfachsten wäre die Zeile auszukommentieren, aber das mit dem Switch wäre natürlich flexibler und der WAF wäre optimal :-)
Ein Swtch ist die eine Möglichkeit. Wir haben dies a) über eine Anwesendheit und b) Türkontakt gekoppelt. Wenn meine Frau und/oder ich zu Hause sind fahren manche Rollladen etwas anders und wenn einer zu Hause ist und die Terrassentüre offen steht, fährt diese gar nicht.

Hingegen fahren die entsprechenden Terrassentüren automatisch runter, falls alle das Haus verlassen haben und eine Türe noch offen steht. Parallel bekommen wir natürlich einen Hinweis, aber evtl. übersieht man den ja in der Hektik ;-)
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

cupra6
Beiträge: 35
Registriert: 4. Jan 2019 22:09

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

Beitrag von cupra6 »

Hallo Udo,

danke für die schnelle Antwort.
Meiner Meinung nach sind beide Maps (Stand von Cyrelian » 7. Jun 2021 09:28) wohl identisch, sowohl der "String" als auch die "Numbers".
Wäre es wie die Rule momentan aufgebaut ist nicht der Fall, würden die Rollos erst gar nicht wieder hochfahren:

Die 1. Map bringt die Rollos auf die Ziel-Höhen: (und nur dann, wenn die entsprechende Rollos nicht weiter unten stehen: "<")
1. VERSCHATTUNG STARTEN:

Code: Alles auswählen

if ((blind.state as Number) < targetHights.get(blind.name.toString()).intValue) 
Die 2. Map vergleicht lediglich ob sie zur Laufzeit der DEAKTIVERUNGS Rule immernoch da stehen "==", ist das nicht der Fall, passiert mit diesen Rollos weiter NICHTS !
2. VERSCHTTUNG BEENDEN:

Code: Alles auswählen

if ((blind.state as Number) == targetHights.get(blind.name.toString()).intValue)
Die 2. Map könnte komplett anders sein, allerdings müsste man dazu den Vergleichsoperator ändern:

Code: Alles auswählen

if ((blind.state as Number) > targetHights.get(blind.name.toString()).intValue)
aber, man läuft dabei die Gefahr: fährt man zwischendurch irgendein Rollo weiter runter als der Wert in der 2. Map, bleibt der Rollo einfach stehen.

Schau dir bitte deinen Post auf der Seite 10 an (am 8. Jun 2020 01:20), da hattest du meine Rule schon so umgebaut, dass nur eine Map gebraucht wurde.

Korrigiere mich bitte, falls ich mich irre.
Wenn das so stimmt, könnte man auf die 2. Map verzichten.


PS: in welchem Bereich der Rule, müsste ich es den Sperr-Schalter einbauen, damit es funktioniert ?

Ich vermute es wird hier passieren:

Code: Alles auswählen

shutter.allMembers.forEach[ blind |
if ((blind.state as Number) < targetHights.get(blind.name.toString()).intValue)  {
    blind.sendCommand(targetHights.get(blind.name.toString()).intValue)
}
Könnte das so klappen: ?

Code: Alles auswählen

shutter.allMembers.forEach[ blind |
if ((blind.state as Number) < targetHights.get(blind.name.toString()).intValue)  {
   if ((blind_sperre.state  != ON)  {
   blind.sendCommand(targetHights.get(blind.name.toString()).intValue)
}
Zuletzt geändert von cupra6 am 11. Jun 2021 23:45, insgesamt 1-mal geändert.

cupra6
Beiträge: 35
Registriert: 4. Jan 2019 22:09

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

Beitrag von cupra6 »

int5749 hat geschrieben: 11. Jun 2021 20:59
cupra6 hat geschrieben: 11. Jun 2021 19:18 Ich weiss, dass es am einfachsten wäre die Zeile auszukommentieren, aber das mit dem Switch wäre natürlich flexibler und der WAF wäre optimal :-)
Ein Swtch ist die eine Möglichkeit. Wir haben dies a) über eine Anwesendheit und b) Türkontakt gekoppelt. Wenn meine Frau und/oder ich zu Hause sind fahren manche Rollladen etwas anders und wenn einer zu Hause ist und die Terrassentüre offen steht, fährt diese gar nicht.

Hingegen fahren die entsprechenden Terrassentüren automatisch runter, falls alle das Haus verlassen haben und eine Türe noch offen steht. Parallel bekommen wir natürlich einen Hinweis, aber evtl. übersieht man den ja in der Hektik ;-)
Das ist ja echt interessant, mit den beiden a) und b) Optionen. Könntest du die komplette Rule posten ?

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, Du hast natürlich Recht, ich hatte Tomaten auf den Augen...

Das Problem ist hier, dass die Hashmap Teil der Funktion ist.
Allgemein kann man feststellen, dass Funktionen in der Rules DSL nicht soo toll sind.
Insbesondere, wenn eine Funktion nur in einer Rule Verwendung findet, ist fast sicher der Code ungünstig gestaltet, falls es mehrere Stellen in der Rule gibt, in der identischer Code ausgeführt wird (bei dem es sich lohnt, ihn in eine Funktion auszulagern).

Oder anders ausgedrückt: In den meisten Fällen sollte man in der Rules DSL auf Funktionen ganz verzichten.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

SIDE22
Beiträge: 153
Registriert: 4. Mai 2020 01:31
Wohnort: Hagen a.T.W.

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

Beitrag von SIDE22 »

Hey,
Das Thema mit den items hab ich nun schon.
Aber wie baue ich den sinnvoll in die Rule von Cyrelian Zeitstempel für ost Süd und West ein?
Aktuell gibt es ja nur 1 Zeitstempel für alle würde dies gerne einzelnt haben.
Bin aktuell auch dabei die Rule etwas anzupassen da ich diese nicht direkt als verschattung nutze und ich die Seiten (ist Süd West) einzelnt hoch fahren lasse so als die sonne nicht mehr reinscheint.

Einzelne Zeitstempel für das hochfahren hab ich schon.

LG
Florian
openHAB 3.1.0M5 als Debian-Container in Proxmox
Bindings (HomeMatic, Shelly, Phillips Hue, HTTP, MQTT, Spotify, Telegram)
rund 90 HomeMatic komponenten dazu 21 Shelly und ca. 126 Phillips Hue Leuchten im einsatz.
MQTT bindung für openWB (WallBox) abfrage, HTTP für DoorPi (IP Türsprechstelle)

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

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

Beitrag von Quautiputzli »

So, ich hab nun mal angefangen die Rule für mich zu nutzen. Ich musste natürlich einiges umschreiben.

-Meine Itemnamen natürlich

-dann musste ich "postUpdate(now.toLocalDateTime().toString())" in "postUpdate(new DateTimeType())" abändern, obwohl ich dachte der erste Ausdruck sollte für OH3 funktionieren.

-dann musste ich "((Wetter_Aussentemperatur.state as Number).intValue" in "((Wetter_Aussentemperatur.state as Number).floatValue" ändern, da bei mir die Temp mit Einheit daherkommt.

Dann wurden meine Rollos schonmal runtergefahren.

Beim rauffahren habe ich noch Probleme. Dort kommt der Fehler:

Code: Alles auswählen

2021-06-12 21:14:50.736 [WARN ] [nce.extensions.PersistenceExtensions] - There is no queryable persistence service registered with the id 'influxdb'
Ist ja auch klar, denn ich habe gar keine influxdb. Muss ich die installieren? Brauch ich die? Denn die Werte sind doch eingentlich da. Denn wenn ich bei der Aussentemperatur z.B. auf Analyse klicke, sind die Werte doch auch da:
Bild_2021-06-14_084100.png
Mit Persistence habe ich mich noch gar nicht befasst. Was muss ich da machen?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Servus

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 »

Lass die Kennung für die Persistence einfach weg, dann nutzt openHAB den Standard. Wenn keine Persistence installiert ist, sollte rrd4j verwendet werden. Aber Achtung! Der Mechanismus ist an dieser Stelle gewöhnungsbedürftig… Keine installierte Persistence -> rrd4jk wird verwendet. Andere als rrd4j installierte Persistence -> diese wird verwendet. Rrd4j ist nicht mehr verfügbar. Das heißt: Du musst dennoch rrd4j zusätzlich installieren, falls Du eine andere Persistence einrichtest, sonst bleiben die Analyze Graphen leer. Außerdem muss dann die default Persistence aktiv gesetzt werden.


Gesendet von iPad mit Tapatalk
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten