Astrozeitsteuerung:
Angabe von offset Sonneaufgang
Angabe frühestens öffnen
Angabe von offset Sonnenuntergang
Angabe spätestens schliessen
gesetzt wird eine Systemvariable Astrotag, welche in weiteren Programmen dann z.B. zur Rolladensteuerung benutzt werden kann.
natürlich kommt diese Lösung dann ohne das verbiegen der geographischen Koordinaten aus.
Zuerst braucht es eine Systemvariable, die vom dem Programm mit dem zeitmodul gesetzt wird. Ich empfehle folgendes:
Dann ein kleines WebUi
Das WebUI programm sollte selbsterklärend sein
dann brauchen wir noch ein Programm, triggern am besten irgendwann nach mitternacht, welches die neue zeit für das Astrozeitmudul berechnet und dieses läd
. Die meisten werden ja ein Aktionsprogramm Mitternacht haben, welches dort einmal die täglichen berechnungen und Einstellungen vornimmt.
Code: Alles auswählen
!- Flexibles Astro Zeit Programm mit Zeitmodul
!- Kommt ohne Verbiegung der Ortskoordinaten aus
!- Copyright by Black in Mai 2019
!--------------------------------------------------
!- WICHTIG
!- Das Programm muss vom Aufbau her dem WEBUI Programm entsprechen, welches von mir in dem Thread im Homematik-forum beschrieben wurde
!- Das Zeitmodul muss in Rule 0, Condition 0 , Singlecondition 0 sein
!- Condition bzw Singlecondition sind anpassbar (nur wenns wirklich gebraucht und man weiss was man tut
integer SunriseOffset = -30; !- Offset Sonnenaufgang in Minuten !!! (Minus = vor Sonnenaufgang)
integer SunsetOffset = 30; !- Offset Sonnenunetergang in Minuten !!!! (Minus = vor Sonnenunetergang)
string LimitTag = "05:30"; !- Kein öffnen vor dieser urzeit , keine Sekunden, zeit SOOO schreiben
string LimitNacht = "22:15"; !- Spätenstens Nacht um diese uhrzeit
object oPRG= dom.GetObject (ID_PROGRAMS).Get ("ZEIT_00_Astrozeit"); !- hier den Programmnamen mit dem zeitmodul eintragen, welches geändert werden soll
!- Ab hier nix mehr verändern
!----------------------------
if (!oPRG) {WriteLine ("Na toll, wenigstens der Programmname sollte sichtig sein: Abbruch"); quit; }
object oZM= oPRG.Rule().RuleCondition (0).CndSingleCondition (0);
if (oZM.LeftValType () == ivtCurrentDate) { !- Wir sind ein Zeitmodul
oZM = dom.GetObject (oZM.RightVal1 () );
integer s= (system.SunriseTime ("%M").ToInteger () + SunriseOffset + system.SunriseTime ("%H").ToInteger ()*60).Max (30) ;
integer limit= (LimitTag.StrValueByIndex (":",1).ToInteger () + LimitTag.StrValueByIndex (":",0).ToInteger ()*60).Max (s);
time tZeit= "2007-01-01 00:00:00".ToTime ()+ limit*60;
oZM.Time (tZeit); !- Damit ist der Tagbeginn schon mal gesetzt
s= (system.SunsetTime ("%M").ToInteger () + SunsetOffset + system.SunsetTime ("%H").ToInteger ()*60).Min (1430) ;
limit= ((LimitNacht.StrValueByIndex (":",1).ToInteger () + LimitNacht.StrValueByIndex (":",0).ToInteger ()*60).Min (s))-limit;
oZM.CalDuration ((limit*60).Max (10).ToInteger () ); !- Dauer berechnet und gesetzt (Tagdauer mindestens 10 Minuten, falls jemand Müll konfiguriert hat
dom.RTUpdate (2);
WriteLine ("Zeitmodul gesetzt");
} else { WriteLine ("Kein zeitmodul da, wo es sein sollte: Abbruch "); quit; }
Die SystemVariable wird dann für qweitere Aktionen wie Rollosteuerung verwendet.
gruss, Black