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.

1 Like

Hallo,

wie sieht alles aus im HC3? Ich bin neu hier und kapiere nicht alles. Ich habe den Script als LUA Szene kopiert und es kommt immer eine Fehlermeldung:
[22.11.2020] [11:34:47] [ERROR] [SCENE77]: (load):60: syntax error near ‚local‘

Vielleicht kann mir jemanden helfen. Es wäre schön die Feiertage zu integrieren genau aus dem gennanten Grund mit den Jalousien.
Danke im Voraus!

Hallo

Ich habe das mal bei mir ausprobiert.
Alles OK das Teil läuft ohne Fehlermeldung.
Hast du auch die beiden Variabeln
Feiertag_heute
Feiertag_morgen
angelegt ?
Da ich die Zeilennummer 60 nicht zu 100% identifizieren kann, vermute ich das als Fehler.
Versuche das mal.

PS
@sven_gomann
Danke für das Programm kann es Gut gebrauchen spart mir sehr viel Arbeit !

Gruß Frank

1 Like

Hallo Berges01,

vielen Dank für deine Hilfe. Das habe ich selbstverständlich nicht gemacht. Bin ich mir nicht sicher wie es geht aber probiere ich mal, ob ich es schaffe. Falls nicht werde ich mich nochmal melden.