Ankündigung

Einklappen
Keine Ankündigung bisher.

Rule: Zeitraum (ist Datum/Zeit zwischen zwei Werten)

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

    [Codebeispiel] Rule: Zeitraum (ist Datum/Zeit zwischen zwei Werten)

    Hi,
    der Titel ist war für mich schwierig auszuwählen und vielleicht nicht für jeden sofort verständlich, dennoch möchte ich hier meine Rule dokumentieren :-)

    Funktion:

    Liegt das Datum/Zeit zwischen Datum/Zeit A und Datum/Zeit B, setzte einen Schalter auf EIN

    Zweck:

    Steuerung von bsw. Rollladen (fies das mit drei „L“ zu schreiben ;-)) . Wenn der Schalter "ES_IST_NACHT" AN ist Fahre ROLLADE_BAD runter.

    Benötigte Items:
    Code:
     [FONT="Times New Roman"][COLOR=#000000][FONT=Calibri]DateTime              SunRise  "Sonnenaufgang [%1$tR]"[/FONT][/COLOR][/FONT]
     [FONT="Times New Roman"][COLOR=#000000][FONT=Calibri]DateTime              SunSet                   "Sonnenuntergang [%1$tR]"            [/FONT][/COLOR][/FONT]
     [FONT="Times New Roman"][COLOR=#000000][FONT=Calibri]Switch                    TIME_BETWEEN_SET_AND_RISE      "Ist es zwischen Sonnenunter- und Aufgang"[/FONT][/COLOR][/FONT]
     [FONT=Calibri][COLOR=#000000][FONT=Calibri][/FONT][/COLOR][/FONT]

    Benötigte Rule „Sonnenauf und untergang berechnen“:
    (Ich weiss leider nicht mehr woher ich diese Rule habe – aber Besten Dank noch mal an den jenigen der sie geschrieben hat!!!)
    Code:
     [COLOR=#000000][FONT=Calibri]rule "Update SunRise and Set"[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                when[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                               System started or[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                               Time cron "0 0 */1 * * ?" //or[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                               //Item DEBUGSwitch received command ON[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                then[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                logInfo("Rule Start","Update Sunrise and Set")[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Number lat = xx.xxxxxxx[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Number lng = y.yyyyy[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var J1970 = 2440588[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var J2000 = 2451545[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var deg2rad = Math::PI / 180[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var M0 = 357.5291 * deg2rad[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var M1 = 0.98560028 * deg2rad[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var J0 = 0.0009[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var J1 = 0.0053[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var J2 = -0.0069[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var C1 = 1.9148 * deg2rad[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var C2 = 0.0200 * deg2rad[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var C3 = 0.0003 * deg2rad[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var P = 102.9372 * deg2rad[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var e = 23.45 * deg2rad[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var th0 = 280.1600 * deg2rad[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var th1 = 360.9856235 * deg2rad[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var h0 = -0.83 * deg2rad //sunset angle[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var d0 = 0.53 * deg2rad //sun diameter[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var h1 = -6 * deg2rad //nautical twilight angle[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var h2 = -12 * deg2rad //astronomical twilight angle[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var h3 = -18 * deg2rad //darkness angle[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var msInDay = 1000 * 60 * 60 * 24[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var lw = -lng * deg2rad[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var phi = lat * deg2rad[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var datum = new Date()[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var J = datum.getTime() / msInDay - 0.5 + J1970[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var n = Math::round( (J - J2000 - J0 - lw/(2 * Math::PI)).doubleValue)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Js = (J2000 + J0 + (0 + lw)/(2 * Math::PI) + n)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var M = ( M0 + M1 * (Js - J2000))[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var C = C1 * Math::sin(M.doubleValue) + C2 * Math::sin((2 * M).doubleValue) + C3 * Math::sin((3 * M).doubleValue)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Lsun = M + P + C + Math::PI[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Jtransit = Js + (J1 * Math::sin(M.doubleValue)) + (J2 * Math::sin((2 * Lsun).doubleValue))[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var d = Math::asin((Math::sin(Lsun.doubleValue) * Math::sin(e.doubleValue)).doubleValue)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                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)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                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)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Jset = J2000 + J0 + (w0 + lw)/(2 * Math::PI) + n + (J1 * Math::sin(M.doubleValue)) + (J2 * Math::sin((2 * Lsun).doubleValue))[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Jsetstart = J2000 + J0 + (w1 + lw)/(2 * Math::PI) + n + (J1 * Math::sin(M.doubleValue)) + (J2 * Math::sin((2 * Lsun).doubleValue))[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Jrise = Jtransit - (Jset - Jtransit)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Jriseend = Jtransit - (Jsetstart - Jtransit)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var sunrise_ms_start = ( (Jrise + 0.5 - J1970) * msInDay).longValue[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var sunrise_ms_end = ( (Jriseend + 0.5 - J1970) * msInDay).longValue[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var sunset_ms_start = ((Jsetstart + 0.5 - J1970) * msInDay).longValue[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var sunset_ms_end = ((Jset + 0.5 - J1970) * msInDay).longValue[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Calendar sunrise_start = Calendar::getInstance()[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                sunrise_start.setTimeInMillis( sunrise_ms_start )[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                SunRise.postUpdate( new DateTimeType(sunrise_start))[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Calendar sunset_start = Calendar::getInstance()[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                sunset_start.setTimeInMillis( sunset_ms_start )[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                SunSet.postUpdate( new DateTimeType(sunset_start))[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var sunRise = new DateTime((SunRise.state as DateTimeType).calendar.timeInMillis)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var sunSet = new DateTime((SunSet.state as DateTimeType).calendar.timeInMillis)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                logInfo("Rule Ended","Update Sunrise and Set")[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]end[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri][/FONT][/COLOR]

    Nun zu meiner Rule:
    Code:
     [COLOR=#000000][FONT=Calibri]rule " Time between Set and Rise"[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                when[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                               Item SunSet changed or[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                               Item SunRise changed // or[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                               //Item DEBUGSwitch received command ON[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                then[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                logInfo("Rule Start","is Time between Set and Rise")[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Date CurrentDateTime = new Date()[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var String SunRiseString = SunRise.state.toString()[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var String SunSetString = SunSet.state.toString()[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var String SRStr = SunRiseString.replace("T", " ")[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var String SSStr = SunSetString.replace("T", " ")[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var String CurrentDateTimeStr = sdf.format(CurrentDateTime)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Date SunRiseSDF = sdf.parse(SRStr)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Date SunSetSDF = sdf.parse(SSStr)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                var Date CurrentDateTimeSDF = sdf.parse(CurrentDateTimeStr)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                if ( (SunRiseSDF.getTime() > CurrentDateTimeSDF.getTime()) || (SunSetSDF.getTime() < CurrentDateTimeSDF.getTime()) ) {[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                               createTimer(now.plusMinutes(15)) [|  //nur ein Offset, den man individuell anpassen kann)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                                               sendCommand(TIME_BETWEEN_SET_AND_RISE, ON)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                               ][/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                } else {[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                               sendCommand(TIME_BETWEEN_SET_AND_RISE, OFF)[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                }[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]                logInfo("Rule Ended","Time between Set and Rise")[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri]end[/FONT][/COLOR]
     [COLOR=#000000][FONT=Calibri][/FONT][/COLOR]


    Das wars auch schon. Nun kann man das ITEM TIME_BETWEEN_SET_AND_RISE für diverse Rules benutzen um damit spannende Dinge zu tun ;-)

    #2
    ich hab es etwas einfacher gelöst.
    Die Vergleiche gehen einfach auf die Minuten pro Tag.
    Ist jetzt aus meinen Regeln herauskopiert und ungetestet, das Prinzip sollte aber erkannt werden...

    Holger

    Code:
    Items holen von wonderground die Zeiten (*.items)
    String  strSunrise       { http="<[http://api.wunderground.com/api/3f780****/astronomy/q/DL/ORT.xml:600000:XSLT(wunderground_sunrise.xsl)]" }
    String  strSunset        { http="<[http://api.wunderground.com/api/3f780****/astronomy/q/DL/ORT.xml:600000:XSLT(wunderground_sunset.xsl)]" }
    Code:
     rule "Sonne"
     when
        Item strSunrise changed or
        Item strSunset changed or
        System started
     then
                     
        var Integer sunrise
        var Integer sunset
        var Integer jetzt
        var DateTime dtSunrise
        var DateTime dtSunset 
    
        dtSunrise = parse("T"+strSunrise.state)
        dtSunset  = parse("T"+strSunset.state)
        
        jetzt   =  now.getHourOfDay()     * 60 + now.getMinuteOfHour()      // aktuell
        sunrise =  dtSunrise.getHourOfDay * 60 + dtSunrise.getMinuteOfHour  // Sonnenaufgang
        sunset  =  dtSunset.getHourOfDay  * 60 + dtSunset.getMinuteOfHour   // Sonnenunterganng       
           
        if (sunrise > jetzt) 
           createTimer(now.plusMinutes(sunrise - jetzt)) [| postUpdate(SONNE, ON) ]  
    
        if (sunset > jetzt) 
           createTimer(now.plusMinutes(sunset - jetzt)) [| postUpdate(SONNE, OFF) ]  
    
        if (jetzt > sunrise && jetzt < sunset) postUpdate(SONNE,ON)
        else postUpdate(SONNE,OFF)
        
    end

    Kommentar


      #3
      Mal aus Interesse - warum verwendet ihr nicht das Astro-Binding?

      Grüße
      Sascha

      EDIT: Ich habe mich vom Beispiel lenken lassen - und hing am Rollladen Danke für die Beispiele

      Kommentar


        #4
        Zitat von kuschelganxta Beitrag anzeigen
        Mal aus Interesse - warum verwendet ihr nicht das Astro-Binding?
        weils so schon ewig läuft... never change a running system ;-)

        Kommentar


          #5
          @Holger,

          da sieht auch gut aus. Habe bei meine Regel hat eine Internet unabhängige Lösung für den Sonnenstand :-)

          @Sascha:
          Danke für den Tipp! Das kannte ich noch gar nicht :-) schaue ich mir mal an. Macht die Sache doch ne Ecke einfacher!

          Kommentar

          Lädt...
          X