Feiertagsvariablen im HC2

Advertisements

Leider (oder zum Glück?) sind wir mit der Technologie noch nicht so weit, dass das Home Center eigene Entscheidungen trifft oder gar mitdenkt. Alle Automatismen im Smart Home basieren auf Einsen und Nullen bzw. logischen Abläufen und Bedingungen. So kennt das Home Center einen Kalender, Monate, Tage und so weiter. Alles logische und wiederkehrende Dinge die nahezu überall identisch sind. Sobald es aber individueller wird kommen die Einsen und Nullen schnell an ihre Grenzen. Beispielsweise bei Feiertagen. Diese sind in Deutscland je nach Bundeslang unterschiedlich und fallen auch nicht jedes Jahr auf denselben Tag. In diesem Artikel stelle ich eine Schnittstelle vor, mit deren Hilfe eine Feiertagsvariable im HC2 gefüllt wird.

Feiertagsvariable

Feiertagsvariable

Update

06.01.2019: Es gibt nun auch die Möglichkeit den eigenen Google Kalender als Quelle für Feiertage und andere Termine zu verwenden. Hier geht es zum entsprechenden Artikel.

Warum Feiertage?

Kalenderdaten in das Home Center zu integrieren ist eine große Herausforderung. Die Daten müssen in einem geeigneten Format geliefert werden um sie mit Lua verarbeiten zu können. Das gängigste Format ist JSON, denn JSON lässt sich schnell und sauber in ein Array bzw. eine Table wandeln und die Daten sicher verwenden.

Aber warum gerade Feiertage? Unsere Feiertage lassen sich mathematisch berechnen, jedoch ist ein Feiertag in Bayern noch lange keiner in Hamburg und schon gar nicht in der Schweiz oder Italien. Für jede Region gibt es individuelle Feiertage. Diese Daten stelle ich ab sofort über eine Webschnittstelle zur Verfügung.

Feiertagsvariable im HC2

Feiertagsvariable im HC2

Feiertagsvariablen im HC2

Die Feiertage kannst Du nun bequem und ohne viel Aufwand über das Internet beziehen und mit der hier vorgestellten Szene verarbeiten lassen. Es ist weder ein lokaler Webserver notwendig, noch müssen die Feiertage manuell in die Szene eingetragen werden. Lediglich eine Internetverbindung des Home Center ist vorausgesetzt.

Einfach in der Konfiguration der Szene Dein Bundesland hinterlegen und schon kann es losgehen.

APIbl			= 'NI' --BW, BY, BE, BB, HB, HH, HE, MV, NI, NRW, RP, SL, SN, ST, SH ,TH
gVarStateToday		= "holidayToday"
gVarNameToday		= "holidayTodayName"
gVarStateTomorrow	= "holidayTomorrow"
gVarNameTomorrow	= "holidayTomorrowName"
advDebug		= true
version 		= 'v1.0'

Kürzel der Bundesländer: BW, BY, BE, BB, HB, HH, HE, MV, NI, NRW, RP, SL, SN, ST, SH ,TH

Scheduler Konfiguration

Der Scheduler lässt sich mit den folgenden Variablen konfigurieren.

---------------------------------------------------
------------- Timer Config ------------------------
scheduler			= true
startTime			= '00:01' -- Zeitpunkt des Datenabrufs
  • scheduler = Einen Timer aktivieren (true) oder nicht (false)
  • startTime = Die Uhrzeit für den Timer im Format (HH:mm)

Ist kein Timer konfiguriert benötigt die Szenen im Header einen Trigger um automatisch ausgeführt zu werden. Weiterhin ist der Autostart zu entfernen. Im Beispiel dient die globale Variable TimeOfDay als Trigger.

--[[
%% properties
%% globals
TimeOfDay
--]]

Globale Variablen

Weiterhin erstellt die Szene 4 globale Variablen mit den in der Konfiguration hinterlegten Namen (Achtung; unbedingt VOR dem ersten Speichern anpassen). Ich empfehle die Namen unverändert zu lassen, da ich in weiteren Szenen auf diese verweisen werden.

Szene manuell starten

Neben dem Scheduler und möglichen Triggern kann der Abruf der Daten auch manuell erfolgen. Hierfür ist die Anzahl der maximalen Instanzen der Szene auf mindestens 2 zu stellen.

Feiertagsvariable Szenen Konfiguration

Feiertagsvariable Szenen Konfiguration

Mit der Betätigung des Start-Button in der Konfiguration wird die Szenen gestartet und die Daten von ical2json abgerufen. Der Scheduler bleibt davon unberührt.

