Hier nun das Skript angepasst für alle Bundesländer.
Habe beim abzählen der Tage für Pfingsten mit 48 + 49 Tagen gerechnet anstelle von 49 + 50
--[[
%% autostart
%% properties
%% globals
--]]
-- ************************************************************************
-- FEIERTAGE-SCRIPT
-- ************************************************************************
-- Das Skript berechnet die Feiertage in Deutschland im aktuellen Jahr und prüft,
-- ob heute oder morgen ein Feiertag ist und hinterlegt das Ergebnis in den
-- Systemvariablen "Feiertag_heute" und "Feiertag_morgen".
-- (c) Simon Betschmann (01-2015)
-- Version: 1.0
-- - Basierend auf einer Idee von Peter Beck (01-2011)
-- Version: 1.1
-- - Erweiterung für Deutschland und Bundeländer von Udo Haß
-- Version: 1.2
-- - Routine zur Berechnung der Osterfeiertage und Schaltjahr vollständig ersetzt.
-- - Quelle der Berechnung der Osterfeiertage teilweise von http://wiki.contextgarden.net/Calendar_script
-- - Feiertage, welche auf Ostern basieren im Aray korrigiert
-- - Änderungen von Udo Haß
-- Version: 1.3 (Manuel Hoefs)
-- - Berechnung für Fronleichnam hinzugefügt (abhängig von Pfingsten)
-- - Berechnung für Buß- und Bettag hinzugefügt (immer der vorletzte Mittwoch vor dem 1. Advent)
-- - Erweiterung für Wochenenden
-- - Variable für tägliches Ausführen ergänzt
-- Version: 1.4 (Manuel Hoefs)
-- - Anpassung der Osterberechnung (temp fix)
-- Version: 1.5 (Manuel Hoefs April 2018)
-- - kompletter Neuberechnung der Feiertage abhängig von Ostern
-- - Konfigurationserweiterung um Feiertage des kompletten Jahres auszugeben
-- Es werden folgende Systemvariablen benötigt:
-- Feiertag_heute
-- Feiertag_morgen
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- EINSTELLUNGEN
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Bitte nur in dieser Sektion Einstellungen vornehmen
debuging = true -- TOGGLE DEBUGING (true|false)
Land = "DE" -- LAND angeben (DE, CH)
Bundesland = "NW" -- Bundesland eingeben (BW,BY,BE,BB,HB,HH,HE,MV,NI,NW,RP,SL,SN,ST,SH,TH) -- Kürzel http://www.schnelle-online.info/Feiertage-Deutschland.html
katholische_Gemeinde = false -- (true|false) spezielle Feiertage für katholische Gemeinden (München, Ingolstadt, Rosenheim)
Kanton = "" -- Kanton angeben für kantonale Feiertage (ZH, AG,...) -- leer lassen, um Funktion auszuschalten
scenerun = "00:30" -- SZENE JEDEN TAG AUSFÜHREN UM
wochenende = true -- (true|false) Wochenenden werden ebenfalls als Feiertag/Frei erkannt
showholidays = false -- Liste alle Feiertage im Jahr (true|false)
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- DEBUG
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Grundfunktion: Debug("red", "Nachrichtentext")
Debug = function(color, message)
if (debuging) then
fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
end
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- FEIERTAGE BERECHNEN
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
fibaro:debug("start instanz " .. os.date("%c"));
function FeiertageFunc()
-- Notwendige Variablen
local Datum = os.date("%d.%m.") -- heutiges Datum (ohne Jahr)
local Jahr = os.date("%Y") -- Das aktuelle Jahr ermitteln
local WeekDate = os.date("*t").wday -- Den aktuellen Wochentag ermitteln
-- Berechne Ostersonntag, basiert auf Meeus/Jones/Butcher
local a = math.fmod(Jahr,19)
local b = math.floor(Jahr / 100)
local c = math.fmod(Jahr,100)
local d = math.floor(b / 4)
local e = math.fmod(b,4)
local f = math.floor((b + 8) / 25)
local g = math.floor((b - f + 1) / 3)
local h = math.fmod((19 * a + b - d - g + 15),30)
local i = math.floor(c / 4)
local k = math.fmod(c,4)
local L = math.fmod((32 + 2 * e + 2 * i - h - k),7)
local m = math.floor((a + 11 * h + 22 * L) / 451)
local oMonat = math.floor((h + L - 7 * m + 114) / 31)
local oTag = math.fmod((h + L - 7 * m + 114),31) + 1
-- Das Ergebnis in Variable oDatum hinterlegen
--oDatum -- Das komplette Datum vom Ostersonntag
if (oTag < 10) then
oDatum = "0" .. oTag .. ".0" .. oMonat .. "." .. Jahr
else
oDatum = oTag .. ".0" .. oMonat .. "." .. Jahr
end
Debug("gray", "Osterdatum: ".. oDatum)
Debug("gray", "Datum: ".. Datum)
-- Berechne Buß- und Bettag
--bubTag
local wTag = os.time({year=Jahr, month=12, day=25})
local wTable = os.date("*t", wTag)
if (wTable.wday == 1) then
bubTag = 16
else
bubTag = 23 - wTable.wday + 1
end
-- Ermitteln, wieviele Tage der Februar im aktuellen Jahr hat
local zahl4 = Jahr % 4
local zahl100 = Jahr % 100
local zahl400 = Jahr % 400
--mTage -- Variable für die interne Berechnung
if ((zahl4 == 0) and (zahl100 ~= 0)) or (zahl400 == 0) then -- Ein Schaltjahr -> Feb. = 29 Tage
mTage = {31,29,31,30,31,30,31,31,30,31,30,31} -- Anzahl der Tage im Monat Jan.-Dez.
Debug("gray", Jahr.. " ist ein Schaltjahr.")
else
mTage = {31,28,31,30,31,30,31,31,30,31,30,31} -- Anzahl der Tage im Monat Jan.-Dez.
Debug("gray", Jahr.. " ist kein Schaltjahr.")
end
-- Feiertage mit dem heutigen & morgigen Datum vergleichen und Ergebnis
-- in den Variablen "Feiertag_heute" bzw. "Feiertag_morgen" speichern
local zaehler = 1
local feiertagliste = ""
while zaehler < 3 do
local Feiertag = 0
if (wochenende) then
if (WeekDate == 1 or WeekDate == 7) then
Feiertag = 1
Debug("gray", "Wochentag " .. WeekDate .. " ist ein Wochenendtag.")
else
Debug("gray", "Wochentag " .. WeekDate .. " ist KEIN Wochenendtag.")
end
end
if (Land == "DE") then -- Bundeseinheitliche Feiertage in Deutschland
if (Datum == "01.01.") then Feiertag = 1 end -- Neujahr
if (Datum == "01.05.") then Feiertag = 1 end -- Tag der Arbeit
if (Datum == "03.10.") then Feiertag = 1 end -- Tag der Deutschen Einheit
if (Datum == "31.10.") and (Jahr == "2017") then Feiertag = 1 end -- Reformationstag (nur 2017 Bundeseinheitlich!)
if (Datum == "25.12.") then Feiertag = 1 end -- 1. Weihnachtstag
if (Datum == "26.12.") then Feiertag = 1 end -- 2. Weihnachtstag
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("Liste der Feiertage für "..Jahr)
fibaro:debug("01.01. Neujahr")
fibaro:debug("01.05. Tag der Arbeit")
fibaro:debug("03.10. Tag der Deutschen Einheit")
fibaro:debug("25.12. 1. Weihnachtstag")
fibaro:debug("26.12. 2. Weihnachtstag")
end
if Bundesland =="BW" then -- spezifische Feiertage für Baden-Würtenberg
if (Datum == "06.01.") then Feiertag = 1 end -- Heilige Drei Könige
if (Datum == "01.11.") then Feiertag = 1 end -- Allerheiligen
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("06.01. Heilige Drei Könige")
fibaro:debug("01.11. Allerheiligen")
end
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag, Fronleichnam
feiertage = {-2,1,39,50,60}
end
if Bundesland =="BY" then -- spezifische Feiertage für Bayern
if (Datum == "06.01.") then Feiertag = 1 end -- Heilige Drei Könige
if (Datum == "01.11.") then Feiertag = 1 end -- Allerheiligen
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("06.01. Heilige Drei Könige")
fibaro:debug("01.11. Allerheiligen")
end
if (katholische_Gemeinde) then
if (Datum == "15.08.") then Feiertag = 1 end -- Mariä Himmelfahrt
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("15.08. Mariä Himmelfahrt")
end
end
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag, Fronleichnam
feiertage = {-2,1,39,50,60}
end
if Bundesland =="BE" then -- spezifische Feiertage für Berlin
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,50}
end
if Bundesland =="BB" then -- spezifische Feiertage für Brandenburg
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("31.10. Reformationstag")
end
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostersonntag, Ostermontag, Christi Himmelfahrt, Pfingstsonntag, Pfingstmontag
feiertage = {-2,0,1,39,49,50}
end
if Bundesland =="HB" then -- spezifische Feiertage für Bremen
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,50}
end
if Bundesland =="HH" then -- spezifische Feiertage für Hamburg
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,50}
end
if Bundesland =="HE" then -- spezifische Feiertage für Hessen
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag, Fronleichnam
feiertage = {-2,1,39,50,60}
end
if Bundesland =="MV" then -- spezifische Feiertage für Mecklenburg-Vorpommern
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("31.10. Reformationstag")
end
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,50}
end
if Bundesland =="NI" then -- spezifische Feiertage für Niedersachsen
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,50}
end
if Bundesland =="NW" then -- spezifische Feiertage für NRW
if (Datum == "01.11.") then Feiertag = 1 end -- Allerheiligen
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("01.11. Allerheiligen")
end
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag, Fronleichnam
feiertage = {-2,1,39,50,60}
end
if Bundesland =="RP" then -- spezifische Feiertage für Rheinland-Pfalz
if (Datum == "01.11.") then Feiertag = 1 end -- Allerheiligen
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("01.11. Allerheiligen")
end
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag, Fronleichnam
feiertage = {-2,1,39,50,60}
end
if Bundesland =="SL" then -- spezifische Feiertage für Saarland
if (Datum == "15.08.") then Feiertag = 1 end -- Mariä Himmelfahrt
if (Datum == "01.11.") then Feiertag = 1 end -- Allerheiligen
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("15.08. Mariä Himmelfahrt")
fibaro:debug("01.11. Allerheiligen")
end
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag, Fronleichnam
feiertage = {-2,1,39,50,60}
end
if Bundesland =="SN" then -- spezifische Feiertage für Sachsen
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
if (Datum == bubTag .. ".11.") then Feiertag = 1 end -- Buß- und Bettag
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("31.10. Reformationstag")
fibaro:debug(bubTag ..".11. Buß- und Bettag")
end
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,50}
end
if Bundesland =="ST" then -- spezifische Feiertage für Sachsen-Anhalt
if (Datum == "06.01.") then Feiertag = 1 end -- Heilige Drei Könige
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("06.01. Heilige Drei Könige")
fibaro:debug("31.10. Reformationstag")
end
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,50}
end
if Bundesland =="SH" then -- spezifische Feiertage für Schleswig-Holstein
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,50}
end
if Bundesland =="TH" then -- spezifische Feiertage für Thüringen
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("31.10. Reformationstag")
end
-- Aray mit Differenztagen zum Ostersonntag:
-- Karfreitag, Ostermontag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,50}
end
end
if (Land == "CH") then -- FESTE FEIERTAGE IN DER GANZEN SCHWEIZ
if (Datum == "01.01.") then Feiertag = 1 end -- Neujahr
if (Datum == "01.08.") then Feiertag = 1 end -- Nationalfeiertag
if (Datum == "25.12.") then Feiertag = 1 end -- Weihnachten
if (Datum == "26.12.") then Feiertag = 1 end -- Stephanstag
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("01.01. Neujahr")
fibaro:debug("01.08. Nationalfeiertag")
fibaro:debug("25.12. Weihnachten")
fibaro:debug("26.12. Stephanstag")
end
if (Kanton == "ZH") then -- FEIERTAGE IM KANTON ZÜRICH
if (Datum == "01.05.") then Feiertag = 1 end -- Tag der Arbeit
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("01.05. Tag der Arbeit")
end
end
if (Kanton == "AG") then -- FEIERTAGE IM KANTON AARGAU
if (Datum == "02.01.") then Feiertag = 1 end -- Berchtoldstag
if (showholidays == true) and (zaehler == 1) then
fibaro:debug("02.01. Berchtoldstag")
end
end
-- VARIABLE FEIERTAG IN DER GANZEN SCHWEIZ
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Auffahrt, Pfingstmontag
feiertage = {-2,1,39,50}
end
-- VARIABLE FEIERTAGE BASIEREND AUF OSTERN: DATEN BERECHNEN
--calcTag -- Variable für die interne Berechnung
--calcMonat -- Variable für die interne Berechnung
--zahl -- Variable für die interne Berechnung
--fDatum -- Feiertagsdatum
--fDiff -- Anzahl der Tage vom Ostersonntag entfernt
--Schleife -- Für die Berechnungen in der while-Schleife notwendig
oTage = mTage[tonumber(oMonat)] -- Anzahl Tage im Ostermonat
Debug("grey", "Anzahl Tage im Ostermonat: "..oTage)
for x in next, feiertage do
Debug("red", "Feiertag: "..feiertage[x])
fDiff = oTag + feiertage[x]-- Differenztage zum Referenztag hinzurechnen
Debug("grey", "oTag: "..oTag..", fDiff: "..fDiff..", index: "..x)
if (fDiff < 1) then
calcTag = mTage[tonumber(oMonat-1)]+fDiff
calcMonat = oMonat-1
elseif (fDiff <= oTage) then
calcTag = fDiff
calcMonat = oMonat
else
local Schleife = true
local count = 0
while (Schleife) do
local zahl = fDiff - mTage[tonumber(oMonat+count)]
if (zahl > mTage[tonumber(oMonat+count+1)]) then
count = count + 1
fDiff = zahl
Debug("grey", "Ausserhalb des Referenzmonats > Schleife durchlaufen.")
else
calcTag = zahl
calcMonat = oMonat+count+1
Schleife = false
Debug("grey", "Innerhalb des Referenzmonats > Schleife nicht durchlaufen.")
end
end
end
-- Datum des Feiertags berechnen
Debug("grey", "Datum des Feiertags berechnen...")
if (calcTag < 10) then
fDatum = "0" .. calcTag .. ".0"..calcMonat.. "."
else
fDatum = calcTag .. ".0"..calcMonat.. "."
end
Debug("white", "Feiertag: "..fDatum)
if (showholidays == true) and (zaehler == 1) then
local feiertag = ""
if (feiertage[x] == -2) then
feiertag = "Karfeitag"
elseif (feiertage[x] == 0) then
feiertag = "Ostersonntag"
elseif (feiertage[x] == 1) then
feiertag = "Ostermontag"
elseif (feiertage[x] == 39) then
feiertag = "Christi Himmelfahrt"
elseif (feiertage[x] == 49) then
feiertag = "Pfingstsonntag"
elseif (feiertage[x] == 50) then
feiertag = "Pfingstmontag"
elseif (feiertage[x] == 60) then
feiertag = "Fronleichnam"
end
fibaro:debug(fDatum .." ".. feiertag)
end
-- Prüfen, ob Datum heute/morgen mit Feiertag übereinstimmt
if (Datum == fDatum) then
Feiertag = 1
fibaro:debug("Feiertag ("..fDatum..") gefunden.")
end
end
-- VARIABLEN SETZTEN
if zaehler == 1 then
-- 1. Durchgang: Datum heute mit den Feiertagen prüfen
Debug("grey", "1. Durchgang: Datum heute="..Datum..", Feiertag="..Feiertag)
fibaro:setGlobal("Feiertag_heute", Feiertag)
zaehler = 2
Datum = os.date("%d.%m.", os.time()+24*60*60) -- Datum auf morgen setzen
WeekDate = WeekDate + 1
else
-- 2. Durchgang: Datum morgen mit den Feiertagen prüfen
if (wochenende) then
if (WeekDate > 6) then
Feiertag = 1
end
end
Debug("grey", "2. Durchgang: Datum morgen="..Datum..", Feiertag="..Feiertag)
fibaro:setGlobal("Feiertag_morgen", Feiertag)
zaehler = 3
end
end
-- ERGEBNIS AUSGEBEN
if fibaro:getGlobal("Feiertag_heute") == '0' then
if (wochenende) then
fibaro:debug(os.date("%c") .. " - Heute ist kein Feiertag / Wochenende.")
else
fibaro:debug(os.date("%c") .. " - Heute ist kein Feiertag.")
end
else
if (wochenende) then
fibaro:debug(os.date("%c") .. " - Heute ist ein Feiertag / Wochenende. Variable gesetzt!")
else
fibaro:debug(os.date("%c") .. " - Heute ist ein Feiertag. Variable gesetzt!")
end
end
if fibaro:getGlobal("Feiertag_morgen") == '0' then
if (wochenende) then
fibaro:debug(os.date("%c") .. " - Morgen ist kein Feiertag / Wochenende.")
else
fibaro:debug(os.date("%c") .. " - Morgen ist kein Feiertag.")
end
else
if (wochenende) then
fibaro:debug(os.date("%c") .. " - Morgen ist ein Feiertag / Wochenende. Variable gesetzt!")
else
fibaro:debug(os.date("%c") .. " - Morgen ist ein Feiertag. Variable gesetzt!")
end
end
end
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- SZENE JEDEN TAG AUSFÜHREN
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if ((((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == scenerun) )) then
FeiertageFunc()
end
setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (startSource["type"] == "other") then
FeiertageFunc()
end
end