, , , , , , , ,

Homematic – Erweiterung des Zeitmodules 01 – Berechnung von Feiertagen

Das Zeitmodul von HomeMatic bietet uns schon eine Menge an Planungsmöglichkeiten an, aber dass ein oder andere fehlt dann doch noch. In dieser Mini-Serie möchte ich euch drei Erweiterungen vorstellen, mit denen ihr das Zeitmodul deutlich „aufbohren“ könnt und keine Wünsche mehr offenbleiben. Seit Jahren verwende ich in meiner HomeMatic Installation ein Skript zur Berechnung von Feiertagen aus dem HomeMatic Forum. Über dieses Skript kann ich mit meiner Haussteuerung auf Feiertage reagieren und beispielsweise die Rollläden später hochfahren, um länger zu schlafen. Der Autor des Skripts hat eine komplette Überarbeitung vorgenommen und ich möchte diese Möglichkeit über diesen Artikel hier auch anderen Anwendern näherbringen. Vielen Dank an Peter, den Autor des Feiertags Skriptes, der im Forum unter dem Namen „Petrus“ unterwegs ist, für seine Freigabe sein Skript hier zu beschreiben. Es ist aus meiner Sicht eines der unverzichtbaren Skripte für HomeMatic, In diesem Artikel versuche ich euch das Skript bzw. dessen Einbindung in eure HoemMatic Zentrale zu erklären. Dadurch erweitern sich die Möglichkeiten des HomeMatic Zeitmodules erheblich. Damit haben wir auch der CCU2/CCU3 sowie den Partnerlösungen piVCCU udn RaspberryMatic die Option „Feiertage“ in die Automation mit aufzunehmen. Bei HomeMatic IP ist dies nicht möglich.

Allgemeines

Die Planung von Aktionen in unserem smarten Zuhause kann mit Hilfe vom HomeMatic schon recht komfortabel gesteuert werden. Über das sogenannte Zeitmodul sind wir in der Lage fast alle Planungsvarianten einzugeben und beispielsweise die Rollläden hoch- bzw. runter zu fahren.

Das HomeMatic Zeitmodul bietet viele Möglichkeiten, aber keine Feiertags Option

Sind die Motoren der Rollläden der letzten Jahre auch immer leiser geworden, so wecken diese in der Regel schon auf, wenn man noch im Bett liegt und schläft. Das ist dann ein wenig ärgerlich, wenn es sich um einen Feiertag handelt und wir eigentlich länger schlafen könnten.

Eine machbare Möglichkeit wäre über eine Variable zu steuern das die Rollladen morgens nicht hoch gehen. Aber der Tag wird kommen, wo man das abends vergisst.

Da ist die Lösung über das hier beschriebene Feiertags Skript die deutlich bessere Variante. Mit diesem Skript ist es möglich täglich zu prüfen ob ein Feiertag vorliegt und entsprechende Systemvariablen mit diesen Informationen zu füllen. Somit ist es dann sehr einfach möglich in den Programmen zur Steuerung der Rollläden diese Variablen abzufragen und bei einem Feiertag beispielsweise eine Stunde später hochzufahren.

Das Skript ist so komfortabel geschrieben, dass der Anwender mit wenigen einfachen Eingaben seinen Wohnort (Deutschland, Österreich oder Schweiz), sowie das entsprechende Bundesland auszuwählen. Damit sind dann die Grundeinstellungen für das Skript auch schon gesetzt und man kann als zusätzliche Option noch „eigene Feiertage bzw. Sondertage“ definieren. Aus der Erstellung der benötigten Systemvariablen wird im Skript automatisch durchgeführt, wodurch eine immer wieder auftauchende Fehlerquelle eliminiert wurde.

Beschreibung des Scripts

Das Feiertags Skript ist so gut geschrieben und auch die Dokumentation ist so umfangreich, dass es auch für den Einsteiger in die Welt der Skripte einfach sein sollte, diese Option in seiner Installation zu nutzen.

Es werden in Summe sechs Systemvariablen von unterschiedlichen Typen verwendet. Aber damit braucht sich der Anwender nicht näher beschäftigen. Selbst das Anlegen dieser Systemvariablen übernimmt das Skript selbst.

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.

Es existieren ab sofort 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 dieses 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 dieselben Funktionen wie die Complete-Version, jedoch wurde der Programmcode reduziert (keine Formatierung, Kommentare, DEBUG- sowie SV-Check-Funktion) => größen- sowie laufzeitoptimiert.

Skript Teil 01 – Skript für die Erstellung der Feiertagsliste

Dieses 1. Skript zur Berechnung der Feiertage dient dazu, die Feiertage und Ereignistage in der jeweiligen Region (Staat, Bundesland, usw.) festzulegen.

Da man seine CCU im Normalfall ja an ein und demselben Standort betreibt, wurde die ursprüngliche Version des Skripts zwecks Codereduzierung aufgeteilt. Der Part zur Erzeugung der Feiertagsliste wurde vom eigentlichen Feiertagsskript „entkoppelt“ und in ein eigenes Skript gepackt. Dieses Skript zur Erstellung der persönlichen Feiertagsliste ist nach der Parametrisierung nur noch einmal durchzuführen.

