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
DavGre
Beiträge: 84
Registriert: 11. Mär 2019 15:47

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

Beitrag von DavGre »

Ich nutze aktuell die Konfiguration aus dem Ausgangspost und möchte die Rule etwas anpassen. Bin aber noch von der Komplexität erschlagen und momentan einfach nur froh, dass ich es ans Laufen bekommen habe.

Ich habe meine Rolläden in zwei Gruppen aufgeteilt, die jeweils unterschiedlich stark verschattet werden sollen.

Code: Alles auswählen

Group	Rolladen_Fenster
Group	Rolladen_Fenster_Tuer
Wie kann ich die Regel im Ausgangspost jetzt so anpassen, dass die Items der Gruppe "Rolladen_Fenster" beim verschatten auf 30 % fahren und die Items der Gruppe "Rolladen_Fenster_Tuer" auf 50 %?

Ich wollte erst den Weg gehen und die rule einfach doppelt schreiben. Dann brauche ich aber auch sämtliche Items doppelt, was sich letzten Endes als ziemlich aufwendig herausgestellt hat. Es wird ja bestimmt möglich sein, das ganze in eine rule zu packen, oder?

Benutzeravatar
udo1toni
Beiträge: 13864
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 kannst beide Gruppen wiederum in einer Gruppe zusammenfassen. Diese Gruppe nutzt Du zum Ansteuern, nun musst Du allerdings statt .members. .allMembers. schreiben. Damit werden alle member der Gruppe und iherer Tochtergruppen angesteuert.

Um nun innerhalb der Rule zu entscheiden, in welcher Gruppe sich die Items befinden, kannst Du mit .getGroupNames.contains(gruppenname) feststellen, ob das Item zu einer Gruppe gehört. Natürlich reicht es hier, zu prüfen, ob es zu der einen Gruppe gehört und dann entweder das eine oder das andere als Wert zu verwenden. Hört sich kompliziert an, sollte es aber eigentlich nicht sein.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

DavGre
Beiträge: 84
Registriert: 11. Mär 2019 15:47

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

Beitrag von DavGre »

Ich habe die Regel jetzt einfach folgendermaßen ergänzt:

Code: Alles auswählen

rule "Rollos  abfahren"
when Item astro_azimuth changed
then
    val String logPrefix = 'Rolloautomatik (Rollo ab) - '
    if (log) logInfo('rules', logPrefix + 'Regel wurde gestartet')
    
    var String timeLast = 'xxxx-xx-xx'
    if (rolloautomatik_start_last.state == NULL) {
        if (log) logInfo('rules', logPrefix + 'Erstmalige Ausführung am System, Belegung mit Initialwert')
    } else {
        timeLast = rolloautomatik_start_last.state.toString().substring(0,10)
    }
	var String timeNow = now.toString().substring(0,10)

    if (rolloautomatik.state == ON) {
        if (timeNow != timeLast) {
            if (astro_azimuth.state > Integer::parseInt(rolloautomatik_azimuth_start.state.toString())) {
                if (wetter_temperatur.state > Integer::parseInt(rolloautomatik_temp_min.state.toString())) {
                    if (wetter_bewoelkung.state  <= Integer::parseInt(rolloautomatik_wolken_max.state.toString())) { if (astro_elevation.state > Integer::parseInt(rolloautomatik_elevation_ende.state.toString())) {
                            // Rollos runterfahren
                            if (log) logInfo('rules', logPrefix + 'Rollos werden abgefahren')
                            Rolladen_Fenster.members.forEach[i|
                                if (i.state >= Integer::parseInt(rolloautomatik_zielwert.state.toString())) {
                                    if (log) logInfo('rules', logPrefix + 'Fahre Rolladen auf ' + rolloautomatik_zielwert.state.toString() + '%: ' + i.name)
                                    i.sendCommand(Integer::parseInt(rolloautomatik_zielwert.state.toString()))
                                } else {
                                    if (log) logInfo('rules', logPrefix + 'Rolladen ist bereits weiter geschlossen (' + i.state.toString() + '%) als er geschlossen werden sollte und wird daher ignoriert')
                                }
                            ]
                            [b]Rolladen_Tuer.members.forEach[i|
                                if (i.state >= Integer::parseInt(rolloautomatik_zielwert_tuer.state.toString())) {
                                    if (log) logInfo('rules', logPrefix + 'Fahre Rolladen auf ' + rolloautomatik_zielwert_tuer.state.toString() + '%: ' + i.name)
                                    i.sendCommand(Integer::parseInt(rolloautomatik_zielwert_tuer.state.toString()))
                                } else {
                                    if (log) logInfo('rules', logPrefix + 'Rolladen ist bereits weiter geschlossen (' + i.state.toString() + '%) als er geschlossen werden sollte und wird daher ignoriert')
                                }
                            ][/b]
                            // Letzte Ausführung mit entsprechendem Zeitstempel belegen
                            rolloautomatik_start_last.postUpdate(now.toString())
                        } else {
                            if (log) logInfo('rules', logPrefix + 'Elevation für wieder abfahren (' + rolloautomatik_elevation_ende.state.toString() + ') ist groesser als aktuelle (' + astro_elevation.state.toString() + ')')
                        }
                    } else {
                        if (log) logInfo('rules', logPrefix + 'Mindestbewoelkung (' + rolloautomatik_wolken_max.state.toString() + ') wurde unterschritten (' + wetter_bewoelkung.state.toString() + ')')
                    }
                } else {
                    if (log) logInfo('rules', logPrefix + 'Mindest-Temperatur (' + rolloautomatik_temp_min.state.toString() + ') wurde nicht erreicht durch aktuelle Temperatur (' + wetter_temperatur.state.toString() + ')')
                }
            } else {
                if (log) logInfo('rules', logPrefix + 'Azimuth (' + astro_azimuth.state.toString() + ') hat noch nicht Schwellwert (rolloautomatik_azimuth_start.state.toString()) erreicht')
            }
        } else {
            if (log) logInfo('rules', logPrefix + 'Automatik heute bereits einmal gelaufen, wird daher ignoriert')
        }
    } else {
         if (log) logInfo('rules', logPrefix + 'Beende, da Automatik generell nicht aktiv')
    }
