[gelöst] Rollläden über Datum oder Astro steuern

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
scotty
Beiträge: 676
Registriert: 28. Apr 2020 04:44
Answers: 0

Re: Rollläden über Datum steuern

Beitrag von scotty »

udo1toni hat geschrieben: 5. Aug 2020 19:55 ... Man kann übrigens nicht nur einen Offset (positiv oder negativ) setzen, man kann auch frühestmögliche und spätestmögliche Ausführung setzen.
Weiterhin gibt es pro Richtung 4 verschiedene Events, nämlch Sonnenauf/-untergang (0°), Bürgerliche (-6°), Nautische (-12°) und Astronomische (-18°) Dämmerung.
Allgemein gibt es bei großen Offsets meist einen anderen Trigger, der viel näher am eigentlich gewünschten Zeitpunkt liegt.
Die Dämmerungsphasen sind ja auch für die Astrofotografie nicht unwichtig. Ich wüsste allerdings nicht, wie ich sie jetzt für meinen Zweck verwenden sollte.

Aber Danke bis hier hin noch einmal, damit kann ich schon etwas anfangen.
OH 3.4.5 im Docker auf Synology DS918+ mit USV, Reolink-RLC-511WA, Philips Hue, AVM Fritz!Box 6591C, Alexa, Logitech Harmony und diversen Shelly's

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

Re: Rollläden über Datum steuern

Beitrag von udo1toni »

Na, meine Rollläden lasse ich z.B. nach der bürgerlichen Dämmerung fahren, mit einem relativ kleinen Offset von 15 bzw. 10 Minuten (Untergang/Aufgang). Ich wüsste nicht, warum ich da auf Sonnenauf/-untergang mit 50 Minuten Offset gehen sollte, nur darum ging es mir.
openHAB5.0.0 stable in einem Debian-Container (bookworm) (Proxmox 9.0.3, LXC)

JuergenA
Beiträge: 39
Registriert: 22. Jul 2020 19:15
Answers: 0

Re: Rollläden über Datum steuern

Beitrag von JuergenA »

Udo, ich habe gerade mal geschaut, der Auf und Untergang der Sonne ist doch der späteste Zeitpunkt nach der Dämmerung. Zumindest zeigt er mir das in den berechneten Variablen an. Oder übersehe ich gerade etwas?

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

Re: Rollläden über Datum steuern

Beitrag von udo1toni »

Nein, siehe meinen vorherigen Post. Sonne auf/Untergang ist bei Höhenwinkel 0°, die verschiedenen Dämmerungsstufen bi -6°, -12° und -18° Höhenwinkel (der Sonne). Die astronomische Dämmerung ist dann, wenn bei klarem Himmel alle Sterne sichtbar sind, Sonnenuntergang ist, wenn die Sonne den Horizont berührt und verschwindet.
Wenn die angezeigten Zeiten das anders widerspiegeln, hast Du entweder Offsets / früheste / späteste Ausführung gesetzt oder sonst einen kuriosen Fehler herbeigeführt.


Gesendet von iPad mit Tapatalk
openHAB5.0.0 stable in einem Debian-Container (bookworm) (Proxmox 9.0.3, LXC)

Benutzeravatar
scotty
Beiträge: 676
Registriert: 28. Apr 2020 04:44
Answers: 0

Re: Rollläden über Datum steuern

Beitrag von scotty »

Mit freundlicher und intensiver Unterstützung des Users JuergenA konnte ich inzwischen eine Regel installieren, nach der sich zum Beginn eines jeden Monats die Uhrzeit des Runterfahrens meiner Rollläden ändert. Zur Ermittlung des aktuellen Monats ist die zweite Regel "Monatsberechnung" erforderlich.
Seit etwa 5 Wochen teste ich diese Variante und habe festgestellt, dass es zwischendurch doch noch nötig wird, die Werte zu korrigieren. Trotzdem möchte ich den Code jetzt veröffentlichen damit ihn einerseits interessierte User übernehmen können bzw. andererseits u. U. zusätzliche Ideen zur Optimierung einfließen.

Code: Alles auswählen

rule "Monatsberechnung"

when

    Time cron "0 0 0 1 * ? *" or
    System started

then

    val currMonth = now.getMonthOfYear

    Month.postUpdate(currMonth.toString)

end

//------------------------------------------------------------------------
//    Rollladen Aufwärts, jeden Tag ausser Donnerstag 
//------------------------------------------------------------------------
rule "Aufwärts ohne Do"
when 
    Time cron "0 15 9 ? * SUN,MON,TUE,WED,FRI,SAT *"
then
    logInfo("Aufwärts ohne Do", "Rollladen fahren hoch!")
    gAlleShutters.sendCommand(0)
end

//------------------------------------------------------------------------
//    Rollladen Aufwärts, nur Donnerstag 
//------------------------------------------------------------------------
rule "Aufwärts nur Do"
when 
    Time cron "0 0 8 ? * THU *"
