Hi,
mein Feiertagsscript zeigt den falschen Tag als Feiertag an?
[DEBUG] 12:48:42: Osterdatum: 01.04.2018
[DEBUG] 12:48:42: 2018 ist kein Schaltjahr.
[DEBUG] 12:48:42: Anzahl Tage im Ostermonat: 30
[DEBUG] 12:48:42: Feiertag: 1
[DEBUG] 12:48:42: Zahl: 2, oTag: 1, fDiff: 1, index: 1
[DEBUG] 12:48:42: Innerhalb des Referenzmonats > Schleife nicht durchlaufen.
[DEBUG] 12:48:42: Datum des Feiertags berechnen…
[DEBUG] 12:48:42: Feiertag: 02.04.
[DEBUG] 12:48:42: Feiertag: -2
[DEBUG] 12:48:42: Zahl: -1, oTag: 1, fDiff: -2, index: 2
[DEBUG] 12:48:42: Ausserhalb des Referenzmonats > Schleife durchlaufen.
[DEBUG] 12:48:42: Datum des Feiertags berechnen…
[DEBUG] 12:48:42: Feiertag: 29.03.
[DEBUG] 12:48:42: Feiertag: 40
[DEBUG] 12:48:42: Zahl: 41, oTag: 1, fDiff: 40, index: 3
[DEBUG] 12:48:42: Ausserhalb des Referenzmonats > Schleife durchlaufen.
[DEBUG] 12:48:42: Datum des Feiertags berechnen…
[DEBUG] 12:48:42: Feiertag: 11.05.
[DEBUG] 12:48:42: Feiertag: 50
[DEBUG] 12:48:42: Zahl: 51, oTag: 1, fDiff: 50, index: 4
[DEBUG] 12:48:42: Ausserhalb des Referenzmonats > Schleife durchlaufen.
[DEBUG] 12:48:42: Datum des Feiertags berechnen…
[DEBUG] 12:48:42: Feiertag: 21.05.
[DEBUG] 12:48:42: 1. Durchgang: Datum heute=10.05., Feiertag=0
[DEBUG] 12:48:42: Anzahl Tage im Ostermonat: 30
[DEBUG] 12:48:42: Feiertag: 1
[DEBUG] 12:48:42: Zahl: 2, oTag: 1, fDiff: 1, index: 1
[DEBUG] 12:48:42: Innerhalb des Referenzmonats > Schleife nicht durchlaufen.
[DEBUG] 12:48:42: Datum des Feiertags berechnen…
[DEBUG] 12:48:42: Feiertag: 02.04.
[DEBUG] 12:48:42: Feiertag: -2
[DEBUG] 12:48:42: Zahl: -1, oTag: 1, fDiff: -2, index: 2
[DEBUG] 12:48:42: Ausserhalb des Referenzmonats > Schleife durchlaufen.
[DEBUG] 12:48:42: Datum des Feiertags berechnen…
[DEBUG] 12:48:42: Feiertag: 29.03.
[DEBUG] 12:48:42: Feiertag: 40
[DEBUG] 12:48:42: Zahl: 41, oTag: 1, fDiff: 40, index: 3
[DEBUG] 12:48:42: Ausserhalb des Referenzmonats > Schleife durchlaufen.
[DEBUG] 12:48:42: Datum des Feiertags berechnen…
[DEBUG] 12:48:42: Feiertag: 11.05.
[DEBUG] 12:48:42: Feiertag (11.05.) gefunden.
[DEBUG] 12:48:42: Feiertag: 50
[DEBUG] 12:48:42: Zahl: 51, oTag: 1, fDiff: 50, index: 4
[DEBUG] 12:48:42: Ausserhalb des Referenzmonats > Schleife durchlaufen.
[DEBUG] 12:48:42: Datum des Feiertags berechnen…
[DEBUG] 12:48:42: Feiertag: 21.05.
[DEBUG] 12:48:42: 2. Durchgang: Datum morgen=11.05., Feiertag=1
[DEBUG] 12:48:42: Heute ist kein Feiertag.
[DEBUG] 12:48:42: Morgen ist ein Feiertag. Variable gesetzt!
hab das script hier ausm forum seit ewigkeiten am laufen, aber dieses Jahr hat es schon mehrfach nicht funktioniert?
--[[
%% 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ß
-- Es werden folgende Systemvariablen benötigt:
-- Feiertag_heute
-- Feiertag_morgen
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- EINSTELLUNGEN
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Bitte nur in dieser Sektion Einstellungen vornehmen
local debuging = true -- TOGGLE DEBUGING (true|false)
local Land = "DE" -- LAND angeben (DE, CH)
local Bundesland = "RP" -- 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
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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
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 Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
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 Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
end
if Bundesland =="BE" then -- spezifische Feiertage für Berlin
-- Aray mit Differenztagen zum Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
end
if Bundesland =="BB" then -- spezifische Feiertage für Brandenburg
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
-- Aray mit Differenztagen zum Ostersonntag:
-- Ostersonntag, Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstsonntag,Pfingstmontag
feiertage = {0,1,-2,40,49,50}
end
if Bundesland =="HB" then -- spezifische Feiertage für Bremen
-- Aray mit Differenztagen zum Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
end
if Bundesland =="HH" then -- spezifische Feiertage für Hamburg
-- Aray mit Differenztagen zum Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
end
if Bundesland =="HE" then -- spezifische Feiertage für Hessen
if (Datum == "26.05.") then Feiertag = 1 end -- Fronleichnam
-- Aray mit Differenztagen zum Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
end
if Bundesland =="MV" then -- spezifische Feiertage für Mecklenburg-Vorpommern
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
-- Aray mit Differenztagen zum Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
end
if Bundesland =="NI" then -- spezifische Feiertage für Niedersachsen
-- Aray mit Differenztagen zum Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
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 Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
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 Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
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 Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
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 Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
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 Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
end
if Bundesland =="SH" then -- spezifische Feiertage für Schleswig-Holstein
-- Aray mit Differenztagen zum Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,50}
end
if Bundesland =="TH" then -- spezifische Feiertage für Thüringen
if (Datum == "31.10.") then Feiertag = 1 end -- Reformationstag
-- Aray mit Differenztagen zum Ostersonntag:
-- Ostermontag, Karfreitag, Christi Himmelfahrt, Pfingstmontag
feiertage = {1,-2,40,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
-- 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
feiertage = {1,-2,39,50}
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 Ostersonntag 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 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
jemand ne idee?
danke
Mit freundlichen Grüßen
bademeister