Universelles Astro/Zeit-Skript für Rolladen, Lampen …

,

[google-translator]

Im Homematic Zeitmodul fehlen eine Reihe wichtiger Zeitfunktionen wie Datumsbereiche, Monate, Wochentage und Kalenderwochen. Aber besonders die Astrofunktion ist unbefriedigend, weil man nur selten genau zum Sonnenaufgang(SA) oder Sonnenuntergang(SU) etwas schalten möchte. Meist benötigt man nämlich Schaltvorgänge vor oder nach diesem Sonnenereignis.

Um diesen Mangel „auszubügeln“ , gibt es in den einschlägigen  Foren eine Vielzahl von mehr oder weniger gelungener Hilfslösungen, die aber meist nur auf spezielle Fragestellungen abgestimmt wurden. Mit diesem universell einsetzbaren Astro/Zeitskript werden verschiedene Systemvariablen berechnet, welche die verschiedenen Zeitinformationen abbilden. Die gewählte Benamung der Systemvariablen erklären selbstredend die Funktion.

Und das geht so:

1. Folgende Systemvariablen anlegen:

Minuten_vor_SA als Zahl , Wertebereich -1000 bis +1000
Minuten_vor_SU als Zahl , Wertebereich -1000 bis +1000
Tageszeit_hh.mm als Zahl in h
Datum_MM.TT als Zahl
Monat als Werteliste Januar;Februar; …
Monatstag als Werteliste 1;2;… 31 oder als Zahl
Wochennummer als Zahl
Woche_gerade logisch wahr ist gerade , unwahr ist ungerade
Wochentag als Zahl
Jahrestag als Zahl
Jahr als Zahl

2. WebUI Programm anlegen, in dem beispielsweise alle 3min das folgende Astro/Zeit-Skript aufgerufen wird:

astro_skript1
Das Skript dazu verwendet nur eine (!) Skriptvariable, was für eine gute „Skripthygiene“ wichtig ist.

 

[codesyntax lang=“text“ title=“Astro/Zeit-Skript“]

!Skript zur Berechnung der Minuten vor SA und SU        !  
!stall.biz  04.04.2016  Dieses Skript verwendet nur eine (!) Skript-Variable     
!folgende Systemvariablen anlegen
!Minuten_vor_SA"    als Zahl , Wertebereich  -1000 bis +1000
!Minuten_vor_SU"    als Zahl , Wertebereich  -1000 bis +1000
!"Tageszeit_hh.mm"  als Zahl  in h
!"Datum_MM.TT"    als Zahl  
!"Monat"    als Werteliste Januar;Februar;  ...  
!"Monatstag"    als Zahl oder Werteliste 1;2;...31;
!"Wochennummer"    als Zahl  
!"Woche_gerade"    logisch   wahr ist gerade , unwahr ist ungerade
!"Wochentag"    als Zahl  
!"Jahrestag" als Zahl
!"Jahr" als Zahl 

real c_zeit =(system.Date("%M").ToFloat()+ (60.0*system.Date("%H").ToFloat())); 

if (c_zeit >720.0) { dom.GetObject("Minuten_vor_SA").State(999); 
  c_zeit = system.SunsetTime("%M").ToFloat() + (60.0*system.SunsetTime("%H").ToFloat());
  c_zeit = c_zeit -  (system.Date("%M").ToFloat()+ (60.0*system.Date("%H").ToFloat()));
  dom.GetObject("Minuten_vor_SU").State(c_zeit); 
}
else {dom.GetObject("Minuten_vor_SU").State(999); 
  c_zeit = system.SunriseTime("%M").ToFloat() + (60.0*system.SunriseTime("%H").ToFloat());
  c_zeit = c_zeit - (system.Date("%M").ToFloat()+ (60.0*system.Date("%H").ToFloat()));
  dom.GetObject("Minuten_vor_SA").State(c_zeit); 
}

c_zeit = (1.0*system.Date("%H").ToInteger()) +(0.01*system.Date("%M").ToInteger());                      
dom.GetObject("Tageszeit_hh.mm").State(c_zeit);

