Seite 8 von 26
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 18. Apr 2020 11:45
von PeterA
Hi Cyrelian,
hätte auch noch mal eine Frage zur Wolkenmenge:
Derzeit verwende ich in meiner Rule nur die aktuelle Wolkenmenge als eine der Bedingungen zur Verschattung:
Code: Alles auswählen
if (LocalWeatherAndForecast_Current_Cloudiness.state <= Integer::parseInt(Rolloautomatik_Sued_wolken_max.state.toString())) { if (Elevation.state > Integer::parseInt(Rolloautomatik_Sued_elevation_ende.state.toString())) {
Würde es Sinn machen aus der aktuellen und der vorhergesagten (in 3h) Wolkenmenge einen Average zu Bilden und diesen Wert als "Ist" Wert zu nehmen ?
Falls ja, wie sähe hier der Code aus.
Gruß Peter
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 18. Apr 2020 20:24
von PeterA
Ok habe hier im Thread ja etwas dazu gefunden.
Habe nun die Zeile so versucht zu erweitern:
Code: Alles auswählen
if (LocalWeatherAndForecast_Current_Cloudiness.averageSince(now.minusMinutes(30)) <= Integer::parseInt(Rolloautomatik_Sued_wolken_max.state.toString())) { if (Elevation.state > Integer::parseInt(Rolloautomatik_Sued_elevation_ende.state.toString())) {
Hier gibt aber VScode folgende Fehlermeldung aus:
Code: Alles auswählen
Ambiguous binary operation.
The operator declarations
operator_lessEqualsThan(Number, Number) in NumberExtensions and
operator_lessEqualsThan(Type, Number) in NumberExtensions
both match.
Das
wird im VScode makiert
??? Stehe auf dem Schlauch....
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 18. Apr 2020 22:59
von int5749
Hallo zusammen,
nun habe ich den Threat 3x gelesen und schaue, wie ich dies für mich verwenden kann. Das Ganze sieht SEHR gut aus und berücksichtigt schon mehr als ich dies bei mir mache, derzeit ignoriere ich z.B. die Wolken oder Temp. Abfall (aber egel für meine Frage

)
Bei mir fahren die Rollladen derzeit nacheinander in Abhängigkeit zum Azimut/Elevation auch wieder hoch.
Sprich ich schaue direkt am Morgen, ob Ost hoch fährt oder nur Licht rein lässt (Schlitze auf), der Rest fährt hoch damit die Pflanzen Licht bekommen

Kurz bevor die Sonne um die Ecke kommt, fährt Süden runter.
Wenn dann die Sonne um die Ecke rum ist, fährt Osten hoch
usw.
Beim hoch/runter fahren habe ich unterschiedliche Schwellwerte für unterschiedliche Temp.
Derzeit brauche ich dafür noch 3 Rules (1x pro Hausseite).
Frage: Wenn ich das derzeit richtig verfolgt habe, ist diese gesonderte hoch/runter fahren pro Seite so noch nicht implementiert? Oder ich habe es nicht gefunden

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 19. Apr 2020 06:35
von udo1toni
PeterA hat geschrieben: ↑18. Apr 2020 20:24
Hier gibt aber VScode folgende Fehlermeldung aus:
Code: Alles auswählen
Ambiguous binary operation.
The operator declarations
operator_lessEqualsThan(Number, Number) in NumberExtensions and
operator_lessEqualsThan(Type, Number) in NumberExtensions
both match.
Das
wird im VScode makiert
??? Stehe auf dem Schlauch....
Vermutlich wirst Du einen bestimmten Typ erzwingen müssen. Deine Monsterzeile wird dadurch nicht besser lesbar werden, weshalb ich es hier mal mit Hilfskonstanten mache:
Code: Alles auswählen
val nCloud = (LocalWeatherAndForecast_Current_Cloudiness.averageSince(now.minusMinutes(30))) as Number
val nMax = (Integer::parseInt(Rolloautomatik_Sued_wolken_max.state.toString())) as Number
if(nCloud <= nMax) {
Was mich etwas irritiert, ist das Integer::parseInt(Item.state.toString). Wozu soll das gut sein? Wenn Item.state eine Zahl enthält, so sollte man diese auch direkt verwenden können. Oder handelt es sich schon um String Items?
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 19. Apr 2020 20:33
von Cyrelian
PeterA hat geschrieben: ↑18. Apr 2020 11:45
Hi Cyrelian,
hätte auch noch mal eine Frage zur Wolkenmenge:
Derzeit verwende ich in meiner Rule nur die aktuelle Wolkenmenge als eine der Bedingungen zur Verschattung:
Code: Alles auswählen
if (LocalWeatherAndForecast_Current_Cloudiness.state <= Integer::parseInt(Rolloautomatik_Sued_wolken_max.state.toString())) { if (Elevation.state > Integer::parseInt(Rolloautomatik_Sued_elevation_ende.state.toString())) {
Würde es Sinn machen aus der aktuellen und der vorhergesagten (in 3h) Wolkenmenge einen Average zu Bilden und diesen Wert als "Ist" Wert zu nehmen ?
Falls ja, wie sähe hier der Code aus.
Gruß Peter
Hi Peter,
das hatte ich auch mal probiert. Das Resultat ist aber nicht wirklich zufriedenstellend, da der Forecast der Wolken bei den Wetterdiensten nicht wirklich zuverlässig ist. Mittlerweile nutze ich die Wetterdaten von Dark Sky, Meteoblue, Weather binding und OpenWeatherMap.
Zu dem Code:
ich würde folgendes versuchen:
Da würde ich die beiden Werte reinpacken. Dann solltest du den durchschnittlichen Wert erhalten.
Oder du machst das via Rule.
Code: Alles auswählen
var avgCloud = (cloudNow.state as DecimalType + CloudCast.state as DecimalType) / 2
Cloud.postUpdate(avgCloud)
CU
Cyrelian
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 19. Apr 2020 20:35
von Cyrelian
int5749 hat geschrieben: ↑18. Apr 2020 22:59
Frage: Wenn ich das derzeit richtig verfolgt habe, ist diese gesonderte hoch/runter fahren pro Seite so noch nicht implementiert? Oder ich habe es nicht gefunden
Hi,
korrekt, aber das könnte man relativ einfach implementieren.
CU
Cyrelian
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 19. Apr 2020 22:05
von int5749
Cyrelian hat geschrieben: ↑19. Apr 2020 20:35
korrekt, aber das könnte man relativ einfach implementieren.
Ja, mit ein wenig umbauen sollte dies gehen

Derzeit fährst Du bei einem bestimmten Azimuth zu Rollladen runter und bei einer Elevation wieder hoch.
Elevation würde dann ja "nur" noch für die letzte Seite zum tragen kommen, der Rest müsste auch bei gewissen Azimuth Werten hoch fahren.
Habe meine Rule noch einmal geprüft und fahre doch schon alles in einer Rule. Mal sehen, was ich da zusammenführen kann
VG
int5749
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 21. Apr 2020 07:26
von PeterA
Cyrelian hat geschrieben: ↑19. Apr 2020 20:33
PeterA hat geschrieben: ↑18. Apr 2020 11:45
Hi Cyrelian,
hätte auch noch mal eine Frage zur Wolkenmenge:
Derzeit verwende ich in meiner Rule nur die aktuelle Wolkenmenge als eine der Bedingungen zur Verschattung:
Code: Alles auswählen
if (LocalWeatherAndForecast_Current_Cloudiness.state <= Integer::parseInt(Rolloautomatik_Sued_wolken_max.state.toString())) { if (Elevation.state > Integer::parseInt(Rolloautomatik_Sued_elevation_ende.state.toString())) {
Würde es Sinn machen aus der aktuellen und der vorhergesagten (in 3h) Wolkenmenge einen Average zu Bilden und diesen Wert als "Ist" Wert zu nehmen ?
Falls ja, wie sähe hier der Code aus.
Gruß Peter
Hi Peter,
das hatte ich auch mal probiert. Das Resultat ist aber nicht wirklich zufriedenstellend, da der Forecast der Wolken bei den Wetterdiensten nicht wirklich zuverlässig ist. Mittlerweile nutze ich die Wetterdaten von Dark Sky, Meteoblue, Weather binding und OpenWeatherMap.
Zu dem Code:
ich würde folgendes versuchen:
Da würde ich die beiden Werte reinpacken. Dann solltest du den durchschnittlichen Wert erhalten.
Oder du machst das via Rule.
Code: Alles auswählen
var avgCloud = (cloudNow.state as DecimalType + CloudCast.state as DecimalType) / 2
Cloud.postUpdate(avgCloud)
CU
Cyrelian
Hi Cyrelian,
danke für die Infos. Meteoblue scheint mir für meine Region ganz gut zu passen.
Meteoblue kostet aber ? Und in der Bindingdoku habe ich keine Wolkenmenge gefunden ?
Gruß Peter
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 21. Apr 2020 19:26
von steinigel
Hallo,
ich habe den Code aus dem Beispiel verwendet, leider löst die Regel nicht aus.
Alle Jalousien sind der Gruppe gBlind zugeordnet.
Weiss jemand Rat?
Danke für Eure Hilfe.
Carsten
Code: Alles auswählen
rule "Jalousienautomatik"
var String timeLast = 'xxxx-xx-xx'
if (Rolloautomatik_start_last.state == NULL) {
if (log) logInfo('rules', logPrefix + 'Erstmalige Ausführung am System, Belegung mit Initialwert')
} else {
timeLast = Rolloautomatik_start_last.state.toString().substring(0,10)
}
var String timeNow = now.toString().substring(0,10)
if (Rolloautomatik.state == ON) {
if (timeNow != timeLast) {
if (Azimuth.state > Integer::parseInt(Rolloautomatik_azimuth_start.state.toString())) {
if ((Temperature.state as number).floatValue > (Rolloautomatik_temp_min.state as number)) {
if (Clouds.state <= Integer::parseInt(Rolloautomatik_wolken_max.state.toString())) { if (Elevation.state > Integer::parseInt(Rolloautomatik_elevation_ende.state.toString())) {
// Rollos runterfahren
if (log) logInfo('rules', logPrefix + 'Rollos werden abgefahren')
gBlind.members.forEach[i|
if (i.state <= Integer::parseInt(Rolloautomatik_zielwert.state.toString())) {
if (log) logInfo('rules', logPrefix + 'Fahre Rolladen auf ' + Rolloautomatik_zielwert.state.toString() + '%: ' + i.name)
i.sendCommand(Integer::parseInt(Rolloautomatik_zielwert.state.toString()))
} else {
if (log) logInfo('rules', logPrefix + 'Rolladen ist bereits weiter geschlossen (' + i.state.toString() + '%) als er geschlossen werden sollte und wird daher ignoriert')
}
]
// Letzte Ausführung mit entsprechendem Zeitstempel belegen
sendBroadcastNotification("Verschattung aktiv") //Pushnachricht
Rolloautomatik_start_last.postUpdate(now.toString())
} else {
if (log) logInfo('rules', logPrefix + 'Elevation für wieder abfahren (' + Rolloautomatik_elevation_ende.state.toString() + ') ist groesser als aktuelle (' + Elevation.state.toString() + ')')
}
} else {
if (log) logInfo('rules', logPrefix + 'Mindestbewoelkung (' + Rolloautomatik_wolken_max.state.toString() + ') wurde unterschritten (' + Clouds.state.toString() + ')')
}
} else {
if (log) logInfo('rules', logPrefix + 'Mindest-Temperatur (' + Rolloautomatik_temp_min.state.toString() + ') wurde nicht erreicht durch aktuelle Temperatur (' + Temperature.state.toString() + ')')
}
} else {
if (log) logInfo('rules', logPrefix + 'Azimuth (' + Azimuth.state.toString() + ') hat noch nicht Schwellwert (rolloautomatik_azimuth_start.state.toString()) erreicht')
}
} else {
if (log) logInfo('rules', logPrefix + 'Automatik heute bereits einmal gelaufen, wird daher ignoriert')
}
} else {
if (log) logInfo('rules', logPrefix + 'Beende, da Automatik generell nicht aktiv')
}
end
rule "Rollo wieder öffnen"
when Item Elevation changed
then
val String logPrefix = 'Rolloautomatik (Rollo hoch) - '
if (log) logInfo('rules', logPrefix + 'Regel wurde gestartet')
var String timeLastEnde = 'xxxx-xx-xx'
if (Rolloautomatik_ende_last.state == NULL) {
if (log) logInfo('rules', logPrefix + 'Erstmalige Ausführung am System, Belegung mit Initialwert')
} else {
timeLastEnde = Rolloautomatik_ende_last.state.toString().substring(0,10)
}
var String timeLastStart = 'yyyy-yy-yy'
if (Rolloautomatik_start_last.state == NULL) {
if (log) logInfo('rules', logPrefix + 'Erstmalige Ausführung am System, Belegung mit Initialwert')
} else {
timeLastStart = Rolloautomatik_start_last.state.toString().substring(0,10)
}
var String timeNow = now.toString().substring(0,10)
if (Rolloautomatik_oeffnen.state == ON) {
if (Elevation.state <= Integer::parseInt(Rolloautomatik_elevation_ende.state.toString())) {
if (timeLastStart == timeNow) {
if (timeLastEnde != timeNow) {
// Rollos wieder hoch
if (log) logInfo('rules', logPrefix + 'Rollos werden hinaufgefahren')
gBlind.members.forEach[i|
if((Rolloautomatik_zielwert.state as Number).intValue <= (i.state as Number).intValue +5 && (Rolloautomatik_zielwert.state as Number).intValue >= (i.state as Number).intValue -5) {
if (log) logInfo('rules', logPrefix + 'Fahre Rolladen auf 0%: ' + i.name)
i.sendCommand(0)
} else {
if (log) logInfo('rules', logPrefix + 'Fahre Rolladen nicht auf 0%, da dieser zwischenzeitlich manuell verändert wurde: ' + i.name)
}
]
// Letzte Ausführung mit entsprechendem Zeitstempel belegen
sendBroadcastNotification("Verschattung beendet") //Pushnachricht
Rolloautomatik_ende_last.postUpdate(now.toString())
} else {
if (log) logInfo('rules', logPrefix + 'Beende, da heute bereits ein automatisches Wiederhochfahren stattfand')
}
} else {
if (log) logInfo('rules', logPrefix + 'Beende, da heute noch keine Ausführung stattfand. Demzufolge kann auch kein automatisches Öffnen gewollt sein')
}
} else {
if (log) logInfo('rules', logPrefix + 'Beende, da Elevation (' + Elevation.state.toString() + ') nicht kleiner der eingestellten Elevation (' + Rolloautomatik_elevation_ende.state.toString()+ ') war')
}
} else {
if (log) logInfo('rules', logPrefix + 'Beende, da Automatik generell nicht aktiv')
}
end
Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen
Verfasst: 21. Apr 2020 20:02
von udo1toni
In der ersten Rule fehlt direkt der Trigger-Teil. Das Schlüsselwort when ist nicht optional!
Weiterhin die dringende Bitte: dieses if (log) logInfo(...) ist kompletter Bullshit!
Wenn man das Logging abschlaten will, so geht das zur Laufzeit über die Karaf Konsole mittels log:set <LOGLEVEL> org.openhab.model.script.<loggername>. Es ist echt unnötig, dafür eine Variable und eine bedingte Verzweigung zu nutzen.
Und dann hier mal ein Integer::parseInt(state.toString), dort ein .state as Number... etwas Kontinuität täte dem Code gut.