Guten Morgen Cyrelian,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
könntest du eventuell deine benötigten Items einmal teilen ?
oder sind die aus den älteren beiträgen hier noch aktuell ?
LG
Florian