then
    logInfo("Aufwärts nur Do", "Rollladen fahren hoch")
    gAlleShutters.sendCommand(0)
end

//------------------------------------------------------------------------
//    Rollladen Abwärts, jeden Tag
//------------------------------------------------------------------------
rule "Rollladen runter"
when 
    Time cron "0 30 17 ? * SUN,MON,TUE,WED,THU,FRI,SAT *"
then 
    if (Month.state == 1 || Month.state == 12)
    {     
        logInfo("Abwärts", "Rollladen fahren runter!")
        gAlleShutters.sendCommand(100)
    }

    else if (Month.state == 2)
    {
        createTimer(now.plusMinutes(20))
            [|
                logInfo("Abwärts", "Rollladen fahren runter!")
                gAlleShutters.sendCommand(100)
            ]
    }

    else if (Month.state == 3 || Month.state == 10)
    {
        createTimer(now.plusMinutes(107))
            [|
                logInfo("Abwärts", "Rollladen fahren runter!")
                gAlleShutters.sendCommand(100)
            ]
    }

    else if (Month.state == 4)
    {
        createTimer(now.plusMinutes(180))
            [|
                logInfo("Abwärts", "Rollladen fahren runter!")
                gAlleShutters.sendCommand(100)
            ]
    }

    else if (Month.state == 5 || Month.state == 8)
    {
        createTimer(now.plusMinutes(220))
            [|
                logInfo("Abwärts", "Rollladen fahren runter!")
                gAlleShutters.sendCommand(100)
            ]
    }

    else if (Month.state == 6)
    {
        createTimer(now.plusMinutes(260))
            [|
                logInfo("Abwärts", "Rollladen fahren runter!")
                gAlleShutters.sendCommand(100)
            ]
    }

    else if (Month.state == 7)
    {
        createTimer(now.plusMinutes(250))
            [|
                logInfo("Abwärts", "Rollladen fahren runter!")
                gAlleShutters.sendCommand(100)
            ]
    }

    else if (Month.state == 9)
    {
        createTimer(now.plusMinutes(185))
            [|
                logInfo("Abwärts", "Rollladen fahren runter!")
                gAlleShutters.sendCommand(100)
            ]
    }

    else if (Month.state == 11)
    {
        createTimer(now.plusMinutes(30))
            [|
                logInfo("Abwärts", "Rollladen fahren runter!")
                gAlleShutters.sendCommand(100)
            ]
    }  
end

OH 3.4.5 im Docker auf Synology DS918+ mit USV, Reolink-RLC-511WA, Philips Hue, AVM Fritz!Box 6591C, Alexa, Logitech Harmony und diversen Shelly's

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

Re: [gelöst]Rollläden über Datum steuern

Beitrag von udo1toni »

Also, Deine Mühen in allen Ehren, aber die Rule "Monatsberechnung" berauchst Du allenfalls, wenn Du den Monat in der UI anzeigen willst (und das geht über ein DateTime Item wesentlich einfacher).

Deine Time cron Ausdrücke sind ebenfalls etwas gewöhnungsbedürftig.
Und was die Log Meldungen betrifft, möchte ich auhc hier darauf hinweisen, dass der erste zu übergebende String ein Teil des Loggernamens ist.
Dein Code ist außerdem extrem aufgeblasen. Natürlich könnte es sein, dass Du monatlich andere Schließhöhen haben willst, aber selbst das wäre einfacher zu erreichen. Deshalb hier die gleiche Funktion:

Code: Alles auswählen

//------------------------------------------------------------------------
//    Rollladen Aufwärts, jeden Tag (Donnerstag andere Zeit)
//------------------------------------------------------------------------
rule "Aufwärts"
when 
    Time cron "0 15 9 ? * MON-WED,FRI-SUN" or
    Time cron "0 0 8 ? * THU"
then
    logInfo("shutters", "Rollläden fahren hoch!")
    gAlleShutters.sendCommand(0)
end

//------------------------------------------------------------------------
//    Rollladen Abwärts, jeden Tag
//------------------------------------------------------------------------
rule "Rollladen runter"
when 
    Time cron "0 30 17 ? * *"
then 
    var Integer iOffset = 0
    switch(now.getMonthOfYear) {
        case  2: iOffset =  20
        case  3: iOffset = 107
        case  4: iOffset = 180
        case  5: iOffset = 220
        case  6: iOffset = 260
        case  7: iOffset = 250
        case  8: iOffset = 220
        case  9: iOffset = 185
        case 10: iOffset = 107
        case 11: iOffset =  30
    }
        createTimer(now.plusMinutes(iOffset), [|
            logInfo("shutter", "Rollladen fahren runter!")
            gAlleShutters.sendCommand(100)
        ])
end
Bis auf die fehlende Unterscheidung der Loggermeldung zwischen Donnerstag und nicht Donnerstag sollten die Rules das gleiche bewirken.
openHAB5.0.0 stable in einem Debian-Container (bookworm) (Proxmox 9.0.3, LXC)

