Erstmal vielen herzlichen Dank an ALLE die hier mitgewirkt haben, eine MEGA Projekt !!!
Habe sehr lange auf sowas gewartet und ich glaube ich bin kurz davor, dass es auch funktioniert
Code: Alles auswählen
// Values und Variablen für die Verschattung
//val Number blindClosed = 100
//val Number blindOpen = 0
//val Number blindTranslucent = 35
import java.util.Map
var Number closingAzimuth_east = 85
var Number closingAzimuth_south = 111
var Number closingAzimuth_west = 171
var Number closingAzimuth_north = 260
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
var boolean isActiveNorth = false
/* ------------- Verschattung FUNKTIONEN --------------------
*/
//------------- Verschattung starten --------------------
val shadingStart = [GroupItem shutter |
val String logPrefix = "Verschattung aktivieren - "
//var boolean log = true
val Map<String, Number> targetHights = newHashMap (
"Shutter_EG_Office" -> 74,
"Shutter_EG_Wohnen3" -> 64,
"Shutter_EG_Kueche2" -> 40,
"Shutter_EG_Wohnen1" -> 78,
"Shutter_EG_Wohnen2" -> 78,
"Shutter_EG_Technik" -> 73,
"Shutter_OG_HWR" -> 74
//"KuecheRollladenTuer" -> 58,
//"SchlafzimmerRollladenTuer" -> 100,
//"BadezimmerRollladen" -> 55,
//"WohnzimmerRollladenEsstisch" -> 65,
//"WohnzimmerRollladenTuer" -> 68,
//"WohnzimmerRollladenBalkon" -> 100
)
// Temperature.state wird durch weatherN_Temperature ausgetauscht !!! insgesamt 4x
//if ((Temperature.state as Number).floatValue <= (AutoShading_Temp_min.state as Number)) {
if ((weatherN_Temperature.state as Number).floatValue <= (AutoShading_Temp_min.state as Number)) {
//logInfo ("Lambda", logPrefix + "Mindesttemperatur von (" + AutoShading_Temp_min.state.toString() + ") wurde nicht erreicht. Aktuelle Temperatur (" + Temperature.state.toString() + ")")
logInfo ("Lambda", logPrefix + "Mindesttemperatur von ({}) wurde nicht erreicht. Aktuelle Temperatur ({}) ", AutoShading_Temp_min.state, weatherN_Temperature.state)
return false;
}
if ((Clouds.state as Number).floatValue > (AutoShading_Cloudiness_max.state as Number)) {
//logInfo ("Lambda", logPrefix + "Aktuelle Bewoelkung (" + Clouds.state.toString() + ") ueberschreitet den eingestellten Grenzwert von (" + AutoShading_Cloudiness_max.state.toString() + ")")
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)) {
//logInfo ("Lambda", logPrefix + "Elevation für das Beenden der Verschattung (" + AutoShading_Elevation_end.state.toString() + ") ist groesser als aktuelle (" + Elevation.state.toString() + ")")
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
logInfo("Lambda", logPrefix + "Grenzwerte 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() + " %"))
sendTelegram("bot1","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 (
"Shutter_EG_Office" -> 74,
"Shutter_EG_Wohnen3" -> 64,
"Shutter_EG_Kueche2" -> 40,
"Shutter_EG_Wohnen1" -> 78,
"Shutter_EG_Wohnen2" -> 78,
"Shutter_EG_Technik" -> 73,
"Shutter_OG_HWR" -> 74
//"KuecheRollladenTuer" -> 58,
//"SchlafzimmerRollladenTuer" -> 100,
//"BadezimmerRollladen" -> 55,
//"WohnzimmerRollladenEsstisch" -> 65,
//"WohnzimmerRollladenTuer" -> 68,
//"WohnzimmerRollladenBalkon" -> 100
//"KuecheRollladenTuer" -> 58,
//"SchlafzimmerRollladenTuer" -> 100,
//"BadezimmerRollladen" -> 55,
//"WohnzimmerRollladenEsstisch" -> 65,
//"WohnzimmerRollladenTuer" -> 68,
//"WohnzimmerRollladenBalkon" -> 100
)
// Rollladen öffnen
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."))
sendTelegram("bot1", "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
isActiveNorth = 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.state == ON && IsDay.state == ON) && (Jahreszeit.state=="SPRING" || Jahreszeit.state=="SUMMER")) {
if (AutoShading_Start_last.state === NULL) {
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_north == "NULL" ){
//AutoShading_Azimuth_east.postUpdate(closingAzimuth_west)
AutoShading_Azimuth_east.postUpdate(closingAzimuth_east)
AutoShading_Azimuth_south.postUpdate(closingAzimuth_south)
AutoShading_Azimuth_west.postUpdate(closingAzimuth_west)
AutoShading_Azimuth_north.postUpdate(closingAzimuth_north)
AutoShading_Temp_diff.postUpdate(temperatureHysteresis)
AutoShading_Cloudiness_Hyst.postUpdate(cloudHysteresis)
AutoShading_Rain_min.postUpdate(minPrecip)
}
//Azimuth ist größer als 270° (NORD)
if (!isActiveNorth) {
if ((Azimuth.state as Number).floatValue > (closingAzimuth_north)) {
logInfo ("rules", logPrefix + "Verschattung für Rollläden NORD")
isActiveNorth = shadingStart.apply(gRollladenNorth)
return;
}
} else {
logInfo ("rules", logPrefix + "Verschattung für Rollläden NORD bereits aktiviert")
}
//Azimuth ist größer als 181° (WEST)
if (!isActiveWest) {
//if ((Azimuth.state as Number).floatValue > (closingAzimuth_west)) {
if ((Azimuth.state as Number).floatValue > (closingAzimuth_west) && (Azimuth.state as Number).floatValue < (closingAzimuth_north)) {
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")
}
} else {
//logInfo("rules", logPrefix + "Verschattung wird nicht ausgeführt, da einer der folgenden Parameter matched: Verschattung deakiviert, es ist Nacht, Herbst oder Winter oder Anwesenheit erkannt.")
logInfo("rules", logPrefix + "Verschattung wird nicht ausgeführt, da einer der folgenden Parameter matched: Verschattung deakiviert, es ist Nacht, Herbst oder Winter 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))
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) {
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) {
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)
shadingEnd.apply(gRollladen)
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)
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 (isActiveWest || isActiveEast || isActiveSouth ) {
logInfo ("rules", 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 (isActiveNorth == true || isActiveWest == true || isActiveEast == true || isActiveSouth == true) {
isActiveNorth = false
isActiveWest = false
isActiveEast = false
isActiveSouth = false
}
end