Was genau in diesem ersten Teil Einzugeben ist, wie ihr die erzeugte Feiertagsliste kontrollieren und in das eigentliche Skript zur Berechnung der Feiertage kopieren müsst, erkläre ich euch in diesem ersten Kapitel.

Download der Scripte

Die jeweils aktuelle Version der Feiertag Skripts könnt ihr HIER herunterladen.

Ich mache das in der Regel so, das ich mir das jeweilige Script wie folgt auf meinen Rechner hole.

Skript zur Erstellung der Feiertagsliste

Wie oben markiert, klicke ich auf „ALLES AUSWÄHLEN“. Dadurch wird das Skript komplett markiert. Mit der Tastenkombination „Strg + C“ kopiere ich den Code in die Zwischenablage. Anschließend füge ich diesen mit der Tastenkombination „Strg + V“ in ein leeres Word Dokument oder Editor ein.

Wenn ihr dieses Dokument dann speichert, habt ihr das Skript in seiner Ursprungform auf eurem PC und könnt nun im nächsten Schritt die notwendigen Anpassungen vornehmen.

Anpassung Skript 01

Da die Feiertags Berechnung sich natürlich an dem jeweiligen Standort der HomeMatic Zentrale orientieren muss, müssen wir in diesem Script folgendes anpassen:

Staat und Bundesland auswählen

Die erste Anpassung definiert für welchen Staat die Feiertage berechnet werden sollen. Zur Auswahl stehen hier Deutschland, Schweiz und Österreich. Bitte das jeweilige Kennzeichen eingeben. In meinem Beispiel „DE“.

Nun ist zu definieren für welches Bundesland die Feiertage berechnet werden sollen. In meinem Beispiel „NW“ für Nordrhein-Westfalen.

Weitere Parameter definieren

Lebt ihr in einem Bundesland, wo Fronleichnam noch ein Feiertag ist, (Sachsen oder Thüringen) müsst ihr „boolean Fronleichnam = 0″ in boolean Fronleichnam = 1“ ändern. Dadurch wird dieser Tag im Script als Feiertag behandelt.

Lebt ihr in Österreich und habt entsprechend den „Staat“ definiert, so könnt ihr im nächsten Block festlegen welche Tage Feiertage sind.

Im letzten Block ist noch zu definieren, ob die angegebenen Tage als Feiertage gelten sollen. In meinem Beispiel ist der Rosenmontag kein Feiertag. Silvester und Heiligabend jedoch sind Feiertage, da ich an diesen Tagen frei habe.

Wenn ihr die beschriebenen Parameter alle an den jeweiligen Standort angepasst habt, könnt ihr das Word Dokument (am besten mit einem angepassten Namen) speichern, damit ihr einen Unterschied zum Original habt.

Skript 01 ausführen und Ausgabe speichern

Dazu öffnet in in der WebUi das folgende Menü:  
Startseite > Programme und Verknüpfungen > Programme

Testumgebung für das 1. Skript

Nachdem ihr im Programm Menü seit, klickt ihr dort bitte auf „Skript testen“. Es öffnet sich ein Fenster welches in zwei Bereiche unterteilt ist. Das sind „Eingabe“ und „Ausgabe“.

In das Feld Eingabe kopiert ihr aus dem eben erzeugten angepassten Word Dokument den kompletten Code hinein.

Anschließend klickt ihr auf „Ausführen“ und in dem Bereich „Ausgabe“ bekommt ihr die Feiertagsliste entsprechend euren Definitionen.

Feiertagsliste wurde erstellt

Im Ausgabebereich findet ihr dann die Feiertagsliste. Diese bitte nun auch komplett kopieren und ebenfalls in einem Work Dokument zwischenspeichern.

Feiertagsliste komplett

Oben seht ihr die komplette Feiertagsliste für meinen Standort. Diese weicht natürlich ab, wenn ihr einen anderen Standort gewählt habt. Ich habe die Liste deshalb ebenfalls in einem Word Dokument gespeichert, da ich es später noch benötige.

Erstellte Feiertagsliste in Feiertagsscript kopieren

  1. Kopiere die 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.
  2. 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.
  3. 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.
    Die Empfehlung des Autors ist allerdings der Einsatz des Feiertage-Compact Skripts. Beim Compact-Skript musst du dann nur noch die erzeugte Feiertagsliste einfügen.

Nachfolgend seht ihr das WebUI Programm zur täglichen Berechung der Feiertage

Systemvariablen

Nachdem das Skript zur Feiertagsberechnung erstmalig gelaufen ist, sind die benötigten Systemvariablen erstellt und mit den aktuellen Werten gefüllt worden. Nachfolgend seht ihr die Systemvariablen. Einmal unter Einstellungen und zweitens unter Status und Bedienung:

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, das täglich das Feiertagsskript 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.

Fazit

