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:
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!!!)
Nun zu meiner Rule:
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 ;-)
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 ;-)
Kommentar