klar, kein Thema. here you go
Code: Alles auswählen
// 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
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
/* ------------- Verschattung FUNKTIONEN --------------------
*/
//------------- Verschattung starten --------------------
val shadingStart = [GroupItem shutter |
val String logPrefix = "Verschattung aktivieren - "
var boolean log = true
val Map<String, Number> targetHights = newHashMap (
"KuecheRollladenTuer" -> 58,
"SchlafzimmerRollladenTuer" -> 100,
"BadezimmerRollladen" -> 55,
"WohnzimmerRollladenEsstisch" -> 65,
"WohnzimmerRollladenTuer" -> 68,
"WohnzimmerRollladenBalkon" -> 100
)
if ((Temperature.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 (" + Temperature.state.toString() + ")")
if (log) logInfo ("Lambda", logPrefix + "Mindesttemperatur von ({}) wurde nicht erreicht. Aktuelle Temperatur ({}) ", AutoShading_Temp_min.state, Temperature.state)
return false;
}
if ((Clouds.state as Number).floatValue > (AutoShading_Cloudiness_max.state as Number)) {
//if (log) logInfo ("Lambda", logPrefix + "Aktuelle Bewoelkung (" + Clouds.state.toString() + ") ueberschreitet den eingestellten Grenzwert von (" + AutoShading_Cloudiness_max.state.toString() + ")")
if (log) logInfo ("Lambda", logPrefix + "Aktuelle Bewoelkung ({}) ueberschreitet den eingestellten Grenzwert von ({})", Clouds.state, AutoShading_Cloudiness_max.state)
return false;
}
if ((Elevation.state as Number) <= (AutoShading_Elevation_end.state as Number)) {
//if (log) logInfo ("Lambda", logPrefix + "Elevation für das Beenden der Verschattung (" + AutoShading_Elevation_end.state.toString() + ") ist groesser als aktuelle (" + Elevation.state.toString() + ")")
if (log) logInfo ("Lambda", logPrefix + "Elevation für das Beenden der Verschattung ({}) ist groesser als aktuelle ({}) ", AutoShading_Elevation_end.state, Elevation.state)
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("Verschattung 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;
]
//------------- Verschattung beenden -------------------
val shadingEnd = [GroupItem shutter |
val String logPrefix = "Verschattung deaktivieren - "
var boolean log = true
val Map<String, Number> targetHights = newHashMap (
"KuecheRollladenTuer" -> 58,
"SchlafzimmerRollladenTuer" -> 100,
"BadezimmerRollladen" -> 55,
"WohnzimmerRollladenEsstisch" -> 65,
"WohnzimmerRollladenTuer" -> 68,
"WohnzimmerRollladenBalkon" -> 100
)
// Rollladen öffnen
if (log) logInfo ("Lambda", logPrefix + "Rollladen werden geoeffnet")
shutter.allMembers.forEach[blind|
if((blind.state as Number).intValue == targetHights.get(blind.name).intValue) {
logInfo ("Lambda", 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 ("Lambda", 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 / Präsenz / Jahreszeit
if ((AutoShading.state == ON && IsDay.state == ON) && (DinesiPhone_Presence.state == OFF && OllisiPhone_Presence.state == OFF) && (Jahreszeit.state=="SPRING" || Jahreszeit.state=="SUMMER")) {
if (AutoShading_Start_last.state === NULL) {
if (log) logInfo(logPrefix, 'Letzte Ausführung unbekannt, Belegung mit Initialwert (-1 Tag)')
AutoShading_Start_last.postUpdate(now.minusDays(1).toString())
}
//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)
AutoShading_Temp_diff.postUpdate(temperatureHysteresis)
AutoShading_Cloudiness_Hyst.postUpdate(cloudHysteresis)
AutoShading_Rain_min.postUpdate(minPrecip)
}
//Azimuth ist größer als 181° (WEST)
if (!isActiveWest) {
if ((Azimuth.state as Number).floatValue > (closingAzimuth_west)) {
if (log) logInfo (filename, logPrefix + "Verschattung für Rollläden WEST")
isActiveWest = shadingStart.apply(gRollladenWest)
return;
}
} else {
if (log) logInfo (filename, 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)) {
if (log) logInfo (filename, logPrefix + "Verschattung für Rollläden SÜD")
isActiveSouth = shadingStart.apply(gRollladenSouth)
return;
}
} else {
if (log) logInfo (filename, 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)) {
if (log) logInfo (filename, logPrefix + "Verschattung für Rollläden OST")
isActiveEast = shadingStart.apply(gRollladenEast)
return;
}
} else {
if (log) logInfo (filename, logPrefix + "Verschattung für Rollläden OST bereits aktiviert")
}
} else {
if (log) logInfo(filename, logPrefix + "Verschattung wird nicht ausgeführt, da einer der folgenden Parameter matched: Verschattung deakiviert, es ist Nacht, Herbst oder Winter oder Anwesenheit erkannt.")
}
end
//------------- Verschattung beenden --------------------
rule "Verschattung beenden"
when
Item Elevation changed
then
if ((AutoShading_end.state == ON && IsDay.state == ON) && (Jahreszeit.state=="SPRING" || Jahreszeit.state=="SUMMER")) {
val String logPrefix = "Verschattung deaktivieren - "
val boolean isRainLastHour = (Rain.maximumSince(now.minusHours(1), "influxdb").state >= (minPrecip))
if (log) logInfo(filename, logPrefix + "Rain " + isRainLastHour)
val boolean isCloudLastHour = (Clouds.averageSince(now.minusHours(1), "influxdb")as Number >= (cloudHysteresis))
if (log) logInfo(filename, logPrefix + "Clouds " + isCloudLastHour )
val boolean isTemperature = ((Temperature.state as Number).intValue < (Temperature.minimumSince(now.minusHours(1), "influxdb").state as DecimalType -(temperatureHysteresis)))
if (log) logInfo(filename, logPrefix + "Temperatur " + isTemperature)
if (AutoShading_End_last.state === NULL) {
if (log) logInfo(logPrefix, "Letzte Ausführung unbekannt, Belegung mit Initialwert (-1 Tag)")
AutoShading_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)
if (timeLastEnde == timeNow) {
if (log) logInfo(filename, logPrefix + "Beende, da heute bereits ein automatisches Hochfahren stattfand")
return;
}
if (!isActiveWest && !isActiveEast && !isActiveSouth) {
if (log) logInfo(filename, logPrefix + "Beende, da heute noch keine automatische Verschattung stattfand")
return;
}
if (isTemperature) {
if (log) logInfo (filename, logPrefix + "Verschattung beenden, Temperaturabfall von min. ({})° erkannt", temperatureHysteresis)
shadingEnd.apply(gRollladen)
return;
}
if ((Temperature.state as Number).floatValue > (AutoShading_Temp_raise.state as Number)) {
if (log) logInfo(filename, logPrefix + "Beende, aktuelle Temperatur ({})° ueberschreitet den eingestellten Grenzwert zum hochfahren von ({})°",Temperature.state, AutoShading_Temp_raise.state )
return;
}
if (isRainLastHour || isCloudLastHour) {
if (log) logInfo (filename, logPrefix + "Verschattung beenden, Mindestregenmenge von ({}) mm oder druchschnittliche Bewölkung von ({}) % erreicht",minPrecip, cloudHysteresis)
shadingEnd.apply(gRollladen)
return;
}
if ((Elevation.state as Number) > (AutoShading_Elevation_end.state as Number)) {
if (log) logInfo(filename, logPrefix + "Beende, aktuelle Elevation ({}) ueberschreitet den eingestellten Grenzwert von ({}) ", Elevation.state, AutoShading_Elevation_end.state)
return;
}
if (isActiveWest || isActiveEast || isActiveSouth ) {
if (log) logInfo (filename, logPrefix + "Verschattung beenden")
shadingEnd.apply(gRollladen)
return;
}
}
end
/* ------------- Verschattung Variablen zurücksetzen wenn kein automtisches hochfahren erfolgt --------------------
*/
rule "Verschattung Variablen zurücksetzen"
when
Time cron "15 59 23 * * ?"
then
if (isActiveWest == true || isActiveEast == true || isActiveSouth == true) {
isActiveWest = false
isActiveEast = false
isActiveSouth = false
}
end
Code: Alles auswählen
Frame item=gRollladen label="Rollladensteuerung"{
Switch item=gRollladen label="Alle Rollläden" mappings=[UP="Hoch", STOP="X", DOWN="Runter"]
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"]
}
Frame label="Verschattung starten, wenn..." {
Setpoint item=AutoShading_Temp_min minValue=18 maxValue=40 step=1
Text item=Temperature valuecolor=[>27="red",>20="orange",>10="purple",>5="green",<=5="blue"]
Setpoint item=AutoShading_Cloudiness_max minValue=0 maxValue=100 step=5
Text item=Clouds
//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
}
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
}