Hc3 feiertage-script

Ich habe mal das alte Skript „FEIERTAGE-SCRIPT“ von original „Simon Betschmann“ für das HC3 umgeschrieben und noch Bugs raus geholt

-- ************************************************************************
-- 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 für HC2
-- - Basierend auf einer Idee von Peter Beck (01-2011)
-- Version: 1.1 für HC2
-- - Erweiterung für Deutschland und Bundeländer von Udo Haß
-- Version: 1.2 für HC2
-- - 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) für HC2
-- - 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) für HC2
-- - Anpassung der Osterberechnung (temp fix)
-- Version: 1.5 (Manuel Hoefs April 2018) für HC2
-- - kompletter Neuberechnung der Feiertage abhängig von Ostern
-- - Konfigurationserweiterung um Feiertage des kompletten Jahres auszugeben
----------------------------------------------------------------------------------------------------------
local version = '2.0 für HC3';
-- Version: 2.0 (smg2274 August 2020) für das HC3
-- Pfingsten geändert...anstatt 48.+49.Tag -> 49.+50.Tag nach Ostern
-- auch Anzeigefehler in den Debugs beseitigt

-- Das Skript muss einmal täglich gestartet werden, daher empfehle ich einen CronJob !!! 

-- oder 
--[[
{
type = "date",
property = "cron",
operator = "match",
value = {"01", "00", "*", "*", "*", "*"},
isTrigger = true
}
--]]
-- Es werden folgende Systemvariablen benötigt:
-- Feiertag_heute
-- Feiertag_morgen

-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- EINSTELLUNGEN
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- Bitte nur in dieser Sektion Einstellungen vornehmen
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
Wochenende = false -- (true|false) Wochenenden werden ebenfalls als Feiertag/Frei erkannt
showholidays = true -- Liste alle Feiertage im Jahr (true|false)

-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- FEIERTAGE BERECHNEN
-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
print("Version "..version.." am " .. os.date("%c").." gestartet");


-- 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 .. "" .. oMonat .. "." .. Jahr
	end
	print("Osterdatum: ".. oDatum)
	print("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.
		print(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.
		print(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
				print("Wochentag " .. WeekDate .. " ist ein Wochenendtag.")
			else
				print("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
				print("Liste der Feiertage für "..Jahr)
				print("01.01. Neujahr")
				print("01.05. Tag der Arbeit")
				print("03.10. Tag der Deutschen Einheit")
				print("25.12. 1. Weihnachtstag")
				print("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
					print("06.01. Heilige Drei Könige")
					print("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
					print("06.01. Heilige Drei Könige")
					print("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
						print("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
					print("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
					print("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
					print("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
					print("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
					print("15.08. Mariä Himmelfahrt")
					print("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
					print("31.10. Reformationstag")
					print(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
					print("06.01. Heilige Drei Könige")
					print("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
					print("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
				print("01.01. Neujahr")
				print("01.08. Nationalfeiertag")
				print("25.12. Weihnachten")
				print("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
					print("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
					print("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
		print("Anzahl Tage im Ostermonat: "..oTage)
    
		for x in next, feiertage do
			--print("Feiertag: "..feiertage[x])

			fDiff = oTag + feiertage[x]-- Differenztage zum Referenztag hinzurechnen
			--print("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
						--print("Ausserhalb des Referenzmonats > Schleife durchlaufen.")
					else
						calcTag = zahl
						calcMonat = oMonat+count+1
						Schleife = false
						--print("Innerhalb des Referenzmonats > Schleife nicht durchlaufen.")
					end
				end
			end

-- Datum des Feiertags berechnen
			--print("Datum des Feiertags berechnen...")
			if (calcTag < 10) then
				fDatum = "0" .. calcTag .. ""..calcMonat.. "."
			else
				fDatum = calcTag .. ""..calcMonat.. "."
			end
			--print("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
				
				print(fDatum .." ".. feiertag)
			end

-- Prüfen, ob Datum heute/morgen mit Feiertag übereinstimmt
			if (Datum == fDatum) then
				Feiertag = 1
				print("Feiertag ("..fDatum..") gefunden.")
			end
		end

-- VARIABLEN SETZTEN
		if zaehler == 1 then
-- 1. Durchgang: Datum heute mit den Feiertagen prüfen
			print("1. Durchgang: Datum heute="..Datum..", Feiertag="..Feiertag)
			fibaro.setGlobalVariable("Feiertag_heute", tostring(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
			print("2. Durchgang: Datum morgen="..Datum..", Feiertag="..Feiertag)
			fibaro.setGlobalVariable("Feiertag_morgen", tostring(Feiertag))
			zaehler = 3
		end
	end

-- ERGEBNIS AUSGEBEN
	if fibaro.getGlobalVariable("Feiertag_heute") == '0' then
		if (Wochenende) then
			print(os.date("%c") .. " - Heute ist kein Feiertag / Wochenende.")
		else
			print(os.date("%c") .. " - Heute ist kein Feiertag.")
		end
	else
		if (Wochenende) then
			print(os.date("%c") .. " - Heute ist ein Feiertag / Wochenende. Variable gesetzt!")
		else
			print(os.date("%c") .. " - Heute ist ein Feiertag. Variable gesetzt!")
		end
	end
	if fibaro.getGlobalVariable("Feiertag_morgen") == '0' then
		if (Wochenende) then
			print(os.date("%c") .. " - Morgen ist kein Feiertag / Wochenende.")
		else
			print(os.date("%c") .. " - Morgen ist kein Feiertag.")
		end
	else
		if (Wochenende) then
			print(os.date("%c") .. " - Morgen ist ein Feiertag / Wochenende. Variable gesetzt!")
		else
			print(os.date("%c") .. " - Morgen ist ein Feiertag. Variable gesetzt!")
		end
	end
1 Like

Hallo! Wo werden die Feiertage dann ausgegeben?

die Feiertage selber werden nur als Debug ausgegeben und als Globale Variable mit 1 und 0; das Skript ist dafür da, um z.B. Rollos an Feiertagen anders fahren zu lassen, als an normalen Werktagen, oder Heizungssteuerung usw.