c_zeit  = (0.01 * system.Date("%d").ToInteger()) + system.Date("%m").ToInteger();
dom.GetObject("Datum_MM.TT").State(c_zeit );

c_zeit   = system.Date("%Y").ToInteger();
dom.GetObject("Jahr").State(c_zeit);


c_zeit   = system.Date("%m").ToInteger();
dom.GetObject("Monat").State(c_zeit  -1);

c_zeit    = system.Date("%d").ToInteger();
dom.GetObject("Monatstag").State(c_zeit );

c_zeit =  system.Date("%V").ToInteger();
dom.GetObject("Wochennummer").State(c_zeit);

if ((c_zeit - 2*(c_zeit/2.0)) == 1) {dom.GetObject("Woche_gerade").State(0);} else {dom.GetObject("Woche_gerade").State(1);}

c_zeit = system.Date("%u").ToInteger();
dom.GetObject("Wochentag").State( c_zeit);

c_zeit = system.Date("%j").ToInteger();
dom.GetObject("Jahrestag").State( c_zeit);

[/codesyntax]
3. Wer CuxD installiert hat, der kann den manchmal instabilen regelmäßigen Zeitaufruf des Astro/Zeit-Skripts mit einem CuxD-Timer realisieren. Wie das geht, ist an verschiedenen Stellen im Homematic-Forum bereits beschrieben, so daß hier auf eine weitere Erklärung verzichtet wird. Das Programm zum regelmässigen Aufruf des Astro/Zeit-Skriptes sieht mit einem CuxD-Timer dann so aus:

astro_skript5
Der Vorteil bei diesem Verfahren ist, daß fast die gesamten Zeitsteuerungen der WebUI-Programme nun über die neuen Astro/Zeit-Systemvariablen erfolgen kann. Und diese Systemvariablen werden nur über einen(!) viel zuverlässigeren CuxD-Timer aktualisiert. Damit wird das gesamte Zeitmanagement deutlich stabiler und zuverlässiger.

4. So wird das Astro/Zeit-Skript eingesetzt
Zum Beispiel eine Rollade so steuern, daß sie morgens 30min vor Sonnenaufgang hoch geht, aber nicht vor 6h45 und abends 45min nach Sonnenuntergang runter fährt,aber nicht später als 22h00.

Das WebUI -Programm dazu ist mit Verwendung der soeben definierten Systemvariablen ganz einfach:

astro_skript4
…und mit der Verwendung der Systemvariablen aus der Astro/Zeitsteuerung sind die WebUI-Programm viel besser lesbar, als mit dem „verkorksten“Zeitmodul!

Einige User hatten das Problem, daß bei dem obigen Programm der Rolladenaktor jedesmal „klickt“, wenn die Systemvariable Minuten_vor_SA alle 2 Minuten aktualisiert wird. Das kann man verhindern mit folgendem geänderten Programm:

rollladen_astro

 

Hier noch einige Erläuterungen zur Astrofunktion:
Da die meisten Steuerungsaufgaben sehr oft mit dem Sonnenaufgang und -untergang verknüpft ist, hat man die sog. Astrofunktion eingeführt. Diese ist aber oft unzureichend, weil man oft lieber einige Minuten vorher oder nachher den Schaltvorgang ausführen möchte. Dazu wurden in dem Astro/Zeit-Skript die zwei Systemvariablen Minuten_vor_SA und Minuten_vor_SU eingeführt. Der Wert dieser Variablen ändert sich über den Tagesverlauf entsprechend dem folgenden Bild:


Die Systemvariable Minuten_vor_SA ist nur von 00h00 bis 12h00 aktiviert und wird im zweiten Tagesabschnitt auf einen Wert von 999 gesetzt.
Bei der Systemvariablen Minuten_vor_SU ist es genau umgekehrt. Diese Definition hat Vorteile bei Anwendung in WebUI -Programmen.

Viel Spaß mit dem neuen „Zeitgefühl“

Skills

Posted on

19. Februar 2016