Hi,
Simon, hier aus dem Forum hat mir mal ein Script geschickt zum berechnen der Feiertage. Allerdings bin ich noch nicht zum testen gekommen.
Schau es dir gern mal an:
… Es berechnet, ob heute
bzw. morgen ein Feiertag ist und schreibt das Ergebnis in zwei
Systemvariablen. Damit lassen sich dann z.B. weitere Szenen steuern. …
--[[ %% 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) -- 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 Kanton = "ZH" -- 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 -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function FeiertageFunc() local Datum = os.date("%d.%m.") -- heutiges Datum (ohne Jahr) local i = 1 -- OSTERDATUM BERECHNEN local Jahr = os.date("%Y") -- Das aktuelle Jahr ermitteln local oTag -- Das Tagesdatum vom Ostersonntag local oMonat -- Das Monatsdatum von Ostersonntag local oDatum -- Das komplette Datum vom Ostersonntag 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 -- Interne Funktion zum Runden auf Ganzzahlen function round(x) return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5) end -- Die modifizierte Gauss-Formel nach Lichtenberg local LVar1 = ((19 * (Jahr % 19)) + (15 + (((3 * (Jahr / 100)) + 3) / 4) - (((8 * (Jahr / 100)) + 13) / 25))) % 30; local LVar2 = (LVar1 / 29) + (((LVar1 / 28) - (LVar1 / 29)) * ((Jahr % 19) / 11)); local LVar3 = 7 - (((21 + LVar1 - LVar2) - (7 - ((Jahr + (Jahr / 4) + (2 - (((3 * (Jahr / 100)) + 3) / 4))) % 7))) % 7); local oTag = round((21 + LVar1 - LVar2) + LVar3); -- Monat und Tag von Ostern bestimmen if (oTag > 31) then -- Der Monat März hat nur 31 Tage -> Ostern im April oMonat = "04"; oTag = oTag - 31; else oMonat = "03"; -- Ostern ist im März end -- 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) -- Ermitteln, wieviele Tage der Februar im aktuellen Jahr hat zahl = Jahr % 4; if (zahl == 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 i < 3 do local Feiertag = 0 -- 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 Ostersonntag: -- Ostermontag, Karfreitag, Auffahrt, Pfingstmontag local feiertage = {1,-2,39,50} -- 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 Ostersonntag entfernt local Schleife; -- Für die Berechnungen in der while-Schleife notwendig for x in next, feiertage do 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 i == 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) i = 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) i = 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