Ablauf und Trigger der Szene

Die Szene fragt bei mkshb.de die JSON Daten für das angegebene Bundesland ab und vergleicht anhand der Daten, ob heute und/oder morgen ein Feiertag ist. Wenn dem so ist, werden bis zu 4 globale Variablen gesetzt:

  • holidayToday = 1
  • holidayTodayName = Name des heutigen Feiertages
  • holidayTomorrow = 1
  • holidayTomorrowName = Name des morgigen Feiertages

Download

Changelog

Version 0.3 (24.12.2016)

  • Bugfix
  • Code optimiert

Version 0.4 (26.12.2016)

  • Bug korrigiert: Variablen wurde unter bestimmten Bedingungen nicht richtig gesetzt

Version 0.5 (28.12.2016)

  • Scheduler Konfiguration hinzugefügt
  • Manuelles ausführen ermöglicht

Version 0.6 (28.12.2016)

  • „Feiertag morgen“ hinzugefügt
  • Globale Variablen umbenannt
    • Bitte vor dem Update die globalen Variablen holidayToday und holidayName löschen

Version 1.0 (21.06.2018)

  • Nachdem es immer wieder Probleme mit der Datenbereitstellung gab, verwendet die Szene nun eine öffentliche Quelle für die Abbilung der Feiertage.

Verwendung der Variable

Szenen die mit der Feiertagsvariable gesteuert bzw. von dieser beeinflusst werden:

Feedback

Wie immer freue ich mich über Feedback zur Szene und versuche auf entstehende Probleme einzugehen. Dafür ist die Kommentarfunktion unter dem Artikel schließlich da. Also: Schreibe einen Kommentar, wenn Dir die Szene gefällt, Du Anregungen oder Kritik hast.

Posted in Sonstiges and tagged .