end

rule "Rollos Fenster wieder öffnen"
when Item astro_elevation changed
then
    val String logPrefix = 'Rolloautomatik (Rollo hoch) - '
    if (log) logInfo('rules', logPrefix + 'Regel wurde gestartet')

    var String timeLastEnde = 'xxxx-xx-xx'
    if (rolloautomatik_ende_last.state == NULL) {
        if (log) logInfo('rules', logPrefix + 'Erstmalige Ausführung am System, Belegung mit Initialwert')
    } else {
        timeLastEnde = rolloautomatik_ende_last.state.toString().substring(0,10)
    }

    var String timeLastStart = 'yyyy-yy-yy'
    if (rolloautomatik_start_last.state == NULL) {
        if (log) logInfo('rules', logPrefix + 'Erstmalige Ausführung am System, Belegung mit Initialwert')
    } else {
        timeLastStart = rolloautomatik_start_last.state.toString().substring(0,10)
    }

	var String timeNow = now.toString().substring(0,10)


    if (rolloautomatik.state == ON) {
        if (astro_elevation.state <= Integer::parseInt(rolloautomatik_elevation_ende.state.toString())) {
            if (timeLastStart == timeNow) {
                if (timeLastEnde != timeNow) {
                    // Rollos wieder hoch
                    if (log) logInfo('rules', logPrefix + 'Rollos werden hinaufgefahren')
                    Rolladen_Fenster.members.forEach[i|
                        if (rolloautomatik_zielwert.state == Integer::parseInt(i.state.toString())) {
                            if (log) logInfo('rules', logPrefix + 'Fahre Rolladen auf 0%: ' + i.name)
                            i.sendCommand(100)
                        } else {
                            if (log) logInfo('rules', logPrefix + 'Fahre Rolladen nicht auf 0%, da dieser zwischenzeitlich manuell verändert wurde: ' + i.name)
                        }
                    ]
                    Rolladen_Tuer.members.forEach[i|
                        if (rolloautomatik_zielwert_tuer.state == Integer::parseInt(i.state.toString())) {
                            if (log) logInfo('rules', logPrefix + 'Fahre Rolladen auf 0%: ' + i.name)
                            i.sendCommand(100)
                        } else {
                            if (log) logInfo('rules', logPrefix + 'Fahre Rolladen nicht auf 0%, da dieser zwischenzeitlich manuell verändert wurde: ' + i.name)
                        }
                    ]                    
                    // Letzte Ausführung mit entsprechendem Zeitstempel belegen
                    rolloautomatik_ende_last.postUpdate(now.toString())
                } else {
                    if (log) logInfo('rules', logPrefix + 'Beende, da heute bereits ein automatisches Wiederhochfahren stattfand')
                }
            } else {
                if (log) logInfo('rules', logPrefix + 'Beende, da heute noch keine Ausführung stattfand. Demzufolge kann auch kein automatisches Öffnen gewollt sein')
            }
        } else {
            if (log) logInfo('rules', logPrefix + 'Beende, da Elevation (' + astro_elevation.state.toString() + ') nicht  kleiner der eingestellten Elevation (' + rolloautomatik_elevation_ende.state.toString()+ ') war')
        }
    } else {
        if (log) logInfo('rules', logPrefix + 'Beende, da Automatik generell nicht aktiv')
    }
