Hi,
so, hat was länger gedauert und ich hatte noch ein kleines Problem mit der LAMBDA Funktion, bei der mir Rich aus der Community geholfen hat.
Danke auch an Seppy, bei dem hab ich die "val Map" abgeschaut
Der Ansatz ist etwas anders, da ich viel mit "early returns" gearbeitet habe, sobald ein Parameter nicht zutrifft. Damit wird die rule übersichtlicher (kaum einrücken und verschateln).
Code: Alles auswählen
import java.util.Map
// Das Logging und Messaging kann für diese Rules separat aktiviert werden (log=true)
var boolean log = true
var boolean message = true
val String filename = "shutter.rules"
var boolean returnvalueWest = false
var boolean returnvalueEast = false
var boolean returnvalueSouth = false
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 = 25
var Number openingTemperature = 22
val Map<String, Number> targetHights = newHashMap (
"KuecheRollladenTuer" -> 58,
"SchlafzimmerRollladenTuer" -> 100,
"BadezimmerRollladen" -> 55,
"WohnzimmerRollladenEsstisch" -> 65,
"WohnzimmerRollladenTuer" -> 68,
"WohnzimmerRollladenBalkon" -> 100
)
/* ------------- Automatische Abschattung ein/aus --------------------
*/
//------------- Abschattung FUNKTION --------------------
val shadingStart = [GroupItem shutter |
val String logPrefix = "Abschattung aktivieren - "
var boolean log = true
logInfo ("Lambda", logPrefix + shutter)
val Map<String, Number> targetHights = newHashMap (
"KuecheRollladenTuer" -> 58,
"SchlafzimmerRollladenTuer" -> 100,
"BadezimmerRollladen" -> 55,
"WohnzimmerRollladenEsstisch" -> 65,
"WohnzimmerRollladenTuer" -> 68,
"WohnzimmerRollladenBalkon" -> 100
)
if ((localCurrentTemperature.state as Number).floatValue <= (AutoShading_Temp_min.state as Number)) {
if (log) logInfo ("Lambda", logPrefix + "Mindesttemperatur von (" + AutoShading_Temp_min.state.toString() + ") wurde nicht erreicht. Aktuelle Temperatur (" + localCurrentTemperature.state.toString() + ")")
return false;
}
if ((localCurrentCloudiness.state as Number).floatValue > (AutoShading_Cloudiness_max.state as Number)) {
if (log) logInfo ("Lambda", logPrefix + "Aktuelle Bewoelkung (" + localCurrentCloudiness.state.toString() + ") ueberschreitet den eingestellten Grenzwert von (" + AutoShading_Cloudiness_max.state.toString() + ")")
return false;
}
if ((Elevation.state as Number) <= (AutoShading_Elevation_end.state as Number)) {
if (log) logInfo ("Lambda", logPrefix + "Elevation für das Beenden der Abschattung (" + AutoShading_Elevation_end.state.toString() + ") ist groesser als aktuelle (" + Elevation.state.toString() + ")")
return false;
}
// Rollladen werden geschlossen
if (log) logInfo("Lambda", logPrefix + "Grenzwert wurden erreicht, Rollladen werden geschlossen")
shutter.members.forEach[ blind |
if ((blind.state as Number) < targetHights.get(blind.name.toString()).intValue) {
logInfo ("Lambda", 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("Abschattung für " + blind.name.toString + " aktiviert, schließen auf " + targetHights.get(blind.name.toString()).toString() + " %"))
} else {
logInfo ("Lambda", 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;
]
//------------- Abschattung starten --------------------
rule "Abschattung starten"
when
Time cron "0/30 * * * * ?" or
Item Azimuth changed
then
val String logPrefix = "Abschattung aktivieren - "
//Prüfung ob Abschattungsautomatik an ist und ob es Tag ist
if (AutoShading.state == ON && IsDay.state == ON) {
//var String timeNow = now.toString().substring(0,10)
//var String timeLastStart = AutoShading_Start_last.state.toString().substring(0,10)
// Items für Sitemap füllen
if (AutoShading_Azimuth_east == "NULL" || AutoShading_Azimuth_south == "NULL" || AutoShading_Azimuth_west == "NULL" ){
AutoShading_Azimuth_east.postUpdate(closingAzimuth_west)
AutoShading_Azimuth_south.postUpdate(closingAzimuth_south)
AutoShading_Azimuth_west.postUpdate(closingAzimuth_west)
}
//Azimuth ist größer als 181° (WEST)
if (returnvalueWest == false) {
if ((Azimuth.state as Number).floatValue > (closingAzimuth_west)) {
if (log) logInfo (filename, logPrefix + "Abschatung für Rollläden WEST")
returnvalueWest = shadingStart.apply(gRollladenWest)
return;
}
}
//Azimuth ist größer als 111° (SÜD)
if (returnvalueSouth == false) {
if ((Azimuth.state as Number).floatValue > (closingAzimuth_south) && (Azimuth.state as Number).floatValue < (closingAzimuth_west)) {
if (log) logInfo (filename, logPrefix + "Abschatung für Rollläden SÜD")
returnvalueSouth = shadingStart.apply(gRollladenSouth)
return;
}
}
//Azimuth ist größer als 65° (OST)
if (returnvalueEast == false) {
if ((Azimuth.state as Number).floatValue > (closingAzimuth_east) && (Azimuth.state as Number).floatValue < (closingAzimuth_south)) {
if (log) logInfo (filename, logPrefix + "Abschatung für Rollläden OST")
returnvalueEast = shadingStart.apply(gRollladenEast)
return;
}
}
} else {
if (log) logInfo(filename, logPrefix + "Abschattung ist deaktiviert, oder es ist Nacht.")
}
end
//------------- Abschattung beenden --------------------
rule "Abschattung beenden"
when
Time cron "0/45 * * * * ?" or
Item Elevation changed
then
if (AutoShading_end.state == ON && IsDay.state == ON) {
val String logPrefix = "Abschattung deaktivieren - "
var String timeNow = now.toString().substring(0,10)
var String timeLastEnde = AutoShading_End_last.state.toString().substring(0,10)
if (timeLastEnde == timeNow) {
if (log) logInfo(filename, logPrefix + "Beende, da heute bereits ein automatisches Hochfahren stattfand")
return;
}
if ((localCurrentTemperature.state as Number).floatValue > (AutoShading_Temp_raise.state as Number)) {
if (log) logInfo(filename, logPrefix + "Beende, aktuelle Temperatur (" + localCurrentTemperature.state.toString() + ") ueberschreitet den eingestellten Grenzwert zum hochfahren von (" + AutoShading_Temp_raise.state.toString()+ ") ")
return;
}
if ((Elevation.state as Number) > (AutoShading_Elevation_end.state as Number)) {
if (log) logInfo(filename, logPrefix + "Beende, aktuelle Elevation (" + Elevation.state.toString() + ") ueberschreitet den eingestellten Grenzwert von (" + AutoShading_Elevation_end.state.toString()+ ") ")
return;
}
if (returnvalueWest == false && returnvalueEast == false && returnvalueSouth == false) {
if (log) logInfo(filename, logPrefix + "Beende, da heute noch keine automatische Abschattung stattfand")
return;
}
if (returnvalueWest == true || returnvalueEast == true || returnvalueSouth == true) {
// Rollladen öffnen
if (log) logInfo(filename, logPrefix + "Rollladen werden geoeffnet")
gRollladen.allMembers.forEach[blind|
if((blind.state as Number).intValue == targetHights.get(blind.name.toString()).intValue) {
if (log) logInfo(filename, logPrefix + "Oeffne Rollladen: " + blind.name.toString())
blind.sendCommand(UP)
//Pushnachricht versenden
sendPushoverMessage(pushoverBuilder("Abschattung für (" + blind.name.toString() + ") beendet, Rollladen wird geöffnet."))
} else {
if (log) logInfo(filename, 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
returnvalueWest = false
returnvalueEast = false
returnvalueSouth = false
}
}
end
Hoffe das hilft dem einen oder anderen weiter oder dient als Gedankenanstoß. Bei Fragen...immer raus damit
CYA
Cyrelian