35 Comments

  1. Hi,

    hilfreich wäre noch die Variable/Info, ob „morgen“ ein Feiertag ist.
    Zumindest nutze ich das bei mir für die Rollosteuerung….

    VG Hoggle

  2. Ach ich liebe diesen Blog , Danke für die tolle Arbeit Bastian 🙂 Muss das unbedigt umsetzen da die Kaffemaschine immer auch an Feiertagen um 7 Uhr durchläuft, weil ich es wieder verpeilt habe ^^

  3. Hallo Bastian,

    in BW ist morgen ein Feiertag. Dieser wird in deiner Szene v0.6 bei Feiertag morgen noch nicht angezeigt.

    Gruß
    Jeff

    • Hi Jeff,

      ich habe meine Szene gerade mal auf BW umgestellt, getestet und der Feiertag wird erfolgreich in die Variable eingetragen.
      Zwar stimmt die Codierung des Namens nicht (Heilige Drei Ku00f6nige), aber es wird erfolgreich umgesetzt.
      Das Bundesland hast Du aber in der Szene gepflegt, oder?

      Gruß
      Bastian

  4. Pingback: Heizplan für Feiertage | mkshb.de

  5. Hallo, habe heute das Script noch mal getestet. Bekomme leider folgenden „Fehler“
    [DEBUG] 10:45:25: ——————–START——————————–
    [DEBUG] 10:45:25: ——— Feiertagsvariable by mkshb.de ————-
    [DEBUG] 10:45:25: ———————————————————–
    [DEBUG] 10:45:25: ——— Prüfe globale Variablen
    [DEBUG] 10:45:25: ——— Benötigte Variablen sind vorhanden
    [DEBUG] 10:45:25: Datenabfrage manuell gestartet
    [DEBUG] 10:45:25: Get JSON Data from ical2json@mkshb.de
    [DEBUG] 10:45:32: ——————–START——————————–
    [DEBUG] 10:45:32: ——— Feiertagsvariable by mkshb.de ————-
    [DEBUG] 10:45:32: ———————————————————–
    [DEBUG] 10:45:32: ——— Prüfe globale Variablen
    [DEBUG] 10:45:32: ——— Benötigte Variablen sind vorhanden
    [DEBUG] 10:45:32: Datenabfrage manuell gestartet
    [DEBUG] 10:45:32: Get JSON Data from ical2json@mkshb.de
    [DEBUG] 10:45:46: error Software caused connection abort
    Installiert ist die Version 0.6. Steht der Dienst nicht mehr zur Verfügung?

  6. Hallo Bastian,

    du, wie läuft das mit der json-File? Kannst du die vielleicht zur Verfügung stellen, damit man die Feiertage eigenständig editieren kann? Der Grund ist, dass ich gern auch noch die Ferientage integriert hätte. Damit die Kids in den Ferien ausschlafen können und nicht ständig das Rollo hochfährt etc 😉

    Danke schonmal für deine Hilfe

    • Hallo Eldar,

      ich generiere das JSON File mit einer PHP Eigenentwicklung und speichere es in einer MySQL Datenbank, daher kann ich es Dir leider nicht so einfach zur Verfügung stellen. Sorry.

      Grüße
      Bastian

  7. In NRW stand auch, dass Ostersonntag kein Feiertag ist…aber da Ostersonntag immer nen Sonntag ist, ist es ja egal…ansonsten hat es super funktioniert…nur das Feiertagsheizprogramm hatte zicken gemacht…es schrieb die gespeicherten Daten nicht zurück, nach mehrmaligem neustart des HC2 und nach rausschmiss des HCL als Gateway lief es dann

    • Hallo Sven,
      Danke für Dein Feedback. Das Problem mit dem Ostersonntag ist kein Problem, denn der Ostersonntag ist ausschließlich in Brandenburg ein Feiertag.
      Da ich kein HCL als Gateway betreibe, kann ich das Verhalten nicht nachstellen. Wenn Du weitere Erkenntnisse hast, dann immer her damit 😉
      Gruß
      Bastian

      • @Bastian…wenn ich wieder mehr Zeit habe, versuche ich es noch mal nach zu stellen, doch derzeit steht erst mal eine Wohnungsrenovierung an und dann möchte Frau und Kind wieder mal was von mir haben. Ich danke dir auf jeden Fall für deine Skripte; nutze schon einige, teilweise abgewandelt für meine Zwecke (kann selber kein Lua, aber aus mehreren Skripten eigene bauen geht schon; Verständnis aus alten Basic-Zeiten 😛 ) Zu dem Thema melde ich mich auf jeden Fall wieder

  8. Moin Bastian… Version 1.0 schein mit dem HC2 4.520 Probleme zu haben:
    [DEBUG] 12:34:24: ——————–START——————————–
    [DEBUG] 12:34:24: ——— Feiertagsvariable by mkshb.de ————-
    [DEBUG] 12:34:24: ———————————————————–
    [DEBUG] 12:34:24: ——— Prüfe globale Variablen
    [DEBUG] 12:34:24: ——— Benötigte Variablen sind vorhanden
    [DEBUG] 12:34:24: Timer gestartet. Datenabruf täglich um 12:35 Uhr
    [DEBUG] 12:35:24: Get JSON Data
    [DEBUG] 12:35:24: Get JSON Data
    [DEBUG] 12:35:24: 2018-12-25 12:35:24.675156 [ error] Handshake error: certificate verify failed
    [DEBUG] 12:35:24: error certificate verify failed
    [DEBUG] 12:35:24: 2018-12-25 12:35:24.684139 [ error] Handshake error: certificate verify failed
    [DEBUG] 12:35:24: error certificate verify failed

    • Moin smg,

      bei mir läuft die Szene ordnungsgemäß. Was steht denn bei Dir für eine URL in der timerFunction?

      Grüße
      Bastian

  9. guten Abend Bastian…es steht:
    –Heute abfragen
    checkDate = os.date(„%d.%m.%Y“)
    url = „https://ipty.de/feiertag/api.php?do=isFeiertagInfo&datum=“..checkDate..“&loc=“..APIbl..“&outformat=d.m.Y“
    getical2jsondata(url, gVarStateToday, gVarNameToday)

    • Hallo smg,

      das sieht soweit gut aus.
      Bitte prüfe mal, ob Du in der Variable APIbl ein gültiges Bundesland eingetragen hast. Am einfachsten indem Du die Url im Browser aufrufst:
      Zum Beispiel: Test für Hamburg

      Grüße
      Bastian

  10. Hallo Bastian, ja, hatte ja auch immer funktioniert…ich nutze „NW“ in deiner Beschreibung steht zwar NRW, aber das war wohl falsch und hatte es damals zu NW geändert, was auch immer funktionierte. Auch mit anderen Bundesländern bekomme ich den Fehler. Ich vermute, dass es an der SW vom HC2 liegt 4.520 und der Fehler durch das HTTPS kommt, wegen dem Certificat. Mit meinem Browsere gehts ja

    • Hi smg,

      das ist interessant, denn ich habe – abgesehen vom BL – dieselben Voraussetzungen wie Du. Auch 4.520 und bei mir läuft es problemlos.

      Grüße
      Bastian

  11. habe es noch mal neu runter geladen und mit dem orginalen BL (NI) rein gesetzt, mal per Hand gestartet und dann auch mal die Uhrzeit zum Autostzart auf 19:36Uhr gesetzt jedes mal der selbe Fehler 🙁

    • Hi smg,

      tausche mal die Funktion getMethod (um die Zeile 62-75) gegen folgenden Part aus:

      ---------------------------------------------------
      ------------- HTTP GET ----------------------------
      -- GET zum Auslesen des Heizplanel
      ---------------------------------------------------
      local function getMethod(requestUrl, successCallback, errorCallback)
      local http = net.HTTPClient()
      http:request(requestUrl, {
      options = {
      method = 'GET',
      checkCertificate = false
      },
      success = successCallback,
      error = errorCallback
      })
      end

      Grüße
      Bastian

  12. Hallo Bastian, habe da noch ne Frage zu den Debugzeilen:
    [DEBUG] 21:57:33: ——————–START——————————–
    [DEBUG] 21:57:33: ——— Feiertagsvariable by mkshb.de ————-
    [DEBUG] 21:57:33: ———————————————————–
    [DEBUG] 21:57:33: ——— Prüfe globale Variablen
    [DEBUG] 21:57:33: ——— Benötigte Variablen sind vorhanden
    [DEBUG] 21:57:33: Timer gestartet. Datenabruf täglich um 00:06 Uhr
    [DEBUG] 21:57:39: ——————–START——————————–
    [DEBUG] 21:57:39: ——— Feiertagsvariable by mkshb.de ————-
    [DEBUG] 21:57:39: ———————————————————–
    [DEBUG] 21:57:39: ——— Prüfe globale Variablen
    [DEBUG] 21:57:39: ——— Benötigte Variablen sind vorhanden
    [DEBUG] 21:57:39: Datenabfrage manuell gestartet
    [DEBUG] 21:57:39: Get JSON Data
    [DEBUG] 21:57:39: Get JSON Data
    [DEBUG] 21:57:39: Verbindung erfolgreich (HTTP Status 200)
    [DEBUG] 21:57:39: Feiertag gefunden, setze globale Variablen
    [DEBUG] 21:57:39: Verbindung erfolgreich (HTTP Status 200)
    [DEBUG] 21:57:39: kein Feiertag gefunden
    [DEBUG] 00:06:33: Get JSON Data
    [DEBUG] 00:06:33: Get JSON Data
    [DEBUG] 00:06:33: Verbindung erfolgreich (HTTP Status 200)
    [DEBUG] 00:06:33: kein Feiertag gefunden
    [DEBUG] 00:06:33: Verbindung erfolgreich (HTTP Status 200)
    [DEBUG] 00:06:33: kein Feiertag gefunden
    [DEBUG] 00:06:33: Get JSON Data
    [DEBUG] 00:06:33: Get JSON Data

    kann man da auch das Datum mit rein nehmen, damit man es genauer kontrollieren kann?

    Ich wünsche dir und allen anderen die hier mit lesen einen guten Übergang ins neue Jahr

    Grüße Sven

    • Moin Sven,

      ersetze die timerFunction() mit folgendem Quellcode, dann wird ein Datum vor der Abfrage ausgegeben.
      function timerFunction()
      local currentDate = os.date("*t");
      if (
      ( (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == startTime) )
      )
      then
      --Heute abfragen
      checkDate = os.date("%d.%m.%Y")
      debug('green','Abfrage für '..checkDate)
      url = "https://ipty.de/feiertag/api.php?do=isFeiertagInfo&datum="..checkDate.."&loc="..APIbl.."&outformat=d.m.Y"
      getical2jsondata(url, gVarStateToday, gVarNameToday)
      --Morgen abfragen
      checkDate = os.date("%d.%m.%Y", (os.time() + (86400)))
      url = "https://ipty.de/feiertag/api.php?do=isFeiertagInfo&datum="..checkDate.."&loc="..APIbl.."&outformat=d.m.Y"
      getical2jsondata(url, gVarStateTomorrow, gVarNameTomorrow)
      end

      setTimeout(timerFunction, 60*1000)
      end

      Dir auch einen guten Start in 2019!

      Grüße
      Bastian

  13. danke dir…so ist es schon mal gut…solltest du in deine Version genau so rein nehmen. Jetzt fehlt nur noch was für bewegliche Feiertage (Variablenliste), weil Sylvester, usw. fehlen 😀

    • Moin,

      Silvester ist kein Feiertag 😉
      Aber ich weiß, was Du meinst. Ich hab da auch was in Arbeit, weiß aber nicht wann und ob ich es fertig bekomme.

      Grüße
      Bastian

Schreibe einen Kommentar

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

Ich akzeptiere