end
Den Zielwert der "Rollade_Tuer" definiere ich einfach über ein zweites Item (rolloautomatik_zielwert_tuer). Den Rest habe ich unverändert gelassen.
Funktioniert soweit auch alles, nur beim hochfahren ist mir ein Problem aufgefallen.

Es erscheint diese Meldung im log:

Code: Alles auswählen

2019-08-17 13:22:33.392 [INFO ] [eclipse.smarthome.model.script.rules] - Rolloautomatik (Rollo hoch) - Fahre Rolladen nicht auf 0%, da dieser zwischenzeitlich manuell verändert wurde: Rollade_WZ_Fenster
Hat das was mit der Tatsache zu tun, dass die Rollade vorher nicht auf exakt "30" gefahren ist?

Code: Alles auswählen

2019-08-17 13:21:33.487 [nt.ItemStatePredictedEvent] - Rollade_WZ_Fenster predicted to become 30

2019-08-17 13:21:56.262 [vent.ItemStateChangedEvent] - Rollade_WZ_Fenster changed from 30 to 29
Laut Log scheint die Rollade von 30 auf 29 "gesprungen" zu sein. Wie kann das sein? Es wurde definitiv nicht geschaltet und kein Kommando gesendet. Kalibriert ist der Shelly ebenfalls.

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 »

Leider positionieren die Shellys nicht genau auf den Zielwert.
Deshalb ist in der Rule zum Öffnen ein "Bereich" eingebaut.

Code: Alles auswählen

 if((Rolloautomatik_zielwert.state as Number).intValue <= (i.state as Number).intValue +5 && (Rolloautomatik_zielwert.state as Number).intValue >= (i.state as Number).intValue -5) {
hier darf der Rolladen +5 und -5 vom Sollwert stehen und öffnet trozdem.

Gruß
Peter
- OpenHab 2.4
#PWRUP

jensilein
Beiträge: 34
Registriert: 24. Feb 2018 09:11

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

Beitrag von jensilein »

Hallo, ich wollte mal nachfragen, wie Eure Erfahrungen mit der Verschattung unter Berücksichtigung der Bewölkung sind. Bei mir ist es häufig so, dass die Verschattung anspringt, obwohl die tatsächliche Bewölkung so groß ist, dass die Verschattung eigentlich nicht anspringen sollte oder auch umgekehrt, d.h., die Verschattung müsste anspringen, da die tatsächliche Bewölkung entsprechend gering ist, tut es aber nicht... Die Qualität der Wetterdaten scheint hier nicht so gut zu sein, dass man sich wirklich darauf verlassen kann. Habt Ihr da ähnliche Erfahrungen bzw. wie geht Ihr damit um? Ich lasse bei mir in der rule nicht den aktuellen Wert der Bewölkung, sondern den Mittelwert der letzten 30 Minuten berücksichtigen, das hat das Ganze vom Gefühl her schon verbessert, aber wirklich verlässlich ist die Funktion damit auch nicht...

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 so ähnlich ist es hier auch da sich die Wetterstation etwas weiter weg von meinem Standort befindet.
D.h wenn die Wetterdaten z.b. 20% Bewölkung melden, ist es hier noch etwas stärker Bewölkt.
Mit etwas Verzögerung nimmt die Bewölung dann ab. Und dann passt es.
Da fahren die Rolläden halt etwas früher Runter. Ist ja auch nicht schlimm.
- OpenHab 2.4
#PWRUP

jensilein
Beiträge: 34
Registriert: 24. Feb 2018 09:11

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

Beitrag von jensilein »

Hallo Peter, welchen Wetterdaten-Provider nutzt Du, wenn ich fragen darf?

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 »

Openweathermap
- OpenHab 2.4
#PWRUP

jensilein
Beiträge: 34
Registriert: 24. Feb 2018 09:11

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

Beitrag von jensilein »

Ist es bei Dir auch so, dass die Bewölkung relativ häufig zwischen Null und irgend einem Wert schwankt? Ich habe die Werte mal aufgezeichnet und da kommt eine ziemliche Sägezahnkurve heraus.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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 »

Ich persistiere diese Daten nicht.
Aber bei mir bekomme ich für die Bewölkung nur Werte von
0% 20% 40% oder höher.
Bei uns ist dann der Schwellenwert für die Verschattung auf 20% eingestellt. Das passt ganz gut so.
- OpenHab 2.4
#PWRUP

Antworten