Code: Alles auswählen
import java.util.Map
var Boolean message = true
val String filename = "rolladensteuerung.rules"
// Values und Variablen für die Verschattung
//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 = 20
val Number cloudHysteresis = 45 //die Mindestbewölkung in der letzten Stunde
var Number openingTemperature = 22
var Number closingTemperature = 24
val Number temperatureHysteresis = 4 //Temperaturabfall von min. 4 Grad in der letzten Stunde
val Number minPrecip = 5 //die Mindestmenge an Regen in der letzten Stunde
// Test
var Number TestRain = 0
var Number TestClouds = 0
// Test Ende
var Boolean isActiveWest = false
var Boolean isActiveEast = false
var Boolean isActiveSouth = false
//var Boolean isActiveBalkon = false
val String logPrefix = "Rollläden - "
/* ------------- Verschattung FUNKTIONEN --------------------
*/
//------------- Verschattung starten --------------------
val shadingStart = [GroupItem shutter |
val String logPrefix = "Verschattung aktivieren - "
val Map<String, Number> targetHights = newHashMap (
"EG_Gaestezimmer_Rollo" -> 50,
"EG_Wohnzimmer_Rollo" -> 50,
"Jalousie_Wohnzimmer_3M1" -> 100,
"Jalousie_Esszimmer_West_4M1" -> 100,
"Jalousie_Esszimmer_West_4M2" -> 100,
"Jalousie_Esszimmer_Sued_4M3" -> 100,
"Jalousie_Esszimmer_Sued_4M4" -> 100,
"Lamelle_Esszimmer_Sued_4M3" -> 100,
"Lamelle_Esszimmer_Sued_4M4" -> 100,
"Jalousie_Kueche_5M1" -> 50,
"Rollo_OG_Bad_Osten" -> 50,
"Rollo_OG_Kind2_Sueden" -> 50,
"Rollo_OG_Kind2_Osten" -> 50,
"Rollo_OG_Buero" -> 50,
"Rollo_OG_Kind1_Westen" -> 45,
"Rollo_OG_Kind1_Sueden" -> 50
)
// Rollladen werden geschlossen
logInfo("rules", logPrefix + "Grenzwert wurden erreicht, Rollladen werden geschlossen")
shutter.allMembers.forEach[ blind |
if ((blind.state as Number) < targetHights.get(blind.name.toString()).intValue) {
logInfo("rules", 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("Verschattung für " + blind.name.toString + " aktiviert, schließen auf " + targetHights.get(blind.name.toString()).toString() + " %"))
} else {
logInfo("rules", 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;
]
//------------- Verschattung beenden -------------------
val shadingEnd = [GroupItem shutter |
val String logPrefix = "Verschattung deaktivieren - "
val Map<String, Number> targetHights = newHashMap (
"EG_Gaestezimmer_Rollo" -> 0,
"EG_Wohnzimmer_Rollo" -> 0,
"Jalousie_Wohnzimmer_3M1" -> 0,
"Lamelle_Esszimmer_West_4M1" -> 50,
"Lamelle_Esszimmer_West_4M2" -> 50,
"Lamelle_Esszimmer_Sued_4M3" -> 50,
"Lamelle_Esszimmer_Sued_4M4" -> 50,
"Jalousie_Kueche_5M1" -> 0,
"Rollo_OG_Bad_Osten" -> 0,
"Rollo_OG_Kind2_Sueden" -> 0,
"Rollo_OG_Kind2_Osten" -> 0,
"Rollo_OG_Buero" -> 0,
"Rollo_OG_Kind1_Westen" -> 0,
"Rollo_OG_Kind1_Sueden" -> 0
)
// 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."))
} 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
isActiveWest = false
isActiveEast = false
isActiveSouth = false
return true;
]
/* ------------- Verschattung RULES --------------------
*/
//------------- Verschattung starten --------------------
rule "Verschattung starten"
when
Item SunAzimut changed
then
val String logPrefix = "Verschattung aktivieren - "
//Prüfung auf: Verschattungsautomatik an / ob es Tag ist / Jahreszeit
if (AutoShading.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;
}
if (AutoShading_Start_last.state == NULL) {
logInfo("rules", logPrefix + "Letzte Ausführung unbekannt, Belegung mit Initialwert (-1 Tag)")
AutoShading_Start_last.postUpdate(now.minusDays(1).toString())
}
//Markisenautomatik
// if (!isActiveBalkon) {
// //Azimuth ist größer als 181° (WEST)
// if ((Azimuth.state as Number) > (closingAzimuth_west)) {
// if ((BalkonTemperatursensor_Temperature.state as Number).floatValue > (AutoShading_Temp_min.state as Number) && (OW_localCurrentCloudiness.state as Number).floatValue < (AutoShading_Cloudiness_max.state as Number)) {
// logInfo("rules", logPrefix + "Markise Balkon")
// gBalkonRollladen.sendCommand(UP)
// AutoShadingM_Start_last.postUpdate(now.toString())
// isActiveBalkon = true;
// }
// }
// } else {
// logInfo("rules", logPrefix + "Verschattung für Balkon bereits aktiviert")
// }
//Rollladenautomatik
//if (gPresence.state != OFF) {
// logInfo("rules", logPrefix + "Verschattung (Rollläden) wird nicht ausgeführt, Anwesenheit erkannt.")
// return;
//}
// Items für Sitemap füllen
if(AutoShading_Azimuth_east.state == NULL) AutoShading_Azimuth_east.postUpdate(closingAzimuth_east)
if(AutoShading_Azimuth_south.state == NULL) AutoShading_Azimuth_south.postUpdate(closingAzimuth_south)
if(AutoShading_Azimuth_west.state == NULL) AutoShading_Azimuth_west.postUpdate(closingAzimuth_west)
if(AutoShading_Temp_diff.state == NULL) AutoShading_Temp_diff.postUpdate(temperatureHysteresis)
if(AutoShading_Cloudiness_Hyst.state == NULL) AutoShading_Cloudiness_Hyst.postUpdate(cloudHysteresis)
if(AutoShading_Rain_min.state == NULL) AutoShading_Rain_min.postUpdate(minPrecip)
if ((Temperaturen_aussen.state as Number).floatValue <= (AutoShading_Temp_min.state as Number)) {
logInfo("rules", logPrefix + "Verschattung (Rollläden) wird nicht ausgeführt, Mindesttemperatur von ({}) wurde nicht erreicht. Aktuelle Temperatur ({}) ", AutoShading_Temp_min.state, Temperaturen_aussen.state)
return;
}
if ((Weather_OWM_Cloudiness.state as Number).floatValue > (AutoShading_Cloudiness_max.state as Number)) {
logInfo("rules", logPrefix + "Verschattung (Rollläden) wird nicht ausgeführt, Aktuelle Bewoelkung ({}) ueberschreitet den eingestellten Grenzwert von ({})", Weather_OWM_Cloudiness.state, AutoShading_Cloudiness_max.state)
return;
}
if ((SunElevation.state as Number) <= (AutoShading_Elevation_end.state as Number)) {
logInfo("rules", logPrefix + "Verschattung (Rollläden) wird nicht ausgeführt, Elevation für das Beenden der Verschattung ({}) ist groesser als aktuelle ({}) ", AutoShading_Elevation_end.state, SunElevation.state)
return;
}
//Azimuth ist größer als 181° (WEST)
if (!isActiveWest) {
if ((SunAzimut.state as Number).floatValue > (closingAzimuth_west)) {
logInfo("rules", logPrefix + "Verschattung für Rollläden WEST")
isActiveWest = shadingStart.apply(gRollos_W)
return;
}
} else {
logInfo("rules", logPrefix + "Verschattung für Rollläden WEST bereits aktiviert")
}
//Azimuth ist größer als 111° (SÜD)
if (!isActiveSouth) {
if ((SunAzimut.state as Number).floatValue > (closingAzimuth_south) && (SunAzimut.state as Number).floatValue < (closingAzimuth_west)) {
logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD")
isActiveSouth = shadingStart.apply(gRollos_S)
return;
}
} else {
logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD bereits aktiviert")
}
//Azimuth ist größer als 65° (OST)
if (!isActiveEast) {
if ((SunAzimut.state as Number).floatValue > (closingAzimuth_east) && (SunAzimut.state as Number).floatValue < (closingAzimuth_south)) {
logInfo("rules", logPrefix + "Verschattung für Rollläden OST")
isActiveEast = shadingStart.apply(gRollos_O)
return;
}
} else {
logInfo("rules", logPrefix + "Verschattung für Rollläden OST bereits aktiviert")
}
end
//------------- Verschattung beenden --------------------
rule "Verschattung beenden"
when
Item SunElevation 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 = (Weather_OWM_Rain.maximumSince(now.minusHours(1), "influxdb").state >= (minPrecip))
//Test
TestRain = Weather_OWM_Rain.maximumSince(now.minusHours(1), "influxdb").state as Number
TestClouds = (Weather_OWM_Cloudiness.averageSince(now.minusHours(1), "influxdb") as Number)
// Test Ende
logInfo("rules", logPrefix + "Rain " + isRainLastHour)
//Test
logInfo("rules", logPrefix + "Rain2 " + TestRain)
logInfo("rules", logPrefix + "Clouds2 " + TestClouds )
// Test Ende
val Boolean isCloudLastHour = (Weather_OWM_Cloudiness.averageSince(now.minusHours(1), "influxdb")as Number >= (cloudHysteresis))
logInfo("rules", logPrefix + "Clouds " + isCloudLastHour )
val Boolean isTemperature = ((Temperaturen_aussen.state as Number).intValue < (Temperaturen_aussen.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) {
logInfo("rules", logPrefix + "Beende, da heute bereits ein automatisches Hochfahren stattfand")
return;
}
if (!isActiveWest && !isActiveEast && !isActiveSouth) {
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)
AutoShading_End_last.postUpdate(now.toString())
// AutoShadingM_End_last.postUpdate(now.toString())
shadingEnd.apply(gRollos)
return;
}
if ((Temperaturen_aussen.state as Number).floatValue > (AutoShading_Temp_raise.state as Number)) {
logInfo("rules", logPrefix + "Beende, aktuelle Temperatur ({})° ueberschreitet den eingestellten Grenzwert zum hochfahren von ({})°",Temperaturen_aussen.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)
//gBalkonRollladen.sendCommand(DOWN)
AutoShading_End_last.postUpdate(now.toString())
// AutoShadingM_End_last.postUpdate(now.toString())
shadingEnd.apply(gRollos)
return;
}
if ((SunElevation.state as Number) > (AutoShading_Elevation_end.state as Number)) {
logInfo("rules", logPrefix + "Beende, aktuelle Elevation ({}) ueberschreitet den eingestellten Grenzwert von ({}) ", SunElevation.state, AutoShading_Elevation_end.state)
return;
}
// if (isActiveBalkon) {
// logInfo("rules", logPrefix + "Verschattung Balkon beenden")
// gBalkonRollladen.sendCommand(DOWN)
// AutoShadingM_End_last.postUpdate(now.toString())
// }
if (isActiveWest || isActiveEast || isActiveSouth ) {
logInfo("rules", logPrefix + "Verschattung Rollläden beenden")
shadingEnd.apply(gRollos)
return;
}
end
/* ------------- Verschattung Variablen zurücksetzen wenn kein automtisches hochfahren erfolgt --------------------
*/
rule "Verschattung Variablen zurücksetzen"
when
Time cron "0 0 23 * * ?" or
Channel 'astro:sun:home:nauticDusk#event' triggered END
then
logInfo("rules", logPrefix + "Verschattung Variablen zurücksetzen")
isActiveWest = false
isActiveEast = false
isActiveSouth = false
// isActiveBalkon = false
end
rule "Verschattung Variablen update"
when
Item Shading_Var received command
then
logInfo("rules", "Verschattung Variablen: " + receivedCommand)
switch (receivedCommand) {
case "queryState" : {
logInfo("rules", logPrefix + "Verschattung Variablen update")
if (isActiveWest) {
logInfo("rules", logPrefix + "Verschattung für Rollläden WEST aktiv")
} else {
logInfo("rules", logPrefix + "Verschattung für Rollläden WEST inaktiv")
}
if (isActiveEast) {
logInfo("rules", logPrefix + "Verschattung für Rollläden OST aktiv")
} else {
logInfo("rules", logPrefix + "Verschattung für Rollläden OST inaktiv")
}
if (isActiveSouth) {
logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD aktiv")
} else {
logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD inaktiv")
}
// if (isActiveBalkon) {
// logInfo("rules", logPrefix + "Verschattung für Markise (Balkon) aktiv")
// } else {
// logInfo("rules", logPrefix + "Verschattung für Markise (Balkon) inaktiv")
// }
}
case "reset" : {
logInfo("rules", logPrefix + "Verschattung Variablen reset")
isActiveWest = false
isActiveEast = false
isActiveSouth = false
// isActiveBalkon = false
}
}
Shading_Var.postUpdate(NULL)
end