Feiertagsberechnung - Skript

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Petrus
Beiträge: 98
Registriert: 13.01.2010, 20:53

Feiertagsberechnung - Skript

Beitrag von Petrus » 13.01.2010, 21:36

Einleitung:

Die beiden Skripte "Feiertage" und "Urlaubstage" wurden komplett überarbeitet. Grund: Gegenüber der Ur-Version sollte ein Skript geschaffen werden, dass die Berechnungen der Feiertage nur 1x im Jahr durchführt - da sich diese ja auch in der Regel nicht ändern - und an den restlichen Tagen lediglich "nachschaut", ob ein Feiertag vorliegt. Zudem sollte die gesamte Berechnung so überarbeitet werden, dass nur noch mit Jahrestagen gerechnet wird. Das ermöglicht eine einheitliche Verwendung in beiden Skripten (Urlaubstage- & Feiertage-Skript) und vereinfacht sowohl die Auswertung, als auch in dem einen oder anderen Fall die Angabe eigener Feiertage. Zudem werden auch die Namen der Feiertage mit verarbeitet und, im Urlaubstageskript, können die Tage bis zum Urlaub angezeigt werden. Das erfolgt so zu sagen ganz nebenbei ohne zusätzlichen Programmcode.

Es existieren ab sofort für beide Skripte zwei Versionen. Eine "Complete-Version" und eine "Compact-Version".

Complete-Version: Ein voll funktionsfähiges, übersichtlich formatiertes und ausführlich kommentiertes Skript. Aufgrund seiner Größe ist diese Skript in erster Linie für die Ersteinrichtung oder zum testen gedacht. Ebenso ist dieses Skript für Anfänger zum ausprobieren (learning by doing) geeignet, da der Programmcode ausführlich dokumentiert ist. Es ist eine DEBUG-Funktion vorhanden, mit der man sich zu einem beliebigen Datum die Werte in der Testumgebung der WebUI ausgeben lassen und dadurch den Programmcode analysieren kann.

Compact-Version: Diese Variante ist für den Dauereinsatz gedacht. Es hat die selben Funktionen wie die Complete-Version, jedoch wurde der Programmcode reduziert (keine Formatierung, Kommentare ,DEBUG- sowie SV-Check-Funktion) => größen- sowie laufzeitoptimiert.

Beschreibung:

Skript Feiertage: Das Skript ermittelt anhand einer vorgegebenen Feiertagsliste, ob heute und/oder morgen ein Feiertag vorliegt und hinterlegt das Ergebnis in eine Systemvariable.
  • Die Berechnung der Feiertagsdaten erfolgt nur 1x jährlich. Die Prüfung auf Feiertag natürlich täglich.
  • Die Namen der Feiertage werden ebenfalls verarbeitet und chronologisch in einer Systemvariablen hinterlegt. Dadurch ist eine Auswertung in anderen Programmen bzw. Skripten möglich.
  • Berechnungen wurden überarbeitet: Ohne ToTime() und mit Jahrestagen statt mit Datumsangaben => Code kompakter.
  • Alle benötigten Systemvariablen können vom Skript automatisch angelegt und geprüft werden (deaktivierbar ; nur Complete-Skript) => weniger Arbeit beim Einrichten und für Anfänger geeignet.
Skript Urlaubstage: Das Skript ermittelt anhand vorgegebener Urlaubsdaten, ob heute und/oder morgen ein Urlaubstag ist und hinterlegt das Ergebnis in eine Systemvariable.
  • Abgelaufene, alte Daten werden automatisch aus dem Datensatz der SV entfernt => weniger Pflegeaufwand.
  • Datumsangaben mit Jahresangabe möglich, um auch über die Jahresgrenze hinweg in die Zukunft planen zu können.
  • Tage bis zum nächsten Urlaubstag werden - praktisch als Nebenprodukt - ebenfalls ermittelt und "optional" in einer SV abgelegt.
  • Urlaubsdaten in der SV können, müssen aber nicht, chronologisch angegeben werden (Einstellmöglichkeit).
  • Alle benötigten Systemvariablen können vom Skript automatisch angelegt und geprüft werden (deaktivierbar ; nur Complete-Skript) => weniger Arbeit beim Einrichten und für Anfänger geeignet.
