Ankündigung

Einklappen
Keine Ankündigung bisher.

wenn die Tage länger werden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    wenn die Tage länger werden

    Hallo,

    jetzt, wo die Tage länger werden, wechselt bei manchen Regelungen die Anforderung bei mir von einer Zeitschaltung zu einer Dämmerung-Schaltung.

    z.B. bisher gingen um 18 Uhr die Jalousien runter
    in der helleren Jahreszeit sollen sie bei 150 Lux runter gehen.

    Es soll aber nur 1x pro Abend dieses Event ausgelöst werden.

    Nun möchte ich das mit einer fürs ganze Jahr gültigen Lösung schaffen.

    Sinngemäß: Frühestens um 18 Uhr und spätestens wenn die Helligkeit unter 150 Lux sinkt, soll einmalig die Jalousie runterfahren.

    Was haltet ihr für die beste Umsetzung?

    1. eine Zeitschaltregel und eine Helligkeits-Switch Regel, die beide den selben Script aufrufen zusammen mit einer Variable, in der erfasst ist, ob es an diesem Tag bereits ausgelöst wurde...

    2. eine Cron-Regel, die um 18 Uhr eine 5-Minuten-Loop startet, in der abhängig von der Helligkeit die Aktion ausgelöst wird und sich dann selbst beendet, sobald es dunkel genug ist.

    Oder gibt es da schon Beispiele?

    Michael

    #2
    Hallo,

    im Dropbox Share gibt es eine rule die den Sonnenuntergang berechnet. Ich steuere damit meine Jalousien, erweitert allerdings um ein Sperrobjekt das per Cron gesteuert wird ( damit im Sommer die Jalousien nicht zu früh hochgehen).

    Gruß Ansgat

    Kommentar


      #3
      Hallo Ansgat,

      danke, das schaue ich mir an.
      Ich habe auf dem Dach an der Wetterstation einen Helligkeits-Sensor und eine ganze Menge solcher Regeln - die nicht auf die selbe Helligkeit / Zeit reagieren.
      Die realen Werte habe ich daher in openHAB vorliegen.
      Daher reicht mir der Sonnenuntergang alleine nicht.

      Ich habe nur noch kein ideales Prinzip gefunden, Dinge zu programmieren, die auf mehr als 1 Ereignis reagieren.

      Michael

      Kommentar


        #4
        Hallo Michael,

        neben der bereits erwähnten Möglichkeit zur Berechnung des Sonnenauf und -untergangs (nehme ich derzeit nur als Information in der Visu) habe ich mir von meinem Helligkeitssensor eine GA erstellt die bei der Unterschreitung eines Wertes (bei Dir 150 Lux) auf ON geht => es ist Nacht

        Damit steuere ich dann meine Rollladen wie folgt:
        Code:
        [SIZE=2][COLOR=#7f0055]
        
        [B][SIZE=2][COLOR=#7f0055]rule
        [/COLOR][/SIZE][/B][/COLOR][/SIZE][LEFT][SIZE=2][COLOR=#000000]NightStarts[/COLOR][/SIZE]
        [LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]when[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#7f0055]
        [/COLOR][/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]Item[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] Night [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]changed[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#7f0055]
        [B][SIZE=2][COLOR=#7f0055]then[/COLOR][/SIZE][/B]
        [/COLOR][/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]if[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] (Night.state == ON) {[/SIZE]
        [SIZE=2]Bad_Rollo.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2](DOWN)[/SIZE]
        [SIZE=2]Terrasse_links_Fenster_Rollo.[/SIZE][/LEFT][SIZE=2]
        [/SIZE][/LEFT][SIZE=2]
        [/SIZE][LEFT][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2](DOWN)[/SIZE]
        [LEFT][SIZE=2]Terrasse_links_Tuere_Rollo.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2](DOWN)[/SIZE]
        [SIZE=2]Terrasse_rechts_Tuere_Rollo.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2](DOWN)[/SIZE]
        [SIZE=2]Terrasse_rechts_Fenster_Rollo.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2](DOWN)[/SIZE]
        [SIZE=2]etc[/SIZE]
        [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]if[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] (![I]pushNotification[/I]([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"[U]Checkoff[/U]"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"[U]Rollladen[/U] [U]fahren[/U] [U]ab[/U] !!"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#7d7d7d][SIZE=2][COLOR=#7d7d7d]2[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])) {[/SIZE]
        [SIZE=2][I]sendMail[/I]([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"abcdefghijklmno[U]@api.prowlapp.com[/U]"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"[U]Checkoff[/U]"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"[U]Rollladen[/U] [U]fahren[/U] [U]ab[/U]"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
        [SIZE=2]}[/SIZE]
        [SIZE=2]Lampe_Haustuere.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2](ON)[/SIZE]
        [SIZE=2]}[/SIZE]
        [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]end[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#7f0055][/COLOR][/SIZE][/LEFT][SIZE=2][COLOR=#7f0055]
        [/COLOR][/SIZE][/LEFT]
        Code:
        [SIZE=2][COLOR=#7f0055]
        [LEFT][B][SIZE=2][COLOR=#7f0055]rule[/COLOR][/SIZE][/B]
        Gleichzeitig schicke ich mir eine Info auf das iPhone, damit ich beruhigt bin wenn ich unterwegs bin Wenn Du nun noch das ganz mit der Uhrzeit vebinden möchtest, sollte doch folgendes gehen?!
        [B][SIZE=2][COLOR=#7f0055] [/COLOR][/SIZE][/B][/COLOR][/SIZE]
        [/LEFT]
        Code:
        [SIZE=2][COLOR=#7f0055][B][SIZE=2][COLOR=#7f0055]
        [/COLOR][/SIZE][/B][/COLOR][/SIZE][LEFT][SIZE=2][COLOR=#000000]Shutters[/COLOR][/SIZE]
        [LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]when[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#7f0055]
        [/COLOR][/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]Item[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] Night [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]changed[/COLOR][/SIZE][/COLOR][/SIZE][/B]
        [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]then[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#7f0055]
        [/COLOR][/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]if[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] (receivedCommand==ON && [I]now[/I].getHourOfDay >= 18[/SIZE][SIZE=2])[/SIZE]
        [SIZE=2]{[/SIZE]
        [SIZE=2]Runter mit die Rollladen wie oben beschrieben[/SIZE]
        [SIZE=2]}[/SIZE][/LEFT]
        [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]end[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#7f0055]
        [/COLOR][/SIZE][/LEFT]


        Da das Item in der Regel nur zweimal am Tag "wechselt" und dabei sicherlich nur einmal nach 18 Uhr auf ON, sollte dies eigentlich (obwohl ungetestet) funktionieren.

        Falls es geht, wäre eine kurze Info Prima

        VG
        Joerg

        Kommentar


          #5
          if (receivedCommand==ON && now.getHourOfDay >= 18)
          {
          Runter mit die Rollladen wie oben beschrieben
          }
          Damit fahren die Rolladen dann aber nicht, wenn es vor 18 Uhr dunkel wird, da der Trigger dann nach 18 Uhr ja nicht mehr auslöst.

          Wahrscheinlich wäre ein Trigger am besten, der nach Helligkeit oder Uhrzeit auslöst, ob das funktioniert habe ich noch nicht probiert, sollte aber

          Also so in der Art:
          when
          Item Night changed or
          Time cron "0 0 18 * * ?"
          then
          ...
          end

          Kommentar


            #6
            Ich glaube, dass es nicht so einfach mit einer OR-Verknüpfung zu Regeln ist:

            Fall 1: Winter, Dunkel ab 16 Uhr:
            Jalousie soll um 18 Uhr runterfahren

            Fall2: Sommer, Dunkel ab 21 Uhr:
            Jalousie soll um 21 runterfahren

            Also müsste es entweder so laufen:
            Zwischen 18 und 22 Uhr soll alle 5 Minuten geprüft werden ob die Helligkeit <=150 ist und dann 1x geschaltet werden

            Oder:
            Schaltobjekt der Wetterstation schaltet bei Dämmerung - in der Rule steht aber, dass sie nur ausgeführt werden soll, wenn es nach 18 Uhr ist
            +
            Cronjob schaltet um 18 Uhr aber nur, wenn es dunkel genug ist

            Michael

            Kommentar


              #7
              Hallo Jockel,

              da hast Du natürlich recht, aber:

              Zitat von maddog Beitrag anzeigen
              Sinngemäß: Frühestens um 18 Uhr und spätestens wenn die Helligkeit unter 150 Lux sinkt, soll einmalig die Jalousie runterfahren.
              Da ich derzeit ausschließlich über die Helligkeit (eigentlich ja Dunkelheit) trigger, habe ich manchmal einen sinkenden WAF wenn denn um 16:12 schon die Rollladen runter gehen da es kurz vor einem Regen nun einmal sehr dunkel ist. Und eigentlich sind dann ja keine Einbrecher unterwegs und und und ...

              Daher finde ich den Ansatz frühestens Zeit und spätestens Helligkeit für meine Zwecke auch passender. Wenn es am Nachmittag zu dunkel wird, sollen die Rollladen bei mir auch nicht fahren. Meist wird es ja nach einem Schauer wieder hell oder wenn nicht, fahren zur eingestellten Zeit die Rollladen runter.

              Viele Grüße
              Joerg

              Kommentar


                #8
                Hmmm,

                der Chron Befehl wäre schon einmal:
                Code:
                [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][LEFT]when[/LEFT]
                [/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][LEFT][/LEFT][/SIZE][LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]Time[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]cron[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"0 0/5 18-22 ? * *"[/COLOR][/SIZE][/COLOR][/SIZE][/LEFT][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]
                [/COLOR][/SIZE][/COLOR][/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][LEFT]then[/LEFT]
                [/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][LEFT][/LEFT][/SIZE][LEFT][SIZE=2] [/SIZE][/LEFT][SIZE=2]
                [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][LEFT]end[/LEFT]
                [/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][/COLOR][/SIZE][/COLOR][/SIZE]

                Kommentar


                  #9
                  Periodisch würde ich ds nicht machen, ist ja nicht nötig. Ich denke, eine Regel die triggert wenn es dunkel ist oder wenn eine (oder mehrere) defenierte Zeiten erreicht sind wäre sinniger.

                  In der Regel kann dann ja getestet werden ob es dunkel ist oder nicht und ob die Rolläden schon unten sind und dann entschieden werden, was passiert.

                  Kommentar


                    #10
                    Hoi

                    In linknx mache ich das so, dass ich zwei Zeiträume mit und verknüpfe.
                    09:00 -12:00
                    sunrise+30min - 12:00
                    Wenn beides zutrifft ist es gut.

                    Code:
                        <rule id="morgens_alle_storen_ausser_Z2_SO_Z1_rauf"> <!-- triggert 30min nach Sunrise nicht vor 9:00 -->
                          <condition type="and">
                            <condition type="timer" trigger="true">
                              <at type="sunrise" offset="1800" wdays="1234567" />
                              <until hour="12" min="0" />
                            </condition>
                            <condition type="timer" trigger="true">
                              <at hour="9" min="00" wdays="1234567" />
                              <until hour="12" min="0" />
                            </condition>
                          </condition>
                    Abends 15 min. nach sunset.
                    Grüsse Bodo
                    Fragen gehören ins Forum, und nicht in mein Postfach;
                    EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

                    Kommentar


                      #11
                      Kann bestimmt noch optimiert werden.
                      Code:
                       
                      [SIZE=2][COLOR=#7f0055][B][SIZE=2][COLOR=#7f0055]rule[/COLOR][/SIZE][/B]
                      [LEFT][/LEFT][/COLOR][LEFT][/LEFT][/SIZE][LEFT][SIZE=2][COLOR=#000000]RollAutomatic[/COLOR][/SIZE]
                      
                      [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]when[/COLOR][/SIZE][/COLOR][/SIZE][/B]
                      [LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]Time[/COLOR][/SIZE][/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]cron[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"0 0/5 18-22 ? * *"[/COLOR][/SIZE][/COLOR][/SIZE]
                      [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]then[/COLOR][/SIZE][/COLOR][/SIZE][/B]
                      [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]if[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] (RollDown.state == ON) {[/SIZE]
                      [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]if[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] ((Night.state == OFF) && ([I]now[/I].getHourOfDay >= [/SIZE][SIZE=2][COLOR=#7d7d7d][SIZE=2][COLOR=#7d7d7d]18[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] && [I]now[/I].getHourOfDay <= [/SIZE][SIZE=2][COLOR=#7d7d7d][SIZE=2][COLOR=#7d7d7d]22[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])) {[/SIZE]
                      [SIZE=2]RollDown.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2](OFF)[/SIZE]
                      [SIZE=2]Rollo_1.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2](DOWN)[/SIZE]
                      [SIZE=2]Rollo_2.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2](DOWN)[/SIZE]
                      [SIZE=2]}[/SIZE]
                      [SIZE=2]}[/SIZE][/LEFT]
                      
                      
                      [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]end[/COLOR][/SIZE][/COLOR][/SIZE][/B][/LEFT]

                      Kommentar


                        #12
                        Hi, ich hab das bei mir so gelöst:

                        (die Variablen DA_Abend_1 sind vom Namen nicht "korrekt" - müsste nur Abend_1 sein, da sie nichts mit DA / Weg zu tun hat)

                        Abend hat er drei Scenen und ja nach Anwesend oder nicht schaltet er die nach Zeitpunkt Sonnenuntergang + Offset

                        Code:
                        import org.openhab.core.library.types.*
                        import org.openhab.model.script.actions.*
                        
                        
                        import java.lang.Math
                        import java.util.Date
                        import java.util.Calendar
                        import org.joda.time.DateTime
                        
                        // Change this reflecting your destination
                        var Number lat = 55.270699
                        var Number lng = 8.531302
                        
                        var Calendar sunrise = Calendar::getInstance()
                        var Calendar sunset  = Calendar::getInstance()
                        
                        var Timer Da_Abend_1 = null
                        var Timer Da_Abend_2 = null
                        var Timer Da_Abend_3 = null
                        
                        var Timer Weg_Abend_1 = null
                        var Timer Weg_Abend_2 = null
                        
                        rule "Rollo Steuerung"
                        when
                            Time cron "0 0/5 * * * ?"
                        //    Time cron "0/10 */1  * * * ?"
                        then
                            // http://www.suncalc.net
                            var J1970 = 2440588
                            var J2000 = 2451545
                            var deg2rad = Math::PI / 180
                            var M0 = 357.5291 * deg2rad
                            var M1 = 0.98560028 * deg2rad
                            var J0 = 0.0009
                            var J1 = 0.0053
                            var J2 = -0.0069
                            var C1 = 1.9148 * deg2rad
                            var C2 = 0.0200 * deg2rad
                            var C3 = 0.0003 * deg2rad
                            var P = 102.9372 * deg2rad
                            var e = 23.45 * deg2rad
                            var th0 = 280.1600 * deg2rad
                            var th1 = 360.9856235 * deg2rad
                            var h0 = -0.83 * deg2rad //sunset angle
                            var d0 = 0.53 * deg2rad //sun diameter
                            var h1 = -6 * deg2rad //nautical twilight angle
                        
                            var h2 = -12 * deg2rad //astronomical twilight angle
                            var h3 = -18 * deg2rad //darkness angle
                            var msInDay = 1000 * 60 * 60 * 24
                            var lw = -lng * deg2rad
                            var phi = lat * deg2rad
                        
                            var datum = new Date()
                        
                            var J = datum.getTime() / msInDay - 0.5 + J1970
                            var n = Math::round( (J - J2000 - J0 - lw/(2 * Math::PI)).doubleValue)
                            var Js = (J2000 + J0 + (0 + lw)/(2 * Math::PI) + n)
                            var M = ( M0 + M1 * (Js - J2000))
                            var C = C1 * Math::sin(M.doubleValue) + C2 * Math::sin((2 * M).doubleValue) + C3 * Math::sin((3 * M).doubleValue)
                            var Lsun = M + P + C + Math::PI
                            var Jtransit = Js + (J1 * Math::sin(M.doubleValue)) + (J2 * Math::sin((2 * Lsun).doubleValue))
                            var d = Math::asin((Math::sin(Lsun.doubleValue) * Math::sin(e.doubleValue)).doubleValue)
                            var w0 = Math::acos(((Math::sin(h0.doubleValue) - Math::sin(phi.doubleValue) * Math::sin(d.doubleValue)) / (Math::cos(phi.doubleValue) * Math::cos(d.doubleValue))).doubleValue)
                            var w1 = Math::acos(((Math::sin((h0+d0).doubleValue) - Math::sin(phi.doubleValue) * Math::sin(d.doubleValue)) / (Math::cos(phi.doubleValue) * Math::cos(d.doubleValue))).doubleValue)
                        
                            var Jset            = J2000 + J0 + (w0 + lw)/(2 * Math::PI) + n + (J1 * Math::sin(M.doubleValue)) + (J2 * Math::sin((2 * Lsun).doubleValue))
                            var Jsetstart       = J2000 + J0 + (w1 + lw)/(2 * Math::PI) + n + (J1 * Math::sin(M.doubleValue)) + (J2 * Math::sin((2 * Lsun).doubleValue))
                        
                            var Jrise           = Jtransit - (Jset - Jtransit)
                            var Jriseend        = Jtransit - (Jsetstart - Jtransit)
                        
                            var sunrise_ms_start = ( (Jrise + 0.5 - J1970) * msInDay).longValue
                            var sunrise_ms_end   = ( (Jriseend + 0.5 - J1970) * msInDay).longValue
                            var sunset_ms_start  = ((Jsetstart + 0.5 - J1970) * msInDay).longValue
                            var sunset_ms_end    = ((Jset + 0.5 - J1970) * msInDay).longValue
                        
                            // Items:
                            // DateTime        SunRise "Sonnenaufgang [%1$tA, %1$td.%1$tm.%1$tY %1$tT]"                <calendar>
                            // DateTime        SunSet  "Sonnenuntergang [%1$tA, %1$td.%1$tm.%1$tY %1$tT]"         <calendar>
                        
                            var  Calendar sunrise_start = Calendar::getInstance()
                            var  Calendar jetzt = Calendar::getInstance()
                            sunrise_start.setTimeInMillis( sunrise_ms_start )
                            if (sunrise_start != sunrise) {
                                SunRise.postUpdate( new DateTimeType(sunrise_start) )
                                sunrise = sunrise_start
                                if (jetzt.after( sunrise ) ) {
                                    logWarn("Calc Times","Sonnenaufgang war schon")
                                }
                            } else {
                        //      logWarn("Calc Times","sunrise is the same")
                            }
                            /* Sonnenuntergang */
                            var  Calendar sunset_start = Calendar::getInstance()
                            sunset_start.setTimeInMillis( sunset_ms_start )
                        
                            if (sunset_start != sunset ) {
                                SunSet.postUpdate( new DateTimeType(sunset_start))
                                sunset = sunset_start
                        
                                var Calendar worktime  = sunset.clone()
                                var DateTime trigger
                                var DateTime DTcompare
                        
                                // DA_Abend_1
                                logInfo("Sun.Rules","Start Da_Abend_1")
                                if (Da_Abend_1!=null) {
                                    Da_Abend_1.cancel
                                    Da_Abend_1 = null
                                }
                                if (jetzt.before( worktime ) ) {        // es ist nicht vor sonnenuntergang
                                    trigger = new DateTime(worktime)
                                    DTcompare = trigger.hourOfDay().setCopy(20).minuteOfHour().setCopy(0).secondOfMinute().setCopy(0).millisOfSecond().setCopy(0);
                        
                                    logInfo("Sun.Rules", trigger.toString() )
                                    logInfo("Sun.Rules", DTcompare.toString() )
                                    if (trigger.isAfter( DTcompare )) {
                                        trigger = DTcompare
                                    }
                        
                                    Da_Abend_1 = createTimer( trigger ) [|
                                            if (Anwesend.state=="OFF"){
                                                // sofort runter
                                                pushNotification("Rollosteuerung", "Abend 1 : DA = " + Anwesend.state)
                                                sendMail ("mail@de","Abend 1", "Abend 1 : DA = " + Anwesend.state)
                                                pushNotification("Rollosteuerung", "Abend 1 : Rollos fast runter")
                                                sendCommand(Scene_Haus, 11)
                        
                                            } else {
                                                // nur licht
                                                sendCommand( Scene_Haus, 1)
                                                pushNotification("Rollosteuerung", "Abend 1 : DA = " + Anwesend.state)
                                                pushNotification("Rollosteuerung", "Abend 1 : nur licht")
                                                sendMail ("mail@de","Abend 1", "Abend 1 : DA = " + Anwesend.state)
                        
                                            }
                                    ]
                                }
                        
                                // Da Abend 2
                                logWarn("Rollo","Da_Abend_2")
                                if (Da_Abend_2 != null) {
                                    Da_Abend_2.cancel
                                    Da_Abend_2 = null
                                }
                                worktime = sunset.clone()
                                worktime.add(Calendar::MINUTE,20)
                                if (jetzt.before( worktime ) ) {
                                    trigger = new DateTime(worktime)
                                    Da_Abend_2 =  createTimer( trigger ) [|
                                        if (Anwesend.state=="OFF"){
                                            pushNotification("Rollosteuerung", "Abend 2 - skipped : "+Anwesend.state)
                                            sendMail ("mail@de","Abend 2","Abend 2 - skipped : "+Anwesend.state)
                                            sendCommand(Scene_Haus, 12)
                                        } else {
                                            pushNotification("Rollosteuerung", "Abend 2 :"+Anwesend.state)
                                            sendMail ("mail@de","Abend 2","Abend 2 :"+Anwesend.state)
                                            sendCommand(Scene_Haus, 2)
                                        }
                                    ]
                                }
                        
                                // Da Abend 3
                                logWarn("Rollo","Da_Abend_3")
                                if (Da_Abend_3 != null) {
                                    Da_Abend_3.cancel
                                    Da_Abend_3 = null
                                }
                                worktime = sunset.clone()
                                worktime.add(Calendar::MINUTE,40)
                                if (jetzt.before( worktime ) ) {
                                    trigger = new DateTime(worktime)
                                    Da_Abend_3 =  createTimer( trigger ) [|
                                        if (Anwesend.state=="OFF"){
                                            //pushNotification("Rollosteuerung", "Abend 3 - skipped : "+Anwesend.state)
                                            //sendMail ("mail@de", "Abend 3 - skipped : "+Anwesend.state)
                                        } else {
                                            pushNotification("Rollosteuerung", "Abend 3 :"+Anwesend.state)
                                             sendMail ("mail@de", "Abend 3", "Abend 3 :"+Anwesend.state)
                                             sendCommand(Scene_Haus, 3)
                                        }
                                    ]
                                }
                        
                            } else {
                                logWarn("Calc Times","sunset is the same")
                            }
                        end

                        Kommentar


                          #13
                          aus meiner Sicht bräuchte man noch die aktuelle Position der Rolläden, um eine einmalige Fahrt sicherzustellen. Bei mir würde die Regel vermutlich so aussehen:

                          Code:
                          var int brightness_threshold = 500
                          
                          rule "Shutdown Rollershutter when dark and late enough"
                          when
                          	Item Wetter_Helligkeit changed or
                          	Time cron "0 0/5 18-21 ? * *"
                          then
                          	var still_open = G_Rollaeden_DG_Pos.state < 100
                          	var dark_enough = Wetter_Helligkeit.state <= brightness_threshold
                          	var late_enough = now.getHourOfDay >= 18
                                  var too_late = now.getHourOfDay == 21
                          
                          	if (Mode_Auto_Rollershutter.state == ON && still_open && ((late_enough && dark_enough) || too_late)) {
                          		G_Rollaeden_DG.sendCommand(DOWN)
                          	}
                          end
                          (ohne Gewähr weil umgetestet)

                          Gruß,

                          Thomas E.-E.
                          Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

                          Kommentar

                          Lädt...
                          X