Seite 6 von 26
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 16. Aug 2019 13:50
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.
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?
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 16. Aug 2019 16:34
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.
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 17. Aug 2019 13:33
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.
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 17. Aug 2019 13:46
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
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 17. Aug 2019 14:24
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...
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 17. Aug 2019 14:30
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.
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 17. Aug 2019 14:42
von jensilein
Hallo Peter, welchen Wetterdaten-Provider nutzt Du, wenn ich fragen darf?
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 17. Aug 2019 14:43
von PeterA
Openweathermap
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 17. Aug 2019 14:48
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.
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 17. Aug 2019 15:00
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.