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.