Benutzeravatar
scotty
Beiträge: 676
Registriert: 28. Apr 2020 04:44
Answers: 0

Re: [gelöst]Rollläden über Datum steuern

Beitrag von scotty »

Wow, ich bin erstaunt und begeistert zugleich, wie professionell du die rule optimiert hast. Vielleicht gelingt mir das ja auch irgend wann mal so. Getestet habe ich noch nicht, aber gleich noch 2 Fragen dazu:

1.) Ich vermisse die Monate 1 und 12, muss da noch etwas ergänzt werden?

2.) wenn iOffset zwischendurch mal korrigiert werden muss (etwa zur Monatsmitte), greife ich momentan immer händisch ein und ändere die rule. Hast du vielleicht eine Idee wie man das intelligenter lösen könnte?
OH 3.4.5 im Docker auf Synology DS918+ mit USV, Reolink-RLC-511WA, Philips Hue, AVM Fritz!Box 6591C, Alexa, Logitech Harmony und diversen Shelly's

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

Re: [gelöst]Rollläden über Datum steuern

Beitrag von udo1toni »

:)

Zu 1: Ich definiere iOffset als Integer mit dem Wert 0. Da für Januar und Dezember kein Offset angegeben ist, passt der Wert 0. Natürlich kannst Du auch zwei case Anweisungen für diese beiden Fälle definieren. Der Timer kann auch direkt ausgeführt werden (also now.plusMinutes(0)), das spielt keine Rolle.

Zu 2: Das ist eben das Problem, wenn man den Offset von einem Wert abhängig macht, der dafür eigentlich nicht geeignet ist. ;) Die einfachste Wariante wäre, statt getMonthOfYear getDayOfYear zu verwenden. Du kannst dafür ebenfalls switch - case verwenden, allerdings in anderer Form:

Code: Alles auswählen

val Integer iDOY = now.getDayOfYear
switch (true) {
    case iDOY >   0 && iDOY <  16: iOffset =   0 // von 1. bis 15. Januar
    case iDOY >  15 && iDOY <  35: iOffset =  20 // von 16. Januar bis  3. Februar
    ...
}
Du musst also jeweils Unter- und Obergrenze setzen.

Aber wie oben schon erwähnt, wäre es das Einfachste, die in Astro integrierten Funktionen zu nutzen. Egal, welchen Trigger man nutzt, ob nun Sonnen-/auf/unter/-gang (0° Sonnenhöhe), Bürgerliche Dämmerung (-6°), Nautische Dämmerung (-12°) oder gar Astronomische Dämmerung (-18°), das Astro Addon steuert die Läden jederzeit bei einer ähnlichen Helligkeit. Zusätzlich lassen sich Ober- und Untergrenzen sowie ein Offset zum errechneten Zeitpunkt setzen, also z.B. 12 Minuten vor der Bürgerlichen Dämmerung oder 17 Minuten nach Sonnenuntergang.
openHAB5.0.0 stable in einem Debian-Container (bookworm) (Proxmox 9.0.3, LXC)

Benutzeravatar
scotty
Beiträge: 676
Registriert: 28. Apr 2020 04:44
Answers: 0

Re: [gelöst]Rollläden über Datum steuern

Beitrag von scotty »

Vielen Dank für deine Antwort. So ganz habe ich deinen letzten Code allerdings noch nicht verstanden. Wie geht es denn dort, wo Du die "..." gesetzt hast, weiter? Ich würde gerne diesen Code mal testen und falls dann noch erhebliche Differenzen zum Tageslicht auftreten, kann ich mich immer noch der Astro-Variante anschließen. Wahrscheinlich bräuchte ich in dem Fall dann aber auch noch einmal Hilfe.

Ich habe aber auch noch eine andere Idee im Kopf, die ich wenigstens einmal ansprechen möchte. Wie wäre es, wenn für das Forum neben den bekannten Gruppierungen eine weitere Sparte "Beispiele" eingerichtet würde? Hier könnten dann unter einer aussagekräftigen Überschrift fertige Beispiele wie dieses abgelegt werden. Wobei ich offen lassen möchte, ob im Anschluss der Themen noch diskutiert werden soll. Im englischen Forum, meine ich, ist es ähnlich aufgebaut.

Edit: Um die Sparte "Beispiele" übersichtlich zu gestalten, könnten auftretende Diskussionen über eine Link im "Hauptthema" geführt werden.
OH 3.4.5 im Docker auf Synology DS918+ mit USV, Reolink-RLC-511WA, Philips Hue, AVM Fritz!Box 6591C, Alexa, Logitech Harmony und diversen Shelly's

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

Re: [gelöst]Rollläden über Datum steuern

Beitrag von udo1toni »

Die ... stehen stellvertretend für alle weiteren Wertezuordnungen, die Zeilen sind bis auf die jeweiligen Werte identisch zu den zwei vorhergehenden Zeilen.
openHAB5.0.0 stable in einem Debian-Container (bookworm) (Proxmox 9.0.3, LXC)

Antworten