Feiertagsberechnung - Skript

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

Moderator: Co-Administratoren

Petrus
Beiträge: 134
Registriert: 13.01.2010, 20:53
Hat sich bedankt: 1 Mal
Danksagung erhalten: 25 Mal

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 komplette Code-Zeile inkl. der Feiertage und ersetze im Skript "Feiertage - Complete" die vorhandene Beispielzeile. Setze zudem die Systemvariablen b_debug und b_CheckSV jeweils auf den Wert true (Ab Zeile 117).
  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 (z.B. 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 jetzt das "Complete-Skript" dauerhaft einsetzen möchtest, dann setze die Systemvariablen b_debug und b_CheckSVs wieder zurück auf den Wert false.
    Meine Empfehlung ist allerdings der Einsatz des Feiertage-Compact Skripts. Beim Compact-Skript musst du dann nur noch die unter Punkt 1. erzeugte komplette Code-Zeile mit den Feiertagen einfügen bzw. die vorhandene Beispielzeile ersetzen.
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. Generiere mit Hilfe des Skripts "Feiertagsliste" eine Code-Zeile mit den neuen Feiertagen und füge diese in das Feiertagsskript ein.
  3. Setzte danach im Skript die Variable b_calc auf den Wert true (Im Complete-Skript Zeile 121) und klicke im Editorfenster einmal auf "Ausführen". Damit werden die neuen Feiertagsdaten berechnet.
  4. Setzte abschließend die Skriptvariable b_calc wieder auf den Standardwert (false) zurück.
Einrichtung Skript Urlaubstage: (ab Version 4)
  1. Gehe in der CCU unter "Programme und Verknüpfungen" -> "Programme und Zentralenverknüpfungen" und erstelle ein neues Programm mit der Bedingung, dass dieses 1x täglich (z.B. um 0:01Uhr) ausgeführt wird.
  2. Unter Aktivität füge das Urlaubstage-Complete Skript ein und setze in den Zeilen 89 und 91 die Systemvariablen b_debug und b_CheckSVs jeweils auf true und klicke dann einmal auf "Ausführen". Im Ausgabefenster erhälst du nun die Bestätigung, dass die benötigten Systemvariablen automatisch angelegt wurden.
  3. Wenn du das Urlaubstage-Complete Skript verwenden möchtest, dann setze in den Zeilen 89 und 91 die Systemvariablen b_debug und b_CheckSVs wieder zurück auf false und klicke dann auf "OK".
    Alternativ kannst du aber auch das Complete-Skript löschen und durch das identische Compact-Skript ersetzen.
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


Downloads

Feiertage - aktuelle Skripte:
.
Feiertage_V3.1_compact.txt
Code identisch mit Complete-Skript.
Jedoch kompakt, ohne Beschreibung und ohne Variablencheck.
( 3 bis 6 Systemvariablen erforderlich )
(4.54 KiB) 1966-mal heruntergeladen
Feiertage_V3.1_complete.txt
Abfrage: Heute und morgen
( 3 bis 6 Systemvariablen erforderlich )
(17.66 KiB) 2483-mal heruntergeladen
Feiertagsliste_V3.1.txt
Erzeugung der Feiertagsliste DE, AT, CH
für Feiertagskript ab V3
(8.77 KiB) 774-mal heruntergeladen
.
Urlaubstage - aktuelle Skripte:
.
Urlaubstage_V4.07_compact.txt
Code identisch mit Complete-Skript V4.08.
Jedoch kompakt, ohne Beschreibung und ohne Variablencheck.
( 4 Systemvariablen erforderlich )
(3.88 KiB) 442-mal heruntergeladen
Urlaubstage_V4.08_complete.txt
Code mit ausführlicher Beschreibung
( 4 Systemvariablen erforderlich )
(16.67 KiB) 273-mal heruntergeladen
.
Urlaubstage - Spezialscript:
Aufgrund der Nachfrage einiger Forenuser habe ich das Originalskript erweitert.
Neben Urlaub-Heute/-Morgen werden im Skript auch Schulferien-Heute/-Morgen und Wochenende-Heute/-Morgen mit verarbeitet.
Downloads: HIER
.
Alte Skripte - nicht mehr weiterentwickelt:
.
Feiertage_V2.4.txt
Abfrage: Heute und morgen - inkl. Österreich
( 2 Systemvariablen erforderlich )
(12.53 KiB) 644-mal heruntergeladen
Urlaubstage_V3.01.txt
Abfrage: Heute und morgen
( 3 Systemvariablen erforderlich )
(7.85 KiB) 3836-mal heruntergeladen
Zuletzt geändert von Petrus am 06.11.2022, 14:42, insgesamt 83-mal geändert.

Benutzeravatar
kaju74
Beiträge: 2050
Registriert: 06.03.2007, 13:14
Danksagung erhalten: 19 Mal
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: 134
Registriert: 13.01.2010, 20:53
Hat sich bedankt: 1 Mal
Danksagung erhalten: 25 Mal

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: 776
Registriert: 31.10.2007, 13:32
Hat sich bedankt: 6 Mal
Danksagung erhalten: 6 Mal

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: 136
Registriert: 13.12.2009, 23:01
Danksagung erhalten: 3 Mal

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, Raspi 3B): 160 Geräte,
HM2 (Raspimatic, Raspi 3B): 36 Geräte,
HM3 (Raspimatic, Raspi 3B): 16 Geräte,
--------------------------------------------

sambasamba
Beiträge: 1600
Registriert: 16.08.2009, 23:18
Wohnort: Landau/Südpfalz
Hat sich bedankt: 20 Mal
Danksagung erhalten: 4 Mal

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: 134
Registriert: 13.01.2010, 20:53
Hat sich bedankt: 1 Mal
Danksagung erhalten: 25 Mal

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: 1600
Registriert: 16.08.2009, 23:18
Wohnort: Landau/Südpfalz
Hat sich bedankt: 20 Mal
Danksagung erhalten: 4 Mal

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

CCU2+Raspimatic+wired, Garagentor, Hoflicht, Keymatic, Rolladen, 25 Raumthermostate, Raumüberwachung, Zweipunktregelung von Heizgeräten, Ventilator- / Klima-Anlagensteuerungen.

Petrus
Beiträge: 134
Registriert: 13.01.2010, 20:53
Hat sich bedankt: 1 Mal
Danksagung erhalten: 25 Mal

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: 2050
Registriert: 06.03.2007, 13:14
Danksagung erhalten: 19 Mal
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!“