Skript Feiertagsliste: Das Skript erzeugt eine Liste mit Feiertagsdaten. Hierzu definiert man im Skript lediglich seinen Standort und führt dieses bei der Ersteinrichtung 1x in der Testumgebung der WebUI aus. Die angezeigte Liste fügt man dann in das Skript Feiertage ein.
Dieses Skript wurde zwecks Codereduzierung aus dem ursprüngichen Feiertagsskript "entkoppelt" sowie aufgrund der Tatsache, dass man seine CCU in der Regel an ein und dem selben Standort betreibt.

Einrichtung Skript Feiertage: (ab Version 3)
  1. Gehe in der CCU unter "Programme und Verknüpfungen" -> "Programme und Zentralenverknüpfungen" -> "Skript testen" und füge dort das Skript "Feiertagsliste" ein. Definiere im Skript deinen Standort (Staat & Bundesland bzw. Kanton). Eventuell in den nachfolgende Zeilen noch einige Brauchtums- oder sonstige Feiertage. Klicke dann auf "Ausführen".
  2. Kopiere die im Ausgabefenster angezeigte Feiertagsliste und füge diese in das Skript "Feiertage - Complete" in Zeile 50 ein. Setze zudem in den Zeilen 88 und 90 die Systemvariablen auf die Werte b_debug=true und b_CheckSVs=true.
  3. Erstelle nun unter "Programme und Verknüpfungen" -> "Programme und Zentralenverknüpfungen" ein neues Programm. Unter "Bedingung: Wenn..." wählst du ein Zeitmodul, dass zum Zeitpunkt täglich nachts (Bsp. 00:05 Uhr) ausgeführt wird. Unter "Aktivität: Dann..." wählst du Skript aus und klickst auf die 3 Punkte. Dort fügst du das unter Punkt 2 von dir editierte Skript "Feiertage - Complete" ein und klickst 1x auf den Button "Ausführen". Im Ausgabefenster erhälst du nun die Bestätigung, dass die benötigten Systemvariablen automatisch angelegt wurden.
  4. Falls du das "Complete-Skript" dauerhaft einsetzen möchtest, dann setze in den Zeilen 88 und 90 die Systemvariablen wieder zurück auf die Werte b_debug=false und b_CheckSVs=false.
    Meine Empfehlung ist allerdings der Einsatz des Feiertage-Compact Skripts. Beim Compact-Skript musst du dann nur noch die unter Punkt 1. erzeugte Feiertagsliste einfügen.
Was tun, wenn sich Feiertage innerhalb eines Jahres ändern? (ab Version 3.03)

Die Berechnung der Feiertagsdaten erfolgt nur zu Jahresbeginn, da sich die Feiertage "in der Regel" nicht ändern. Sollten sich die Feiertage doch einmal im laufenden Jahr ändern, weil z. B. der Gesetzgeber dieses so entschieden hat, dann kann man die Berechnung, wie nachfolgend beschrieben, erzwingen.
  1. Gehe zum Programm, dass täglich das Feirtagsskript aufruft und öffne das Skript zum bearbeiten.
  2. Korrigiere die Feiertagsliste in der Systemvariable s_Feiertage entsprechend.
  3. Setzte danach im Skript die Variable b_calc=true (Im Complete-Skript Zeile 91) und klicke im Editorfenster einmal auf "Ausführen". Damit werden die neuen Feiertagsdaten berechnet.
  4. Abschließend die Skriptvariable wieder auf den Standardwert zurücksetzen b_calc=false.
Einrichtung Skript Urlaubstage: (ab Version 4)
  1. Gehe in der CCU unter "Programme und Verknüpfungen" -> "Programme und Zentralenverknüpfungen" -> "Skript testen" und füge dort das Skript "Urlaubstage - complete" ein.
  2. Setze zudem in den Zeilen 89 und 91 die Systemvariablen auf die Werte b_debug=true sowie b_CheckSVs=true und klicke dann auf "Ausführen". Im Ausgabefenster erhälst du nun die Bestätigung, dass die benötigten Systemvariablen automatisch angelegt wurden.
  3. Abschließend erstellst du nun ein Programm mit der Bedingung, dass dieses 1x täglich (z.B. um 0:01Uhr) ausgeführt wird. Unter Aktivität kannst du entweder das Urlaubstage-Complete oder (vorzugsweise) das Urlaubstage-Compact Skript einfügen. Solltest du dich für das Complete-Skript entscheiden, dann natürlich mit b_debug=false.