Nachdem ihr die obigen Schritte durchgeführt habt, wird jede Nacht um 00:05 Uhr berechnet ob Heute oder Morgen ein Feiertag ist. Zusätzlich habt ihr auch den Namen des Feiertages, welchen ihr ebenfalls in Programmen abfragen könnt.

Damit seid ihr in der Lage beispielsweise eure Rollladen an Feiertagen ähnlich wie am Wochenende später hochzufahren. Die Variable Feiertag-Morgen könnt ihr beispielsweise am Tag vor dem Feiertag nutzen, um die Heizung länger laufen zu lassen.

Passend zur startenden Weihnachtszeit beschreibe ich in einem weiteren Artikel, wie ihr dieses Skript verwenden könnt, um den 1. bis 4. Advent zu berechnen, um zum Beispiel die Weihnachtsbeleuchtung zu steuern oder einen Adventskranz mit smarten Kerzen entsprechend zu verwenden.

11 Kommentare
  1. Alan
    Alan sagte:

    Guten Tag zusammen!
    Ich arbeite mich gerade durch die Erstellung der Scripts durch aber an einer Stelle passt die Beschreibung nicht zum Gesehenen.
    Unter „Erstellte Feiertagsliste in Feiertagsscript kopieren“, Punkt 2 steht:
    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. => OK
    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… => OK
    klickst 1x auf den Button „Ausführen„. => Den Button gibt es nicht. Ich habe Abbrechen und OK aber sonst nichts.
    Screenshot habe ich gemacht. Kann ich den irgendwie schicken?

    Irgendwo habe ich wahrscheinlich etwas nicht beachtet :-(

    Aber wo?

    Antworten
    • Holger
      Holger sagte:

      Hi Alan,
      den Menüpunkt „Ausführen“ findest du ziemlich mittig auf der Seite und nicht unten, darüber ist noch der Button „Fehlerprüfung“.
      Ich hoffe dies hilft Dir weiter.

      Viele Grüße

      Antworten
      • Alan
        Alan sagte:

        Hi Holger!
        Danke für die schnelle Rückmeldung!
        Ich habe aber trotzdem den Button nicht.
        Im mittleren Teil sehe ich die Eingabefelder $Val$ etc., rechts davon im weißen Feld ist der Button „Fehlerprüfung“ aber das war’s.
        Kann man Screenshots irgendwie teilen? Dann siehst man es.
        Ich habe auch das Fenster etwas breiter gezogen, falls der Button einfach versteckt war. Hat nicht geholfen.

        Hmmm.
        Wat nu?

        Antworten
        • Holger
          Holger sagte:

          Bei mir ist der Button genau in der genannten Zeile.
          Verwendest Du eine CCU oder Raspberrymatic? Ich weiß nicht ob es da noch Unterschiede gibt, ich verwende jedenfalls Raspberrymatic.
          Banaler Vorschlag, hast Du es mal mit einem anderen Browser getestet oder die CCU mal rebootet?
          Eine andere Idee habe ich auch nicht mehr.
          Bilder kann man hier ja nicht teilen.
          Viel Erfolg noch.

          Antworten
  2. Holger
    Holger sagte:

    Hallo Werner,
    vielen Dank für das tolle Skript was auch gut beschrieben ist.
    Eigentlich sollte es ja nicht so schwer sein, ich scheitere aber beim erstellen des Skripts (Punkt 2).
    Ich bekomme immer die Meldung „Feiertag-Daten : SV-Object not found. Script terminated!“ ausgeworfen, sowohl bei der Original Datei als auch bei der angepassten.
    Trotz aller Bemühungen, mehrfacher Reboot, Kaltstart, Firmwareupdate und auch Recherche konnte ich diesen Fehler nicht beseitigen.
    Ich nutze Raspberrymatic auf einem Raspi.
    Hast Du einen Tipp für mich?
    Danke vorab.

    Beste Grüße und einen schönen Vatertag.
    Holger

    Antworten
    • Holger
      Holger sagte:

      Habe den Fehler gefunden.
      Ursache war, dass ich die Werte b_debug=true und b_CheckSVs=true nicht korrekt gesetzt habe.

      Antworten
  3. Klaus Kegel
    Klaus Kegel sagte:

    Im Skript soll man ja auch eigene Feiertage einpflegen können.
    In welcher Zeile muß ich meine eigenen Werte eintragen damit es auch in der
    richtigen Variable geschrieben wird

    Antworten
  4. Helmut Riethmeier
    Helmut Riethmeier sagte:

    Hallo Hometic Freund, du schreibst in deinem Artikel wie man die Scripte änder soll, daß ganze immer mit Zeilennummern
    angabe soweit so Gut nur in deiner TxT datei gibt es keine Zeihlennummer.
    das als Info.
    Gruß Helmut

    Antworten
    • Werner
      Werner sagte:

      Hallo Helmut,

      im Artikel findest du den Link zur Originalseite des Feiertags Skriptes. Bitte schaue dir dort die Original Doku und die Skriptdatei an.

      Wenn das nicht reicht, melde dich einfahc noch einmal.

      Gruss
      Werner

      Antworten

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert