Hallo,
da das Script zur Feiertagsberechnung nicht wirklich rund lief, habe ich mir das heute noch mal angeschaut und ein paar Änderungen gemacht. Die Routine zur Osterberechnung sowie die Schaltjahrberechnung ist komplett geändert worden. Teilweise hab ich eine bereits vorhandene Routine aus dem Internet (Quelle steht im Sourcecode) genommen und abgeändert.
--[[
%% autostart
%% properties
%% globals
--]]
-- ************************************************************************
-- FEIERTAGE-SCRIPT
-- ************************************************************************
-- Das Skript berechnet die eidg./kant. Feiertage 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ß
-- Es werden folgende Systemvariablen benötigt:
-- Feiertag_heute
-- Feiertag_morgen
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- EINSTELLUNGEN
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Bitte nur in dieser Sektion Einstellungen vornehmen
local debuging = false -- TOGGLE DEBUGING (true|false)
local Land = "DE" -- LAND angeben (DE, CH)
local 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
local katholische_Gemeinde ="nein" -- spezielle Feiertage für katholische Gemeinden (München, Ingolstadt, Rosenheim)
local Kanton = "" -- Kanton angeben für kantonale Feiertage (ZH, AG,...) -- leer lassen, um Funktion auszuschalten
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- 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
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--- oTag berechnen Anfang ---
function FeiertageFunc()
local Datum = os.date("%d.%m.") -- heutiges Datum (ohne Jahr)
local zaehler= 1
-- OSTERDATUM BERECHNEN
local Jahr = os.date("%Y") -- Das aktuelle Jahr ermitteln
local oTag -- Das Tagesdatum vom oTag
local oMonat -- Das Monatsdatum von oTag
local oDatum -- Das komplette Datum vom oTag
local mTage -- Variable für die interne Berechnung
local LVar1 -- Variable für die interne Berechnung
local LVar2 -- Variable für die interne Berechnung
local LVar3 -- Variable für die interne Berechnung
local zahl -- Variable für die interne Berechnung
-- Prüfen ob Schaltjahr
if (math.fmod(Jahr,4) == 0) then
if (math.fmod(Jahr,100) == 0) then
if (math.fmod(Jahr,400) == 0) then
Schaltjahr = true
else Schaltjahr = false end
else Schaltjahr = true end
else Schaltjahr = false
end
-- 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
if (oTag < 10) then
oDatum = "0" .. oTag .. "." .. oMonat .. "." .. Jahr;
else
oDatum = oTag .. "." .. oMonat .. "." .. Jahr;
end
Debug("gray", "Osterdatum: ".. oDatum)
Debug("gray", "Datum: ".. Datum)
-- Ermitteln, wieviele Tage der Februar im aktuellen Jahr hat
zahl4 = Jahr % 4;
zahl100 = Jahr % 100;
zahl400 = Jahr % 400;
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
while zaehler< 3 do
local Feiertag = 0
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 Bundesland =="BW" then -- spezifische Feiertage für Baden-Würtenberg
if (Datum == "06.01.") then Feiertag = 1 end -- Heilige Drei Könige
if (Datum == "26.05.") then Feiertag = 1 end -- Fronleichnam
if (Datum == "01.11.") then Feiertag = 1 end -- Allerheiligen
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="BY" then -- spezifische Feiertage für Bayern
if (Datum == "06.01.") then Feiertag = 1 end -- Heilige Drei Könige
if (Datum == "26.05.") then Feiertag = 1 end -- Fronleichnam
if (Datum == "01.11.") then Feiertag = 1 end -- Allerheiligen
if (katholische_Gemeinde == "ja") then
if (Datum == "15.08.") then Feiertag = 1 end -- Mariä Himmelfahrt
end
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="BE" then -- spezifische Feiertage für Berlin
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="BB" then -- spezifische Feiertage für Brandenburg
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
-- Aray mit Differenztagen zum oTag:
-- oTag, Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstsonntag,Pfingstmontag
feiertage = {-2,0,1,39,48,49}
end
if Bundesland =="HB" then -- spezifische Feiertage für Bremen
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="HH" then -- spezifische Feiertage für Hamburg
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="HE" then -- spezifische Feiertage für Hessen
if (Datum == "26.05.") then Feiertag = 1 end -- Fronleichnam
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="MV" then -- spezifische Feiertage für Mecklenburg-Vorpommern
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="NI" then -- spezifische Feiertage für Niedersachsen
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="NW" then -- spezifische Feiertage für NRW
if (Datum == "26.05.") then Feiertag = 1 end -- Fronleichnam
if (Datum == "01.11.") then Feiertag = 1 end -- Allerheiligen
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="RP" then -- spezifische Feiertage für Rheinland-Pfalz
if (Datum == "26.05.") then Feiertag = 1 end -- Fronleichnam
if (Datum == "01.11.") then Feiertag = 1 end -- Allerheiligen
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="SL" then -- spezifische Feiertage für Saarland
if (Datum == "26.05.") then Feiertag = 1 end -- Fronleichnam
if (Datum == "15.08.") then Feiertag = 1 end -- Mariä Himmelfahrt
if (Datum == "01.11.") then Feiertag = 1 end -- Allerheiligen
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="SN" then -- spezifische Feiertage für Sachsen
if (Datum == "26.05.") then Feiertag = 1 end -- Fronleichnam
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
if (Datum == "16.11.") then Feiertag = 1 end -- Buß- und Bettag
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="SL" then -- spezifische Feiertage für Sachsen-Anhalt
if (Datum == "06.01.") then Feiertag = 1 end -- Heiligen-Drei-Könige
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="SH" then -- spezifische Feiertage für Schleswig-Holstein
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
if Bundesland =="TH" then -- spezifische Feiertage für Thüringen
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {-2,1,39,49}
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
-- FEIERTAGE IM KANTON ZÜRICH
if (Kanton == "ZH") then
if (Datum == "01.05.") then Feiertag = 1 end -- Tag der Arbeit
end
-- FEIERTAGE IM KANTON AARGAU
if (Kanton == "AG") then
if (Datum == "02.01.") then Feiertag = 1 end -- Berchtoldstag
end
-- VARIABLE FEIERTAG IN DER GANZEN SCHWEIZ
-- Aray mit Differenztagen zum oTag:
-- Ostermontag, Karfreitag, Auffahrt, Pfingstmontag
feiertage = {-2,1,39,49}
end
-- VARIABLE FEIERTAGE: DATEN BERECHNEN
oTage = mTage[tonumber(oMonat)] -- Anzahl Tage im Ostermonat
Debug("grey", "Anzahl Tage im Ostermonat: "..oTage)
local fDatum; -- Feiertagsdatum
local fDiff; -- Anzahl der Tage vom oTag entfernt
local Schleife; -- Für die Berechnungen in der while-Schleife notwendig
for x in next, feiertage do
Debug("red", "Feiertag: "..feiertage[x])
fDiff = feiertage[x]
Schleife = true;
zahl = oTag + fDiff; -- Differenztage zum Referenztag hinzurechnen
Debug("grey", "Zahl: "..zahl..", oTag: "..oTag..", fDiff: "..fDiff..", index: "..x)
if (fDiff > 0) then
if (zahl > oTage) then
zahl = zahl - oTage; -- Sind wir ausserhalb des Referenzmonats?
Debug("grey", "Ausserhalb des Referenzmonats > Schleife durchlaufen.")
else -- Nein => Berechnungschleife nicht durchlaufen.
Schleife = false;
LVar2 = oMonat;
Debug("grey", "Innerhalb des Referenzmonats > Schleife nicht durchlaufen.")
end
else
if (zahl > 0) then -- Wenn innerhalb des Referenzmonats => Berechnungsschleife nicht durchlaufen.
Schleife = false;
LVar2 = oMonat;
Debug("grey", "Innerhalb des Referenzmonats > Schleife nicht durchlaufen.")
else
Debug("grey", "Ausserhalb des Referenzmonats > Schleife durchlaufen.")
end
end
LVar1 = 0;
-- Schleife 'Monatsberechnung', falls nicht im gleichen Monat wie Ostern
if (fDiff > 0) then
while (Schleife) do
LVar1 = LVar1 + 1.00;
LVar2 = oMonat + LVar1;
zahl = zahl - mTage[tonumber(oMonat)];
if (zahl <= 0) then -- Aktueller Monat gefunden
Schleife = false;
zahl = zahl + mTage[tonumber(oMonat)] -- Wieder addieren, um den Tag zu berechnen
end
end
else
if (fDiff < 0) then
while (Schleife) do
LVar1 = LVar1 + 1.00;
LVar2 = oMonat - LVar1;
zahl = zahl + mTage[tonumber(oMonat)]
if (zahl > 0) then -- Aktueller Monat gefunden
Schleife = false;
end
end
end
end
-- Datum des Feiertags berechnen
Debug("grey", "Datum des Feiertags berechnen...")
if (zahl < 10 and tonumber(LVar2) < 10) then
fDatum = "0" .. zahl .. ".0"..tonumber(LVar2).. ".";
elseif (zahl < 10) then
fDatum = "0" .. zahl .. "."..tonumber(LVar2).. ".";
elseif (tonumber(LVar2) < 10) then
fDatum = zahl .. ".0"..tonumber(LVar2).. ".";
else
fDatum = zahl .. "."..tonumber(LVar2).. ".";
end
Debug("white", "Feiertag: "..fDatum)
-- 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
else
-- 1. Durchgang: Datum morgen mit den Feiertagen prüfen
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
fibaro:debug("Heute ist kein Feiertag.")
else
fibaro:debug("Heute ist ein Feiertag. Variable gesetzt!")
end
if fibaro:getGlobal("Feiertag_morgen") == '0' then
fibaro:debug("Morgen ist kein Feiertag.")
else
fibaro:debug("Morgen ist ein Feiertag. Variable gesetzt!")
end
end
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- SZENE JEDEN TAG UM 00:01 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) == "00:01") )) 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