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.
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.
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.
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
- gVHoliday1_0.zip - 1.0
- gHoliday-0.6.zip - 0.6
- gHoliday-v0.5.zip - 0.5
- gHoliday-2.zip - 0.4
- gHoliday-1.zip - 0.3
- gHoliday.zip - 0.2
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.
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
Hi Hoggle,
sehr gute Idee, vielen Dank! Ich habe es in die Version 0.6 integiert und bereitgestellt.
Gruß
Bastian
Cool – dann müsste ich ja jetzt fast überlegen, ob ich meine aktuelle Szene austausche…..
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 ^^
Hi Chris,
genau für solche Szenarien ist die Szene gedacht. Viel Spaß damit.
Gruß
Bastian
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
Pingback: Heizplan für Feiertage | mkshb.de
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?
Morgen schön,
kann es sein, dass das Script für heute (Ostersonntag ) „kein Feiertag“ angibt?
VG Hoggle
Guten Morgen, wenn Du nicht gerade in Brandenburg wohnst, dann ist der Ostersonntag kein Feiertag 😉
Ich hatte SH eingestellt..
Der Ostersonntag ist nur in Brandenburg Feiertag. 😉
ah jetzt – okay…..
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
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
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
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
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
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
Bastian, du bist der Beste 🙂 läuft…danke dir
Moin smg,
sehr schön, freut mich.
Dennoch würde ich gern verstehen, warum es zu dem Fehler kommt.
Grüße
Bastian
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
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
sagte ja bewegliche Feiertage 😉 Und die Aussage:“ob ich es fertig bekomme“ …warum so negativ?
Hi Sven,
weil es sehr viel Zeit in Anspruch nimmt. 😉
Grüße
Bastian