Ergänzender Hinweis: Die Systemvariable "Urlaubstage" wird vom Complete-Skript automatisch als "Zeichenkette" deklariert. Dadurch wird ermöglicht, dass man die Urlaubsdaten in Apps, wie z.B. PocketControl, direkt eingeben kann. Für den Fall, dass man - wie beim alten Skript V3.01 - die Urlaubsdaten in der WebUI der CCU eingeben möchte, muss man den Typ der Systemvariablen "Urlaubstage" auf "Werteliste" ändern.

Gruß
Petrus

P.S. Die alten Scripte (Feiertage_V2.4.txt und Urlaubstage_V3.01.txt) lasse ich weiterhin im Anhang stehen.

Changelog Feiertagsliste
- V2: Reformationstag für Niedersachsen ergänzt.
- V2.1: Reformationstag für Hamburg, Bremen und Schleswig-Holstein hinzugefügt
- V2.2: Frauentag für Berlin hinzugefügt
Dateianhänge
Feiertage_V3.03_compact.txt
Abfrage: Heute und morgen
( 6 Systemvariablen erforderlich )
(4.39 KiB) 37-mal heruntergeladen
Feiertage_V3.03_complete.txt
Abfrage: Heute und morgen
( 6 Systemvariablen erforderlich )
(15.03 KiB) 59-mal heruntergeladen
Feiertagsliste_V2.2.txt
Erzeugung der Feiertagsliste DE, AT, CH
für Feiertagskript ab V3
(6.89 KiB) 44-mal heruntergeladen
Urlaubstage_V4.03_complete.txt
Code mit ausführlicher Beschreibung
( 4 Systemvariablen erforderlich )
(15.07 KiB) 132-mal heruntergeladen
Urlaubstage_V4.03_compact.txt
Nur Code, ohne Beschreibung
( 4 Systemvariablen erforderlich )
(3.42 KiB) 69-mal heruntergeladen
Feiertage_V2.4.txt
Abfrage: Heute und morgen - inkl. Österreich
( 2 Systemvariablen erforderlich )
(12.53 KiB) 221-mal heruntergeladen
Urlaubstage_V3.01.txt
Abfrage: Heute und morgen
( 3 Systemvariablen erforderlich )
(7.85 KiB) 3485-mal heruntergeladen
Zuletzt geändert von Petrus am 10.02.2019, 14:34, insgesamt 65-mal geändert.

Benutzeravatar
kaju74
Beiträge: 2025
Registriert: 06.03.2007, 13:14
Kontaktdaten:

Re: Feiertagsberechnung - Skript

Beitrag von kaju74 » 13.01.2010, 21:42

Hallo.

Vielen Dank für Deinen Beitrag - wenn Du nichts dagegen hast, würde ich Dein Skript mit entsprechendem Author-Vermerk bei mir aufnehmen...

Lieben Gruß,
kaju

Petrus
Beiträge: 98
Registriert: 13.01.2010, 20:53

Re: Feiertagsberechnung - Skript

Beitrag von Petrus » 13.01.2010, 22:14

Hallo kaju74,

freut mich das es dir gefällt. Klar kannst du das Skript bei dir aufnehmen.

Gruß
Peter
Zuletzt geändert von Petrus am 14.01.2010, 21:46, insgesamt 1-mal geändert.

erik
Beiträge: 751
Registriert: 31.10.2007, 13:32

Re: Feiertagsberechnung - Skript

Beitrag von erik » 13.01.2010, 23:45

RESPEKT!

Absolut genial und wird sofort eingebaut :-)

Grüße

Erik

Benutzeravatar
Zauberlehrling
Beiträge: 113
Registriert: 13.12.2009, 23:01

Re: Feiertagsberechnung - Skript

Beitrag von Zauberlehrling » 21.01.2010, 20:22

Wow :)

Darf ich mir das "klauen" und auch wo anders verwenden ? ... Ich muss gerade für einen Kunden einen intelligenten Scheduler basteln, damit er immer alle Kontoauszüge von einem Monat bekommt naja und irgendwann fällt ja auch ein variabler Feiertag auf den 1. oder 31. :D
Grüße
-- Der Zauberlehrling

Wenn der Ansatz bereits falsch ist, führt strenge Logik unweigerlich zum falschen Ergebnis;
Nur Unlogik kann dann noch helfen, wenigstens zufällig richtig zu liegen!

--------------------------------------------
HM1 (Raspimatic): 285 Kanäle in 117 Geräten,
HM2 (Raspimatic): 71 Kanäle in 36 Geräten:,
HM3 (CCU2): 8 Kanäle in 7 Geräten,
HM4 (CCU1): 6 Kanäle in 4 Geräten
--------------------------------------------

