Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
-
- Beiträge: 3
- Registriert: 23. Apr 2021 16:41
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Danke noch mal für die Antworten.
Die Verschattung läuft nun.
Frage noch mal an die Wissenden. Muss in OH3 die Rule die ich über VSC eingefügt habe jeden Tag neu gestartet werden? Sie ist mit einem Schloss gesichert und ist nicht editierbar in OH3 sondern nur über VSC.
Grüße Maik
Die Verschattung läuft nun.
Frage noch mal an die Wissenden. Muss in OH3 die Rule die ich über VSC eingefügt habe jeden Tag neu gestartet werden? Sie ist mit einem Schloss gesichert und ist nicht editierbar in OH3 sondern nur über VSC.
Grüße Maik
-
- Beiträge: 1161
- Registriert: 4. Nov 2019 22:08
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Nein, eine Rule wird getriggert wenn die Eingangsparameter stimmen.
Die hat in OH3 ein Schloss. da diese für OH nur read-only ist. Wie alles andere auch, was nicht nativ in OH 3 Main UI erstellt wurde.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3
-
- Beiträge: 213
- Registriert: 16. Dez 2017 10:49
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Hallo in die Runde.Cyrelian hat geschrieben: ↑21. Jul 2020 20:57 Hi,
hier der letzte Stand, verfeinert mit euren Ideen .
ITEMS:CYACode: 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) ...
Cyrelian
Kurze frage: Ist der Post von Cyrelian die aktuellste Version, die auch in OH3 funktioniert, oder stehen auf den Folgeseiten noch Änderungen, die ich noch anpassen muß?
Sind schon viele verschiedene Beiträge und oft kann ich nicht erkennen, ob man die Rule in OH3 oder OH2.x einsetzt.
Der Post ist aus Juli 2020 (gab es da schon OH3 überhaupt), was bedeuten würde, das für OH3 bestimmt noch Änderungen gemacht werden müssen, oder?
Was für Änderungen sind das denn?
RPI4/8GB RAM mit openhabian (bullseye) - Kernel Linux 6.1.21-v8+ - openhab 4.0.2 - Release Build - HM-CCU3 - ZWave UZB-USB Stick - Wifi-LED-Stripes - Logitech Harmony Hub - AVM Fritzbox - Enigma2-Box - Gardena HUB - Fronius-Binding - Miele@Home
-
- Beiträge: 10
- Registriert: 6. Jun 2021 14:44
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Ich hab genau die selbe Frage wie Hoogle.Hoggle hat geschrieben: ↑6. Jun 2021 12:11Hallo in die Runde.Cyrelian hat geschrieben: ↑21. Jul 2020 20:57 Hi,
hier der letzte Stand, verfeinert mit euren Ideen .
ITEMS:CYACode: 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) ...
Cyrelian
Kurze frage: Ist der Post von Cyrelian die aktuellste Version, die auch in OH3 funktioniert, oder stehen auf den Folgeseiten noch Änderungen, die ich noch anpassen muß?
Sind schon viele verschiedene Beiträge und oft kann ich nicht erkennen, ob man die Rule in OH3 oder OH2.x einsetzt.
Der Post ist aus Juli 2020 (gab es da schon OH3 überhaupt), was bedeuten würde, das für OH3 bestimmt noch Änderungen gemacht werden müssen, oder?
Was für Änderungen sind das denn?
Bin gerade auf OH3 umgestiegen und habe meine Homematic Rolladenaktoren integriert und würde gerne diese geniale Lösung/Regel integrieren bin mir aber auch komplett unsicher welche Regeln jetzt die neuste OH3 fähige regel ist.
Würde mich freuen wenn uns da jemand aufklären/helfen könnte.
gruß,
salexes
- Cyrelian
- Beiträge: 601
- Registriert: 24. Sep 2015 17:55
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Hi salexes und Hoggle,
ja, das ist "fast" der "letzte" Stand. Meine rule läuft einwandfrei unter OH3. Das was ich angepasst habe war das:
- Versenden via Pushover (Änderung im Binding)
- "Zeitumstellung" Joda Time / Java time
ersetzt durch
An der Stelle hatte er mir nämlich nen Fehler geworfen.
Hier die ganze Rule:
CYA
Cyrelian
ja, das ist "fast" der "letzte" Stand. Meine rule läuft einwandfrei unter OH3. Das was ich angepasst habe war das:
- Versenden via Pushover (Änderung im Binding)
- "Zeitumstellung" Joda Time / Java time
Code: Alles auswählen
postUpdate(now.toString())
Code: Alles auswählen
postUpdate(now.toLocalDateTime().toString())
Hier die ganze Rule:
Code: Alles auswählen
import java.util.Map
var Boolean message = true
val actions = getActions("pushover", "pushover:pushover-account:openHAB")
var receipt = null
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
val actions = getActions("pushover", "pushover:pushover-account:openHAB")
var receipt = actions.sendMessage("Verschattung für " + blind.name.toString + " aktiviert, schließen auf " + targetHights.get(blind.name.toString()).toString() + " %", "openHAB")
//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.toLocalDateTime().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
val actions = getActions("pushover", "pushover:pushover-account:openHAB")
var receipt = actions.sendMessage("Verschattung für (" + blind.name.toString() + ") beendet, Rollladen wird geöffnet.", "openHAB")
//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.toLocalDateTime().toString())
//Variablen zurücksetzen
isActiveWest = false
isActiveEast = false
isActiveSouth = false
return true;
]
/* ------------- Verschattung RULES --------------------
*/
//------------- Verschattung starten --------------------
rule "Rollladenautomatik / Markisenautomatik - 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.toLocalDateTime.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.toLocalDateTime().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 "Markisenautomatik (Astro) - Verschattung beenden "
when
Item IsNight changed from OFF to ON
then
if (isActiveBalkon) {
logInfo("rules", logPrefix + "Verschattung Balkon beenden")
gBalkonRollladen.sendCommand(DOWN)
AutoShadingM_End_last.postUpdate(now.toLocalDateTime().toString())
}
end
rule "Rollladenautomatik / Markisenautomatik - 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.toLocalDateTime.minusDays(1).toString)
AutoShadingM_End_last.postUpdate(now.toLocalDateTime.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.toLocalDateTime().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.toLocalDateTime().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.toLocalDateTime().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
}
case "set" : {
logInfo("rules", logPrefix + "Verschattung Variablen set")
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)
}
}
Shading_Var.postUpdate(NULL)
end
Cyrelian
-
- Beiträge: 10
- Registriert: 6. Jun 2021 14:44
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Cyrelian hat geschrieben: ↑7. Jun 2021 09:28 Hi salexes und Hoggle,
ja, das ist "fast" der "letzte" Stand. Meine rule läuft einwandfrei unter OH3. Das was ich angepasst habe war das:
- Versenden via Pushover (Änderung im Binding)
- "Zeitumstellung" Joda Time / Java time
ersetzt durchCode: Alles auswählen
postUpdate(now.toString())
An der Stelle hatte er mir nämlich nen Fehler geworfen.Code: Alles auswählen
postUpdate(now.toLocalDateTime().toString())
Hier die ganze Rule:
CYACode: Alles auswählen
import java.util.Map var Boolean message = true val actions = getActions("pushover", "pushover:pushover-account:openHAB") var receipt = null 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 val actions = getActions("pushover", "pushover:pushover-account:openHAB") var receipt = actions.sendMessage("Verschattung für " + blind.name.toString + " aktiviert, schließen auf " + targetHights.get(blind.name.toString()).toString() + " %", "openHAB") //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.toLocalDateTime().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 val actions = getActions("pushover", "pushover:pushover-account:openHAB") var receipt = actions.sendMessage("Verschattung für (" + blind.name.toString() + ") beendet, Rollladen wird geöffnet.", "openHAB") //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.toLocalDateTime().toString()) //Variablen zurücksetzen isActiveWest = false isActiveEast = false isActiveSouth = false return true; ] /* ------------- Verschattung RULES -------------------- */ //------------- Verschattung starten -------------------- rule "Rollladenautomatik / Markisenautomatik - 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.toLocalDateTime.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.toLocalDateTime().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 "Markisenautomatik (Astro) - Verschattung beenden " when Item IsNight changed from OFF to ON then if (isActiveBalkon) { logInfo("rules", logPrefix + "Verschattung Balkon beenden") gBalkonRollladen.sendCommand(DOWN) AutoShadingM_End_last.postUpdate(now.toLocalDateTime().toString()) } end rule "Rollladenautomatik / Markisenautomatik - 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.toLocalDateTime.minusDays(1).toString) AutoShadingM_End_last.postUpdate(now.toLocalDateTime.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.toLocalDateTime().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.toLocalDateTime().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.toLocalDateTime().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 } case "set" : { logInfo("rules", logPrefix + "Verschattung Variablen set") 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) } } Shading_Var.postUpdate(NULL) end
Cyrelian
Genial danke für deine schnelle Antwort, werde die Rule gleich mal ausprobieren!
Eine Frage habe ich noch, ich will diese Lösung für meinen schon etwas älteren Vater einrichten, sodass er nicht immer alles händisch machen muss (er beschwert sich oft im Sommer das die Sonne das ganze Haus so aufheizt).
Ich denke dafür ist die Regel perfekt geeignet, nur ist es bei meinem Vater so das ihm sein schlaf heilig ist und daher zwischen 1 Uhr nachts und 8:30 morgens am besten keine lauten Rolladen aktiv sein sollten, gibt es die Möglichkeit das man vorausschauend ggf. schon um 1 Uhr nachts die Rolladen basierend auf den Voraussagen für den tag ggf. schon herunter zufahren, sodass wenn es morgens z.b. um 6 Uhr die Sonne eigentlich voll in den Raum scheinen würde die Rolladen schon unten wären.
Gruß,
salexes
- PeterA
- Beiträge: 1052
- Registriert: 8. Feb 2019 12:12
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
hi salexes,
die betreffenden Rollladen zu einer bestimmten Uhrzeit schliessen zu lassen ist ja nun einfach.
Da würde ich eine via Timecron getriggerte Rule erstellen welche dann zur gewünschten Uhrzeit die gewünschten Rollladen schliessen lässt.
Gruß
Peter
die betreffenden Rollladen zu einer bestimmten Uhrzeit schliessen zu lassen ist ja nun einfach.
Da würde ich eine via Timecron getriggerte Rule erstellen welche dann zur gewünschten Uhrzeit die gewünschten Rollladen schliessen lässt.
Gruß
Peter
- OpenHab 2.4
#PWRUP
#PWRUP
- Cyrelian
- Beiträge: 601
- Registriert: 24. Sep 2015 17:55
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Hi salexes,
da würden mir mehrere Ansätze einfallen.
Meine Rule fängt schon mal den Status "Nacht" ab.
Den Status hole ich mir so:
Hier kannst du mit den verschiedenen Events schonmal die Zeit relativ gut eingrenzen.
Via https://www.sonnenverlauf.de/ würde ich das ganze mal simulieren. Also den Sonnenstand.
Was den Forecast für den nächsten Tag/Morgen angeht sind die Daten relativ ungenau. Darauf würde ich mich nicht verlassen. Dann am besten die OST Seite einfach am Vorabend schließen.
CU
Cyrelian
da würden mir mehrere Ansätze einfallen.
Meine Rule fängt schon mal den Status "Nacht" ab.
Code: Alles auswählen
if (IsDay.state != ON) {
logInfo("rules", logPrefix + "Verschattung wird nicht ausgeführt, es ist Nacht.")
return;
}
Code: Alles auswählen
rule "IsDay"
when
Channel 'astro:sun:home:daylight#event' triggered START
then
IsDay.sendCommand(ON)
IsTwilight.sendCommand(OFF)
IsNight.sendCommand(OFF)
end
rule "IsTwilight"
when
Channel 'astro:sun:home:set#event' triggered END
then
IsDay.sendCommand(OFF)
IsTwilight.sendCommand(ON)
IsNight.sendCommand(OFF)
end
rule "IsNight"
when
Channel 'astro:sun:home:civilDusk#event' triggered END
then
IsDay.sendCommand(OFF)
IsTwilight.sendCommand(OFF)
IsNight.sendCommand(ON)
end
Via https://www.sonnenverlauf.de/ würde ich das ganze mal simulieren. Also den Sonnenstand.
Was den Forecast für den nächsten Tag/Morgen angeht sind die Daten relativ ungenau. Darauf würde ich mich nicht verlassen. Dann am besten die OST Seite einfach am Vorabend schließen.
CU
Cyrelian
-
- Beiträge: 317
- Registriert: 29. Okt 2020 19:53
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
@Cyrelian
Ich würde auch gerne deine Rule für meine Rolläden benutzen. Ich arbeite mich gerade ein, und möchte das ganze natürlich auch verstehen und muss es natürlich etwas anpassen.
Dazu hätte ich ein paar Fragen:
- wie heißen denn deine Rollo Items?
- wie und in welche Gruppen sind diese bei dir eingeteilt?
- Wofür gibt es zusätzlich zu dem Iterm "AutoShading" noch das Item "ManualShading"
- Das mit der Markise finde ich auch interessant. Ist die bei dir auf der Westseite? Was machst du da anders als bei den Rollos?
Sorry für die vielen Fragen.
Danke und Servus
Ich würde auch gerne deine Rule für meine Rolläden benutzen. Ich arbeite mich gerade ein, und möchte das ganze natürlich auch verstehen und muss es natürlich etwas anpassen.
Dazu hätte ich ein paar Fragen:
- wie heißen denn deine Rollo Items?
- wie und in welche Gruppen sind diese bei dir eingeteilt?
- Wofür gibt es zusätzlich zu dem Iterm "AutoShading" noch das Item "ManualShading"
- Das mit der Markise finde ich auch interessant. Ist die bei dir auf der Westseite? Was machst du da anders als bei den Rollos?
Sorry für die vielen Fragen.
Danke und Servus
Servus
- Cyrelian
- Beiträge: 601
- Registriert: 24. Sep 2015 17:55
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Hi,
also......
Mit dem ManualShading fahre ich einfach nur die Rollläden in eine bestimmt Postion.
Fall Du noch Fragen hast...einfach melden
CU
Cyrelian
also......
- wie heißen denn deine Rollo Items?
Code: Alles auswählen
Rollershutter BueroRollladen "Rollladen (Büro) [(%d %%) zu]" <rollershutter> (gBueroRollladenFenster,gBueroRollladen,gRollladenEast) ["Blinds"] {channel="homematic:HM-LC-Bl1-FM:HMIPCCU3RM:MEQXXXXX:1#LEVEL"}
- wie und in welche Gruppen sind diese bei dir eingeteilt?
Code: Alles auswählen
Group:Rollershutter gRollladen "Alle Rollläden" <rollershutter> (gWohnung)
Group:Rollershutter gRollladenEast "Rollläden (Ost)" <rollershutter> (gRollladen)
Group:Rollershutter gRollladenSouth "Rollläden (Süd)" <rollershutter> (gRollladen)
Group:Rollershutter gRollladenWest "Rollläden (West)" <rollershutter> (gRollladen)
Der AutoShading ist der Haupt-Switch. Ist der AUS, findet keine Beschattung statt.- Wofür gibt es zusätzlich zu dem Iterm "AutoShading" noch das Item "ManualShading"
Code: Alles auswählen
//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;
}
Code: Alles auswählen
rule "Manuelle Verschattung ein / aus"
when
Item ManualShading received command ON
then
logInfo("rules", "Manuelle Verschattung ein")
WohnzimmerRollladenEsstisch.sendCommand(60)
WohnzimmerRollladenTuer.sendCommand(60)
WohnzimmerRollladenBalkon.sendCommand(60)
BadezimmerRollladen.sendCommand(55)
SchlafzimmerRollladenTuer.sendCommand(DOWN)
GaesteWCRollladen_Slider.sendCommand(100)
KuecheRollladenTuer.sendCommand(58)
BueroRollladen.sendCommand(DOWN)
end
ja, diese ist auf der Westseite. Im Gegensatz zur Rollladenautomatik, fährt die Markise auch bei erkannter Anwesenheit raus.- Das mit der Markise finde ich auch interessant. Ist die bei dir auf der Westseite? Was machst du da anders als bei den Rollos?
Fall Du noch Fragen hast...einfach melden
CU
Cyrelian