Homematic – Erweiterung des Zeitmodules 02 – Berechnung der Jahreszeiten
Heute möchte ich euch den zweiten Teil der Kurzserie „Erweiterungen des Homematic Zeitmodules“ vorstellen. Im ersten Teil habe ich euch im Artikel „Homematic – Erweiterung des Zeitmodules 01 – Berechnung von Feiertagen“ die Berechnung von Feiertagen beschrieben. Heute möchte ich euch zeigen, wie ihr mit zwei kleinen Skripten die Jahreszeiten berechnen könnt. Wenn ihr die Jahreszeit berechnet und in eine Systemvariable schreibt, könnt ihr diese Information für diverse Steuerungen in eurem smarten Zuhause verwenden. So könnt ihr beispielsweise über die Jahreszeit Rollladen oder Lampen steuern. In dem Artikel beschreibe ich was die Unterschiede zwischen der Meteorologischen und der Astronomischen Jahreszeit ist und wie ihr diese berechnen könnt.
Allgemeines – wie sinnvoll ist die Unterscheidung?
Meteorologisch hat der Winter am 1. Dezember begonnen, astronomisch bzw. kalendarisch startet er erst am 22. Dezember. Diese unterschiedlichen Daten werden damit begründet, dass es deutlich einfacher ist, statistische Auswertungen zu erstellen, wenn die Berechnung auf vollen Monaten basiert. Ist das aktuell noch zeitgemäß?
Meteorologisch beginnen die Jahreszeiten so definiert, dass die entsprechende Jahreszeit immer am 1. eines Monats beginnt – der Frühling beginnt am 1. März, der Sommer am 1. Juni, der Herbst am 1. September und der Winter am 1. Dezember. Damit ist klar definiert, dass jede Jahreszeit immer drei vollständige Monate beinhaltet. Diese meteorologische Einteilung wurde eingeführt, um statistische Berechnungen zu vereinfachen. Das Argument der Vergleichbarkeit ist immer noch aktuell, dagegen ist die Berechnung von Zeiten mit modernster Technik überholt.
Im Gegensatz dazu variieren die astronomischen Jahreszeitenanfänge. Der Frühlingsanfang ist manchmal am 20. oder 21. März, der Sommeranfang am 20., 21. oder sogar am 22. Juni, der Herbstanfang ist manchmal am 22., oder am 23. September und der Winteranfang am 21. oder 22. Dezember. Das macht die Berechnung deutlich schwieriger und in Bezug auf Statistiken müssten diese jeweils mit Zusätzen versehen werden. Was das Ganze auch deutlich komplizierter macht.
Meteorologischen Jahreszeiten
Die sogenannten meteorologischen Jahreszeiten sind schlicht nach den Kalendermonaten eingeteilt und umfassen jeweils immer drei komplette Monate. Damit werden sie insgesamt etwa drei Wochen früher angesetzt als die astronomischen Jahreszeiten. Mit der meteorologischen Definition fallen die auf der Nordhalbkugel wie in Deutschland im Durchschnitt wärmsten Monate Juni, Juli und August in den (meteorologischen) Sommer, und die durchschnittlich kältesten Monate Dezember, Januar und Februar fallen in den (meteorologischen) Winter. Diese nach Beginn und Ende von Kalendermonaten bestimmten vierteljährlichen Zeitspannen erlauben oft eine einfachere statistische Erfassung meteorologischer Daten; sie sind nicht nach aktuellen Wetterveränderungen ausgerichtet.
- Frühling: 1. März – 31. Mai
- Sommer: 1. Juni – 31. August
- Herbst: 1. September – 30. November
- Winter: 1. Dezember – 28./ 29. Februar
Kalendarische bzw. Astronomische Jahreszeiten
Astronomisch werden die Jahreszeiten nach der scheinbaren geozentrischen Länge des Sonnenstandes bestimmt. Die astronomischen Jahreszeiten sind definiert als jene Zeitspannen, die während des Durchlaufens eines bestimmten der vier Abschnitte jeweils vergehen und dauern wegen der unterschiedlichen Winkelgeschwindigkeit nicht gleich lange. Aufgrund der geozentrischen, auf den Erdmittelpunkt bezogenen Definition beginnt oder endet eine astronomische Jahreszeit standortunabhängig weltweit zum selben Zeitpunkt (dem aber in verschiedenen Zeitzonen unterschiedliche Uhrzeiten entsprechen).
Beginn der Jahreszeiten
Die Tabelle listet die astronomischen Jahreszeitenanfänge bis 2025 für die Mitteleuropäische Zeitzone auf:
Systemvariable anlegen
Bevor ihr die Skripte durchführen könnt, müsst ihr noch die jeweilige Systemvariable anlegen (siehe Screenshot).
Skript – Berechnung meteorologische Jahreszeit
! ! *** Meteorologische Jahreszeit berechnen ! ! *** Monat und Tag ermitteln und an Systemvariable Monat.Tag uebergeben dom.GetObject("Monat.Tag").State( (0.01 * system.Date("%d").ToInteger()) + system.Date("%m").ToInteger()); ! ! *** Fruehling (meteorologisch) Maerz,April,Mai if ((dom.GetObject("Monat.Tag").State()<6.1) && (dom.GetObject("Monat.Tag").State()>3.0)) { dom.GetObject("Jahreszeit meteorologisch").State(0); } ! ! *** Sommer (meteorologisch) Juni,Juli,August if ((dom.GetObject("Monat.Tag").State()<9.1) && (dom.GetObject("Monat.Tag").State()>6.0)) { dom.GetObject("Jahreszeit meteorologisch").State(1); } ! ! *** Herbst (meteorologisch) September,Oktober,November if ((dom.GetObject("Monat.Tag").State()<12.1) && (dom.GetObject("Monat.Tag").State()>9.0)) { dom.GetObject("Jahreszeit meteorologisch").State(2); 020 } ! ! *** Winter (meteorologisch) Dezember,Januar,Februar if ((dom.GetObject("Monat.Tag").State()<3.1) || (dom.GetObject("Monat.Tag").State()>12.0)) { dom.GetObject("Jahreszeit meteorologisch").State(3); }
Skript – Berechnung astronomische Jahreszeit
! ! *** Astronomische Jahreszeit berechnen ! ! *** Monat und Tag ermitteln und an Systemvariable Monat.Tag uebergeben dom.GetObject("Monat.Tag").State( (0.01 * system.Date("%d").ToInteger()) + system.Date("%m").ToInteger()); ! ! *** Fruehling (astronomisch) 20. Maerz bis 19. Juni if ((dom.GetObject("Monat.Tag").State()<6.20) && (dom.GetObject("Monat.Tag").State()>3.19)) {dom.GetObject("Jahreszeit astronomisch").State(0); } ! ! *** Sommer (astronomisch) 20. Juni bis 21. September if ((dom.GetObject("Monat.Tag").State()<9.22) && (dom.GetObject("Monat.Tag").State()>6.20)) { dom.GetObject("Jahreszeit astronomisch").State(1); } ! ! *** Herbst (astronomisch) 22. September bis 20. Dezember if ((dom.GetObject("Monat.Tag").State()<12.21) && (dom.GetObject("Monat.Tag").State()>9.21)) { dom.GetObject("Jahreszeit astronomisch").State(2); 020 } ! ! *** Winter (astronomisch) 21. Dezember bis 19. Maerz if ((dom.GetObject("Monat.Tag").State()<3.20) || (dom.GetObject("Monat.Tag").State()>12.20)) { dom.GetObject("Jahreszeit astronomisch").State(3); }
Skript über WebUI Programm ausrufen
Nachfolgend seht ihr ein Beispiel um das Skript zur Berechnung der meteorologischen Jahreszeit auszuführen. Diesen Programm habe ich für 00:05 Uhr geplant und es funktioniert so seit mehreren Monaten einwandfrei.
Inhalt der Systemvariablen
In dem folgenden Screenshot seht ihr den Inhalt der beiden Jahreszeit Systemvariablen. Da die Skripte beide am 28. Dezember durchgeführt worden sind, haben sie natürlich den gleichen Inhalt.
Fazit
Ich hoffe ihr könnt diese Skripte verwenden um bestimmte Aufgaben in eurem Smart Home umzusetzen. Viel Spass beim Ausprobieren und ich wünsche euch alles gute für das neue Jahr 2020, vor allem Gesundheit.
Hallo Werner,
sehr hilfreiches Skript – vielen Dank dafür.
Gruß Rüdiger
Hat sich geklärt . . . . . Man sollte auch auf Groß- klein Schreibung achten :-)
Hallo Werner,
habe dein Script so in die RaspiMatic übernommen. Erhalte aber im Moment als Ausgabe Frühling statt Sommer.
Finde den Fehler aber nicht? Woran könnte dies liegen.
Vielen Dank Vorab
Gruß
Markus
Hallo,
ich suche sowas nur mit Sommerzeit.
Also systemvariable „Sommerzeit“ = ist wahr
Bin gerade dabei sowas selber zu machen, aber es klappt nicht, da ich nur zu 5% Programmieren kann.
Gruß
Hallo Werner,
bin in der C-änlichen Programmierung der homematic unerfahren.
Was bewirkt die „020“ am Ende in Zeile 17 der jeweiligen Skripts?
Gruss
Klaus
Hi Werner,
thanks a lot, it’s working both :-)
I would like to ask, why the execution of the script in the HM program is delayed by 1 minute?
Thanks Petr
Hello Petr,
nice to hear that our blog is also read in the Czech Republic.
Now to your question. The only reason for the delayed execution of the script is the fact that I have planned several programs/scripts at 00:05 a.m. and I would like to relieve the system a bit.
Hope to have answered your question.
greetings
Werner
Hallo HomeMaticFreunde wenn ich den Script kopiere und einfüge und dann die Fehlerprüfung starte bekomme ich folgende Meldung:
Error 1 at row 8 col 53 near ^;6.20) && (dom.GetObject(„Monat.Tag“).State()>3.19))
{ dom.GetObject(„J
Parse following code failed:
!
! *** Astronomische Jahreszeit berechnen
!
! *** Monat und Tag ermitteln und an Systemvariable Monat.Tag uebergeben
dom.GetObject(„Monat.Tag“).State( (0.01 * system.Date(„%d“).ToInteger()) + system.Date(„%m“).ToInteger());
!
! *** Fruehling (astronomisch) 20. Maerz bis 19. Juni
if ((dom.GetObject(„Monat.Tag“).State()<6.20) && (dom.GetObject(„Monat.Tag“).State()>3.19))
{ dom.GetObject(„Jahreszeit astronomisch“).State(0); }
!
! *** Sommer (astronomisch) 20. Juni bis 21. September
if ((dom.GetObject(„Monat.Tag“).State()<9.22) && (dom.GetObject(„Monat.Tag“).State()>6.20))
{ dom.GetObject(„Jahreszeit astronomisch“).State(1); }
!
! *** Herbst (astronomisch) 22. September bis 20. Dezember
if ((dom.GetObject(„Monat.Tag“).State()<12.21) && (dom.GetObject(„Monat.Tag“).State()>9.21))
{ dom.GetObject(„Jahreszeit astronomisch“).State(2); 020 }
!
! *** Winter (astronomisch) 21. Dezember bis 19. Maerz
if ((dom.GetObject(„Monat.Tag“).State()<3.20) || (dom.GetObject(„Monat.Tag“).State()>12.20))
{ dom.GetObject(„Jahreszeit astronomisch“).State(3); }
Ich bedanke mich für deine Hilfe
Gruß Helmut
Hallo Helmut,
ich habe gerade festgetellt, dass WordPress die Formatierung des Codes verändert. Im EDIT Modus wird der Code korrekt angezeigt. Wenn ich den Artikel mit einem Browser (unabhängig welcher) wird der Code verändert dargestellt. Du kannst das auch selbst im Artikel vergleichen.
Im Screenshot des WebUI Programmes siehst du den korrekten code.
Bin noch unterwegs und werde heute Abend versuchen das Problem zu beheben.
Gruss
Werner
Hallo Helmut,
der Code wird jetzt richtig formatiert angezeigt. Habe es getestet und es existiert kein Skript Fehler mehr.
Gruss
Werner
Hallo Werner,
der Fehler ist bei mir auch aufgetreten.
Habe die Scripte neu eingefügt, dann sind sie auch ohne Fehler durchgelaufen.
Nur zeigen beide Sys Variablen Frühling an, habe die Einstellungen im Zeitmodul mehrmals geändert.
Sind auch zwei Programme für meteo und astro angelegt worden, es bleibt bei Frühling.
mfg
herby
Hallo Herbert,
mein erster Eindruck ist das die Namen der Sys Variablen nicht mit dem Namen im Skript übereinstimmen. Wenn du eine Sys Variable vom Typ Werteliste anlegst, steht automatisch nach dem Anlegen der erste Wert in der Sys Variablen.
Wenn das nach dem Durchführen des Skriptes so bleibt, wird die angelegte Sys Variable nicht aktualisiert.
Bitte mal die Namen überprüfen und evtl. via Mail ein paar Screenshots senden.
Gruss
Werner
Hallo Werner,
kann man die LED-Kerzen für Advent auch als Notlicht benutzen, wenn der Strom ausfällt?
Über eine Funkschaltsteckdose?
Direkte Verknüpfung?
Separates Relai, oder nicht möglich?
Habe in den Foren nicht gefunden.
mfg
herby
Hallo Herby,
ist das Problem mit dem Frühling bei Dir behoben ?
Ich habe auch beide Sys Variablen:
„Jahreszeit meteorologisch“
„Jahreszeit astronomisch“
angelegt und habe die Programme gerade Manuell an meiner CCU3 unter
„Status und Bedienung“ gestartet. Es bleibt leider Frühling stehen ?
Zusätzlich bleibt die Sys Variable „Monat,Tag“ auf 0.00 stehen ?
Liebe Grüße
Martin
Hallo Martin,
bei mir läuft alles rund.
Es lag an den Namen, die müssen im Programm und Variable gleich sein.
Werner vom 29.12.19
mfg
herby