sambasamba
Beiträge: 1482
Registriert: 16.08.2009, 23:18
Wohnort: Landau/Südpfalz

Re: Feiertagsberechnung - Skript

Beitrag von sambasamba » 23.01.2010, 11:31

ich schlage eine kleine Ergänzung vor: zwei weitere Variable 'Wochenende' und 'Arbeitstag' .
'Arbeitstag' ist wahr von Mo-Fr wenn kein Feiertag.
'Wochenende' ist wahr am Sa./So.

Fast kein zusätzlicher Aufwand, und würde ne Menge webUI-Programme deutlich vereinfachen.
Schonmal danke!
Volkmar

Petrus
Beiträge: 98
Registriert: 13.01.2010, 20:53

Re: Feiertagsberechnung - Skript

Beitrag von Petrus » 23.01.2010, 13:31

@Zauberlehrling
Sorry das ich erst jetzt antworte. Muss mal nachsehen, ob man irgendwo "Autobenachrichtigung" einstellen kann, wenn hier jemand postet.
Das Skriptt kannst du gerne verwenden. Nichts dagegen.

@sambasamba
Wenn du die beiden Systemvariablen eingerichtet hast und ich dich auch richtig verstanden habe, dann brauchst du nur den Code (siehe Feiertagsscript, unter Ergänzung / Option) dem Feiertagsskript am Ende anhängen.

Welche WebUI Programme werden denn bei dir dadurch vereinfacht? Nur mal so aus Neugier. :wink:
Zuletzt geändert von Petrus am 23.01.2010, 19:37, insgesamt 1-mal geändert.

sambasamba
Beiträge: 1482
Registriert: 16.08.2009, 23:18
Wohnort: Landau/Südpfalz

Re: Feiertagsberechnung - Skript

Beitrag von sambasamba » 23.01.2010, 14:28

Mann, das nenne ich prompte Erledigung, danke!

Bei mir vereinfachts ein script was morgens die Rolladen aufmacht.
Das geht so:
- am WoE oder Feiertag :wink: wird um 9:30 aufgemacht.
- sonst (also Arbeitstag):
wird um 7:20 aufgemacht, wenn es draußen schon hell ist (weil ich da aufstehe)
wenn es aber um 7:20 noch dunkel ist dann wird erst aufgemacht wenns hell ist.
--
ich denke aber die Erweiterung kann jeder brauchen der abhängig von 'ich muß ins Büro' (==Arbeitstag) was tun oder lassen will.
Volkmar
Suche jemand der einen ETA-Pelletkessel an HM angeflanscht hat.
2x CCU2, Garagentor, Hoflicht, Keymatic, Rolladen, Raumthermostate, wired Zweipunktregelung von Gas-Warmlufterhitzern und Gasthermen.

Petrus
Beiträge: 98
Registriert: 13.01.2010, 20:53

Re: Feiertagsberechnung - Skript

Beitrag von Petrus » 23.01.2010, 15:24

Hallo Volkmar,

hast du einen Helligkeitssensor den du in diesem Zusammenhang mit auswertest?

Ich regle meine Rolladen so, indem ich eine Systemvariable "Tageszeit" auf "Tag" bzw. "Nacht" setze, in Abhängigkeit vom Wochentag und einer bestimmten Uhrzeit. Nun würde ich gerne zur Perfektion auch noch die Sonnenauf- und Sonnenuntergangszeiten in dem Script, welches diese Systemvariable setzt, auslesen und mit auswerten. Ich meine die, die auf der Startseite im WebUI angezeigt werden.

Frage:
Hast du eine Idee, wie ich die Sonnenauf- und Sonnenuntergangszeit direkt im Script auslesen kann?

Gruß
Peter

Benutzeravatar
kaju74
Beiträge: 2025
Registriert: 06.03.2007, 13:14
Kontaktdaten:

Re: Feiertagsberechnung - Skript

Beitrag von kaju74 » 23.01.2010, 15:50

Hallo.

Die Astrozeiten lassen sich wie folgt auslesen (Ausschnitt aus: Tageszeit in Abschnitte unterteilen)

Code: Alles auswählen

real c_tagesbeginn = (0.01 * system.SunriseTime("%M").ToInteger()) + system.SunriseTime("%H").ToInteger();
real c_tagesende = (0.01 * system.SunsetTime("%M").ToInteger()) + system.SunsetTime("%H").ToInteger();

Lieben Gruß,
kaju

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“