Code: Alles auswählen
//------------- Verschattung beenden -------------------
val shadingEnd = [GroupItem shutter |
val String logPrefix = "Verschattung deaktivieren - "
val Map<String, Number> targetHights = newHashMap (
"Shutter_EG_Office" -> 74, //4x EAST
"Shutter_OG_Gast2" -> 74,
"Shutter_OG_Flur" -> 77,
"Shutter_OG_Bad" -> 62,
"Shutter_EG_Wohnen3" -> 73, //3x SOUTH
"Shutter_OG_Eltern" -> 84,
"Shutter_OG_Gast1" -> 67,
"Shutter_EG_Kueche1" -> 10, //4 x WEST
"Shutter_EG_Kueche2" -> 40,
"Shutter_EG_Wohnen1" -> 78,
"Shutter_EG_Wohnen2" -> 78,
"Shutter_EG_GaesteBad" -> 63, //3x NORD
"Shutter_EG_Technik" -> 63,
"Shutter_OG_HWR" -> 64,
)
// 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
//sendPushoverMessage(pushoverBuilder("Verschattung für (" + blind.name.toString() + ") beendet, Rollladen wird geöffnet."))
sendTelegram("bot1","Verschattung für (" + blind.name.toString() + ") beendet, Rollladen wird auf " + targetHights.get(blind.name.toString()).toString() + "% " + "geöffnet.")
sendTelegram("bot2","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.toString())
//Variablen zurücksetzen
isActiveNorth = false
isActiveWest = false
isActiveSouth = false
isActiveEast = false
return true;
]
..................................................
rule "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 = (Rain.maximumSince(now.minusHours(1), "influxdb").state >= (minPrecip))
logInfo("rules", logPrefix + "Rain " + isRainLastHour)
val Boolean isCloudLastHour = (Clouds.averageSince(now.minusHours(1), "influxdb")as Number >= (cloudHysteresis))
logInfo("rules", logPrefix + "Clouds " + isCloudLastHour )
val Boolean isTemperature = ((weatherN_Temperature.state as Number).intValue < (weatherN_Temperature.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.minusDays(1).toString())
AutoShadingM_End_last.postUpdate(now.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 (!isActiveNorth && !isActiveWest && !isActiveSouth && !isActiveEast ) { //&& !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.toString())
shadingEnd.apply(gRollladen)
return;
}
if (isActiveEast) {
if ((Azimuth.state as Number).floatValue > (openingAzimuth_east1) && (Azimuth.state as Number).floatValue < (openingAzimuth_east2)) {
logInfo("rules", logPrefix + "Verschattung für Rollläden OST beenden")
shadingEnd.apply(gRollladenEast)
house_scene_sunprotection_east.postUpdate(OFF)
return;
}
}
if (isActiveSouth) {
if ((Azimuth.state as Number).floatValue > (openingAzimuth_south1) && (Azimuth.state as Number).floatValue < (openingAzimuth_south2)) {
logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD beenden")
shadingEnd.apply(gRollladenSouth)
house_scene_sunprotection_south.postUpdate(OFF)
return;
}
}
if ((weatherN_Temperature.state as Number).floatValue > (AutoShading_Temp_raise.state as Number)) {
logInfo("rules", logPrefix + "Beende, aktuelle Temperatur ({})° ueberschreitet den eingestellten Grenzwert zum hochfahren von ({})°",weatherN_Temperature.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)
AutoShadingM_End_last.postUpdate(now.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 (isActiveNorth || isActiveWest ) {
logInfo("rules", logPrefix + "Verschattung Rollläden WEST / NORD beenden")
//shadingEnd.apply(gRollladen)
shadingEnd.apply(gRollladenWest)
shadingEnd.apply(gRollladenNorth)
return;
}
end