Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag 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
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag 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....
- OpenHab 2.4
#PWRUP

int5749
Beiträge: 1161
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag 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 :D )

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 :?
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Benutzeravatar
udo1toni
Beiträge: 13955
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag 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?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag 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:

Code: Alles auswählen

Group:Number:AVG
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

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag 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

int5749
Beiträge: 1161
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag 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
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag 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:

Code: Alles auswählen

Group:Number:AVG
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
- OpenHab 2.4
#PWRUP

steinigel
Beiträge: 2
Registriert: 21. Apr 2020 19:23

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag 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

Benutzeravatar
udo1toni
Beiträge: 13955
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Elektrischen Rolladen abhängig von Sonnenstand und Wetter steuern lassen

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten