hier der letzte Stand, verfeinert mit euren Ideen .
ITEMS:
Code: Alles auswählen
/* ------------- Rollladensteuerung --------------------
*/
// ------------- Manuell --------------------
Switch ManualShading "Manuelle Verschattung an/aus" (gInitializeOff)
String Shading_Var "Verschattungsvariablen" <time> (gShading)
// ------------- Automatic --------------------
Switch AutoShading "Automatische Verschattung" (gShading,gInitializeOn)
Switch AutoShading_end "Rollladen automatisch öffnen" (gShading,gInitializeOn)
Number AutoShading_Temp_min "Temperatur größer [%d °C]" <temperature> (gShading)
Number AutoShading_Temp_raise "Temperatur zum hochfahren der Rollladen [%d °C]" <temperature> (gShading)
Number AutoShading_Temp_diff "Temperaturunterschied der letzten Stunde [- %d °C]" <temperature> (gShading)
Number AutoShading_Cloudiness_max "Bewölkung weniger als [%d Prozent]" <sun_clouds> (gShading)
Number AutoShading_Cloudiness_Hyst "Durchschn. Bewölkung der letzten Stunde größer gleich [%d Prozent]" <sun_clouds> (gShading)
Number AutoShading_Rain_min "Mindestregenmenge der letzten Stunde größer gleich [%.2f mm/h]" <sun_clouds> (gShading)
Number AutoShading_Azimuth_east "Sonnenrichtung / Azimuth (Ost) größer gleich [%d °]" <compass> (gShading)
Number AutoShading_Azimuth_south "Sonnenrichtung / Azimuth (Süd) größer gleich [%d °]" <compass> (gShading)
Number AutoShading_Azimuth_west "Sonnenrichtung / Azimuth (West) größer gleich [%d °]" <compass> (gShading)
Number AutoShading_Elevation_end "Sonnenhöhe / Elevation kleiner gleich [%d °]" <niveau> (gShading)
DateTime AutoShading_Start_last "Letzte Ausführung (Rollladen ab) [%1$td.%1$tm %1$tH:%1$tM Uhr]" <time> (gShading)
DateTime AutoShading_End_last "Letzte Ausführung (Rollladen hoch) [%1$td.%1$tm %1$tH:%1$tM Uhr]" <time> (gShading)
DateTime AutoShadingM_Start_last "Letzte Ausführung (Markisen ausfahren) [%1$td.%1$tm %1$tH:%1$tM Uhr]" <time> (gShading)
DateTime AutoShadingM_End_last "Letzte Ausführung (Markiesen einfahren) [%1$td.%1$tm %1$tH:%1$tM Uhr]" <time> (gShading)
Code: Alles auswählen
import java.util.Map
var Boolean message = true
val String filename = "shutter.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
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 (
"KuecheRollladenTuer" -> 58,
"SchlafzimmerRollladenTuer" -> 100,
"BadezimmerRollladen" -> 55,
"WohnzimmerRollladenEsstisch" -> 65,
"WohnzimmerRollladenTuer" -> 68,
"WohnzimmerRollladenBalkon" -> 100,
"GaesteWCRollladen_Slider" -> 100,
"BueroRollladen" -> 100
)
// 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 (
"KuecheRollladenTuer" -> 58,
"SchlafzimmerRollladenTuer" -> 100,
"BadezimmerRollladen" -> 55,
"WohnzimmerRollladenEsstisch" -> 65,
"WohnzimmerRollladenTuer" -> 68,
"WohnzimmerRollladenBalkon" -> 100,
"GaesteWCRollladen_Slider" -> 100,
"BueroRollladen" -> 100
)
// 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 Azimuth 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 ((OW_localCurrentTemperature.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, OW_localCurrentTemperature.state)
return;
}
if ((OW_localCurrentCloudiness.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 ({})", OW_localCurrentCloudiness.state, AutoShading_Cloudiness_max.state)
return;
}
if ((Elevation.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, Elevation.state)
return;
}
//Azimuth ist größer als 181° (WEST)
if (!isActiveWest) {
if ((Azimuth.state as Number).floatValue > (closingAzimuth_west)) {
logInfo("rules", logPrefix + "Verschattung für Rollläden WEST")
isActiveWest = shadingStart.apply(gRollladenWest)
return;
}
} else {
logInfo("rules", logPrefix + "Verschattung für Rollläden WEST bereits aktiviert")
}
//Azimuth ist größer als 111° (SÜD)
if (!isActiveSouth) {
if ((Azimuth.state as Number).floatValue > (closingAzimuth_south) && (Azimuth.state as Number).floatValue < (closingAzimuth_west)) {
logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD")
isActiveSouth = shadingStart.apply(gRollladenSouth)
return;
}
} else {
logInfo("rules", logPrefix + "Verschattung für Rollläden SÜD bereits aktiviert")
}
//Azimuth ist größer als 65° (OST)
if (!isActiveEast) {
if ((Azimuth.state as Number).floatValue > (closingAzimuth_east) && (Azimuth.state as Number).floatValue < (closingAzimuth_south)) {
logInfo("rules", logPrefix + "Verschattung für Rollläden OST")
isActiveEast = shadingStart.apply(gRollladenEast)
return;
}
} else {
logInfo("rules", logPrefix + "Verschattung für Rollläden OST bereits aktiviert")
}
end
//------------- Verschattung beenden --------------------
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 = (OW_localCurrentRainVolume.maximumSince(now.minusHours(1), "influxdb").state >= (minPrecip))
logInfo("rules", logPrefix + "Rain " + isRainLastHour)
val Boolean isCloudLastHour = (OW_localCurrentCloudiness.averageSince(now.minusHours(1), "influxdb")as Number >= (cloudHysteresis))
logInfo("rules", logPrefix + "Clouds " + isCloudLastHour )
val Boolean isTemperature = ((gTemperaturesOut.state as Number).intValue < (gTemperaturesOut.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 (!isActiveWest && !isActiveEast && !isActiveSouth && !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 ((gTemperaturesOut.state as Number).floatValue > (AutoShading_Temp_raise.state as Number)) {
logInfo("rules", logPrefix + "Beende, aktuelle Temperatur ({})° ueberschreitet den eingestellten Grenzwert zum hochfahren von ({})°",gTemperaturesOut.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)
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 (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(gRollladen)
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
Code: Alles auswählen
Frame item=gRollladen label="Rollladensteuerung"{
Switch item=gRollladen label="Alle Rollläden" mappings=[UP="▲", STOP="X", DOWN="▼"]
Text item=gShading label="Automatische Verschattung" icon="rollershutter" {
Frame label="Verschattung aktivieren/deaktivieren" {
Switch item=AutoShading mappings=[ON="An", OFF="Aus"]
Switch item=AutoShading_end mappings=[ON="An", OFF="Aus"]
Switch item=Shading_Var mappings=[queryState="Query STATE", reset="Reset"]
}
Frame label="Verschattung starten, wenn..." {
Setpoint item=AutoShading_Temp_min minValue=18 maxValue=40 step=1
Text item=gTemperaturesOut valuecolor=[>27="red",>20="orange",>10="purple",>5="green",<=5="blue"]
Setpoint item=AutoShading_Cloudiness_max minValue=0 maxValue=100 step=5
Text item=gCloudiness
//Text item=AutoShading_Azimuth_east //minValue=45 maxValue=110 step=5
//Text item=AutoShading_Azimuth_south //minValue=111 maxValue=180 step=5
//Text item=AutoShading_Azimuth_west //minValue=181 maxValue=340 step=5
Default item=Azimuth
Text item=AutoShading_Start_last
Text item=AutoShadingM_Start_last
}
Frame label="Verschattung beenden, wenn..." {
Setpoint item=AutoShading_Elevation_end minValue=-20 maxValue=60 step=1
Setpoint item=AutoShading_Temp_raise minValue=15 maxValue=30 step=1
Text item=AutoShading_Temp_diff
Text item=AutoShading_Cloudiness_Hyst
Text item=AutoShading_Rain_min
Default item=Elevation
Text item=AutoShading_End_last
Text item=AutoShadingM_End_last
}
Frame label="Statistik" {
Webview icon=none url="http://192.168.x.x:8080/static/chartTemperatureDay.html" height=28
}
}
Switch item=ShutterControll mappings=[ON="Auto", OFF="Manuell"]
Switch item=ManualShading mappings=[ON="An", OFF="Aus"]
}
Cyrelian