Feiertage je Bundesland für Torschliessung

Guten Morgen liebe Gemeinde,

vor kurzem bin ich auf IP -Symcon aufmerksam gemacht wurden und konnte im Rahmen eines Projektes eine Steuerung zum Einsatz bringen . Aktuell ist es nur eine Rolltor Steuerung, diese hat jeweil Zyklische Zeitgesteuerte Intervalle für die Schliessung und Öffnung des Torwegs . Nun würde ich es gerne soweit Automatisieren das zu Feiertagen das Tor geschlossen sein sollte. Aktuell kann ich ja die Zeiten nur in der Konfiguration des Ereignisses ändern, ich würde gerne dem Chef/Mitarbeiter die möglichkeit geben dies per Kalender zu tun. Aber Prio 1 wäre die Feiertagsgeschichte , ich habe hierzu schon einige Forumsbeiträge gelesen, aber die ToniTools sind wohl Offline und ein weiteres Scipt war wohl für die CCU gedacht und lies sich nicht im IP -Symcon ausführen.
hier das Script :
HomeMatic-INSIDE - HomeMatic-INSIDE - Feiertagsberechnung

Ich hoffe auf Eure Hilfe
grüße aus Magdeburg
Marcel

Hallo und Willkommen Marcel !

Ich würde Toni - falls er hier nicht gerade zufällig mitliest - sonst einfach mal ne PN schreiben, dann stellt er dir die Tools bestimmt zur Verfügung.

Alternativ empfehle ich dir mal im Rahmen von Heizungsteuerungen nach Feiertagen zu suchen, da wurde das IMHO schon öfter eingesetzt.

Hallo Marcel,

ich habe das mit den Feiertagen recht trivial gelöst. Man nehme eine normale Textdatei und schreibe die Feiertage da rein :

06.04.2012;Karfreitag
09.04.2012;Ostermontag
u.s.w.

Diese Datei wird jede Nacht überprüft, ob eines der Daten übereinstimmt. Dann wird ggf. die BOOL Variable „Feiertag“ auf TRUE gesetzt:

$Feiertag = IstFeiertag(file("c:\ip-symcon\Feiertage.txt"));
SETVALUE(13116 /*[0_Globale Parameter und Skripte\Feiertag]*/,$Feiertag);

function IstFeiertag($Datensatz)
 {
	   $status=FALSE;
		$datum = date("d.m.Y");
		$datum_s=strtotime($datum);
		for ($index=0; $index <count($Datensatz);$index++)
		 {
			$vergl=strtotime( substr($Datensatz[$index],0,10));
			IF ( $vergl == $datum_s )
	          $status=TRUE;
		 }
		 return($status);
}

Anschließend können aufgrund dieser Variable die Auslösezeiten eines Events gesetzt werden. Z.B. so :

IF ($Feiertag or $Wochenende )
{
	IPS_SetEventCyclic(23595 /*[Rolläden\Rolläden WZ\Fenster links\Morgens halb hochfahren \]*/,2,1,0,0,0,0);
	IPS_SetEventCyclicTimeBounds(23595 /*[Rolläden\Rolläden WZ\Fenster links\Morgens halb hochfahren \]*/,mktime(8,30,0),0);
	IPS_SetEventCyclic(45644 /*[Rolläden\Rolläden WZ\Fenster rechts\Morgens halb hochfahren\]*/,2,1,0,0,0,0);
	IPS_SetEventCyclicTimeBounds(45644 /*[Rolläden\Rolläden WZ\Fenster rechts\Morgens halb hochfahren\]*/,mktime(8,30,0),0);
	IPS_SetEventCyclic(15696 /*[Rolläden\Rolladen Musikzimmer\Morgens hochfahren \]*/,2,1,0,0,0,0);
	IPS_SetEventCyclicTimeBounds(15696 /*[Rolläden\Rolladen Musikzimmer\Morgens hochfahren \]*/,mktime(9,00,0),0);
	logging("System","Rolladen Schließzeit auf WOCHENENDE/FEIERTAG gesetzt");
}
ELSE
{
   IPS_SetEventCyclic(23595 /*[Rolläden\Rolläden WZ\Fenster links\Morgens halb hochfahren \]*/,2,1,0,0,0,0);
	IPS_SetEventCyclicTimeBounds(23595 /*[Rolläden\Rolläden WZ\Fenster links\Morgens halb hochfahren \]*/,mktime(6,45,0),0);
	IPS_SetEventCyclic(45644 /*[Rolläden\Rolläden WZ\Fenster rechts\Morgens halb hochfahren\]*/,2,1,0,0,0,0);
	IPS_SetEventCyclicTimeBounds(45644 /*[Rolläden\Rolläden WZ\Fenster rechts\Morgens halb hochfahren\]*/,mktime(6,45,0),0);
	IPS_SetEventCyclic(15696 /*[Rolläden\Rolladen Musikzimmer\Morgens hochfahren \]*/,2,1,0,0,0,0);
	IPS_SetEventCyclicTimeBounds(15696 /*[Rolläden\Rolladen Musikzimmer\Morgens hochfahren \]*/,mktime(7,00,0),0);
	logging("System","Rolladen Schließzeit auf NORMALEN WOCHENTAG gesetzt");

Vielleicht hilft Dir das !

Grüße
Walter

Ganz am Anfang meiner IPS-Zeit hatte ich im Forum das hier gefunden und damals ein klein wenig umgestrickt damit das Script eine Feiertagsvariable setzt und ebenso einen Status für die Adventszeit - Stichwort Weihnachtsaussenbeleuchtung. Seit dem nichts mehr dran gemacht - bitte also um Nachsicht:


<?

SetValueString(CreateVariableByName($IPS_SELF, "1. Advent", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), '1. Advent')));
SetValueString(CreateVariableByName($IPS_SELF, "2. Advent", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), '2. Advent')));
SetValueString(CreateVariableByName($IPS_SELF, "3. Advent", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), '3. Advent')));
SetValueString(CreateVariableByName($IPS_SELF, "4. Advent", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), '4. Advent')));
SetValueString(CreateVariableByName($IPS_SELF, "Heilige drei Könige", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Heilige drei Könige')));
SetValueString(CreateVariableByName($IPS_SELF, "Heilige drei Könige plus 1", 3, "~String"),date("d.m.Y", Feiertag(date("Y")+1, 'Heilige drei Könige')));
SetValueString(CreateVariableByName($IPS_SELF, "Rosenmontag", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Rosenmontag')));
SetValueString(CreateVariableByName($IPS_SELF, "Fastnacht", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Fastnacht')));
SetValueString(CreateVariableByName($IPS_SELF, "Karfreitag", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Karfreitag')));
SetValueString(CreateVariableByName($IPS_SELF, "Ostersonntag", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Ostersonntag')));
SetValueString(CreateVariableByName($IPS_SELF, "Ostermontag", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Ostermontag')));
SetValueString(CreateVariableByName($IPS_SELF, "Tag der Arbeit", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Tag der Arbeit')));
SetValueString(CreateVariableByName($IPS_SELF, "Christi Himmelfahrt", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Christi Himmelfahrt')));
SetValueString(CreateVariableByName($IPS_SELF, "Pfingstsonntag", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Pfingstsonntag')));
SetValueString(CreateVariableByName($IPS_SELF, "Pfingstmontag", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Pfingstmontag')));
SetValueString(CreateVariableByName($IPS_SELF, "Fronleichnam", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Fronleichnam')));
SetValueString(CreateVariableByName($IPS_SELF, "Mariä Himmelfahrt", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Mariä Himmelfahrt')));
SetValueString(CreateVariableByName($IPS_SELF, "Tag der deutschen Einheit", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Tag der deutschen Einheit')));
SetValueString(CreateVariableByName($IPS_SELF, "Reformationstag", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Reformationstag')));
SetValueString(CreateVariableByName($IPS_SELF, "Allerheiligen", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Allerheiligen')));
SetValueString(CreateVariableByName($IPS_SELF, "Buß- und Bettag", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Buß- und Bettag')));
SetValueString(CreateVariableByName($IPS_SELF, "Heiligabend", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Heiligabend')));
SetValueString(CreateVariableByName($IPS_SELF, "1. Weihnachtsfeiertag", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), '1. Weihnachtsfeiertag')));
SetValueString(CreateVariableByName($IPS_SELF, "2. Weihnachtsfeiertag", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), '2. Weihnachtsfeiertag')));
SetValueString(CreateVariableByName($IPS_SELF, "Silvester", 3, "~String"),date("d.m.Y", Feiertag(date("Y"), 'Silvester')));

// Heute Feiertag?

$feiertage = array(	
				"Neujahr",
				"Heilige Drei Könige",
				"Rosenmontag",
				"Fastnacht",
				"Aschermittwoch",
				"Karfreitag",
				"Ostersonntag",
				"Ostermontag",
				"Tag der Arbeit",
				"Christi Himmelfahrt",
				"Pfingstsonntag",
				"Pfingstmontag",
				"Fronleichnam",
				"Mariä Himmelfahrt",
				"Tag der deutschen Einheit",
				"Reformationstag",
				"Allerheiligen",
				"Buß- und Bettag",
				"1. Advent",
				"Heiligabend",
				"1. Weihnachtsfeiertag",
				"2. Weihnachtsfeiertag",
				"Silvester",
				);
	$count = 0;
	while ($count < count($feiertage))
		{
		if (date("d.m.Y", time()) == date("d.m.Y", (Feiertag(date("Y"), $feiertage[$count]))))
		   {
			SetValueBoolean(CreateVariableByName($IPS_SELF, "Feiertag", 0, "Schalter"), true);
			$count = count($feiertage);
			}
			else
			{
			SetValueBoolean(CreateVariableByName($IPS_SELF, "Feiertag", 0, "Schalter"), false);
			}
		$count ++;
		}
	
// Adventsszeit ?
$AdvStart = mktime(0,0,1,date("m", Feiertag(date("Y"), '1. Advent')),date("d", Feiertag(date("Y"), '1. Advent')),date("Y", Feiertag(date("Y"), '1. Advent')));
$AdvStop  = mktime(23,59,59,1,6,date("Y")+1);

if (time() > $AdvStart and time() < $AdvStop)
	{
	SetValueString(CreateVariableByName($IPS_SELF, "Advent", 3, "~String"),"Adventszeit");
	}
	else
	{
	SetValueString(CreateVariableByName($IPS_SELF, "Advent", 3, "~String"),"keine Adventszeit");
   }
   
// Errechnet das Datum des Ostersonntags für ein gegebenes Jahr
function easter($year) {
    if($year > 2038 || $year < 1970) {
        return false;
    } else {
        $a = $year % 19;
        $b = $year % 4;
        $c = $year % 7;
        $m = ((8 * ($year / 100) + 13) / 25) - 2;
        $s = ($year / 100) - ($year / 400) - 2;
        $M = (15 + $s - $m) % 30;
        $N = (6 + $s) % 7;
        $d = ($M + 19 * $a) % 30;
        if ($d == 29) {
            $D = 28;
        } elseif ($d == 28 && $a >= 11) {
            $D = 27;
        } else {
            $D = $d;
        }
        $e = (2 * $b + 4 * $c + 6 * $D + $N) % 7;
        $delta = $D + $e + 1;
        $easter = gmmktime(0, 0, 0, 3, 21, $year) + $delta * (24 * 3600);
        return $easter;
    }
}

// Berechnet alle festen und variablen Feiertage eines gegebenen Jahrs.
// Die Feiertage werden als Array zurückgeliefert, wobei der Key dem
// Feiertagsnamen entspricht und der Wert dem entsprechenden Zeitstempel.
function Feiertage($year) {
    $OneDay = 24 * 60 * 60;
    $easter = easter($year);
    if(!$easter) {
        return false;
    } else {
        $advday = date('w', gmmktime(0, 0, 0, 11, 26, $year));
        $advent = gmmktime(0, 0, 0, 11, 26, $year) + (($advday == 0 ? 0 : 7 - $advday) * $OneDay);
        $holidays['Neujahr']                   = gmmktime(0, 0, 0,  1,  1, $year);
        $holidays['Heilige Drei Könige']       = gmmktime(0, 0, 0,  1,  6, $year);
        $holidays['Rosenmontag']               = $easter - (48 * $OneDay);
        $holidays['Fastnacht']                 = $easter - (47 * $OneDay);
        $holidays['Aschermittwoch']            = $easter - (46 * $OneDay);
        $holidays['Karfreitag']                = $easter - (2 * $OneDay);
        $holidays['Ostersonntag']              = $easter;
        $holidays['Ostermontag']               = $easter + (1 * $OneDay);
        $holidays['Tag der Arbeit']            = gmmktime(0, 0, 0,  5,  1, $year);
        $holidays['Christi Himmelfahrt']       = $easter + (39 * $OneDay);
        $holidays['Pfingstsonntag']            = $easter + (49 * $OneDay);
        $holidays['Pfingstmontag']             = $easter + (50 * $OneDay);
        $holidays['Fronleichnam']              = $easter + (60 * $OneDay);
        $holidays['Mariä Himmelfahrt']         = gmmktime(0, 0, 0,  8, 15, $year);
        $holidays['Tag der deutschen Einheit'] = gmmktime(0, 0, 0, 10,  3, $year);
        $holidays['Reformationstag']           = gmmktime(0, 0, 0, 10, 31, $year);
        $holidays['Allerheiligen']             = gmmktime(0, 0, 0, 11,  1, $year);
        $holidays['Buß- und Bettag']           = $advent - (11 * $OneDay);
        $holidays['1. Advent']                 = $advent;
        $holidays['2. Advent']                 = $advent + (7 * $OneDay);
        $holidays['3. Advent']                 = $advent + (14 * $OneDay);
        $holidays['4. Advent']                 = $advent + (21 * $OneDay);
        $holidays['Heiligabend']               = gmmktime(0, 0, 0, 12, 24, $year);
        $holidays['1. Weihnachtsfeiertag']     = gmmktime(0, 0, 0, 12, 25, $year);
        $holidays['2. Weihnachtsfeiertag']     = gmmktime(0, 0, 0, 12, 26, $year);
        $holidays['Silvester']                 = gmmktime(0, 0, 0, 12, 31, $year);
        array_walk($holidays, 'ResetHours');
        return $holidays;
    }
}

// Berechnet das Datum eines bestimmten Feiertags im gegebenen Jahr.
// Liefert als Ergebnis den Zeitstempel des Feiertags bzw. false wenn das Jahr
// ungültig oder der Feiertag unbekannt ist.
function Feiertag($year, $name) {
    $OneDay = 24 * 60 * 60;
    $easter = easter($year);
    if(!$easter) {
        return false;
    } else {
        $advday = date('w', gmmktime(0, 0, 0, 11, 26, $year));
        $advent = gmmktime(0, 0, 0, 11, 26, $year) + (($advday == 0 ? 0 : 7 - $advday) * $OneDay);

        switch (strtolower($name)) {
            case 'neujahr':                   return ResetHour(gmmktime(0, 0, 0,  1,  1, $year));
            case 'heilige drei könige':       return ResetHour(gmmktime(0, 0, 0,  1,  6, $year));
            case 'rosenmontag':               return ResetHour($easter - (48 * $OneDay));
            case 'fastnacht':                 return ResetHour($easter - (47 * $OneDay));
            case 'aschermittwoch':            return ResetHour($easter - (46 * $OneDay));
            case 'karfreitag':                return ResetHour($easter - (2 * $OneDay));
            case 'ostersonntag':              return ResetHour($easter);
            case 'ostermontag':               return ResetHour($easter + (1 * $OneDay));
            case 'tag der arbeit':            return ResetHour(gmmktime(0, 0, 0,  5,  1, $year));
            case 'christi himmelfahrt':       return ResetHour($easter + (39 * $OneDay));
            case 'pfingstsonntag':            return ResetHour($easter + (49 * $OneDay));
            case 'pfingstmontag':             return ResetHour($easter + (50 * $OneDay));
            case 'fronleichnam':              return ResetHour($easter + (60 * $OneDay));
            case 'mariä himmelfahrt':         return ResetHour(gmmktime(0, 0, 0,  8, 15, $year));
            case 'tag der deutschen einheit': return ResetHour(gmmktime(0, 0, 0, 10,  3, $year));
            case 'reformationstag':           return ResetHour(gmmktime(0, 0, 0, 10, 31, $year));
            case 'allerheiligen':             return ResetHour(gmmktime(0, 0, 0, 11,  1, $year));
            case 'buß- und bettag':           return ResetHour($advent - (11 * $OneDay));
            case '1. advent':                 return ResetHour($advent);
            case '2. advent':                 return ResetHour($advent + (7 * $OneDay));
            case '3. advent':                 return ResetHour($advent + (14 * $OneDay));
            case '4. advent':                 return ResetHour($advent + (21 * $OneDay));
            case 'heiligabend':               return ResetHour(gmmktime(0, 0, 0, 12, 24, $year));
            case '1. weihnachtsfeiertag':     return ResetHour(gmmktime(0, 0, 0, 12, 25, $year));
            case '2. weihnachtsfeiertag':     return ResetHour(gmmktime(0, 0, 0, 12, 26, $year));
            case 'silvester':                 return ResetHour(gmmktime(0, 0, 0, 12, 31, $year));
            default:                          return false;
        }
    }
}

// Beseitigt Stundenanteile in einem UNIX-Zeitstempel

function ResetHours(&$timestamp) {
    $hour = date('G', $timestamp);
    $timestamp -= ($hour * 3600);
}
function ResetHour($timestamp) {
    $hour = date('G', $timestamp);
    $timestamp -= ($hour * 3600);
    return $timestamp;
}

    function CreateVariableByName($id, $name, $type, $profile = "")
    {
        global $IPS_SELF;
        $vid = @IPS_GetVariableIDByName($name, $id);
        if($vid === false)
        {
            $vid = IPS_CreateVariable($type);
            IPS_SetParent($vid, $id);
            IPS_SetName($vid, $name);
            IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
            if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
        }
        return $vid;
    }

?>

Es gibt einen Google Feiertagskalender und PHP Schnipsel, wie man aus IPS auf den Kalender zugreift. Lässt sich vielleicht sinnvoll verknuepfen…

Gruss, Michael

Guten Tag aus dem windigen Magdeburg,

erst mal finde ich es toll , das sich so viele und so schnell jemand auf den Post gemeldet hat.

Im Grunde kann ich mit dem Script von kronos (vielen Dank) das ganze Regeln , ich passe einfach die Feiertage für mein Bundesland an und dann passt das .

Die Google Geschichte liest sich toll, ist aber wieder ein Element mehr in der IT Infrastruktur das beachtet werden muss, und da wir nen Exchange haben wäre der eigentlich dafür da.Daher muss ich ihn leider streichen.

Schön das es noch Foren gibt die aktiv sind , das gibt mir Hoffnung Hilfe zu finden wenn man Sie braucht.

Dank an alle Beteiligten
Marcel

Die Suche würde dich zu folgendem (alten) Beitrag bringen. Der Beitrag war auf Platz 2 bei der großen Suchmaschine „PHP Feiertag berechnen“ :).

Du kannst die meisten Feiertage aufgrund ihres Datums :wink: oder in Abhängigkeit zu Ostern berechnen.

Ich verwende folgende Funktion

function getGermanPublicHolidays($year = null) {
	if(!$easter = easter_date($year)) return false;
	else {
		$holidays['Neujahr']             = mktime(0,0,0,1,1,$year);
		$holidays['Rosenmontag']         = strtotime("-48 days", $easter);
		$holidays['Tag der Arbeit']      = mktime(0,0,0,5,1,$year);
		$holidays['Karfreitag']          = strtotime("-2 days", $easter);
		$holidays['Ostern']              = $easter;
		$holidays['Ostersonntag']        = $easter;
		$holidays['Ostermontag']         = strtotime("+1 day", $easter);
		$holidays['Himmelfahrt']         = strtotime("+39 days", $easter);
		$holidays['Pfingsten']           = strtotime("+49 days", $easter);
		$holidays['Pfingstsonntag']      = strtotime("+49 days", $easter);
		$holidays['Pfingstmontag']       = strtotime("+50 days", $easter);
		$holidays['Fronleichnam']        = strtotime("+60 days", $easter);
		$holidays['Tag der Einheit']     = mktime(0,0,0,10,3,$year);
		$holidays['Heiligabend']         = mktime(0,0,0,12,24,$year);
		$holidays['1. Weihnachtsfeiertag'] = mktime(0,0,0,12,25,$year);
		$holidays['2. Weihnachtsfeiertag'] = mktime(0,0,0,12,26,$year);
		$holidays['Silvester']           = mktime(0,0,0,12,31,$year);
		$holidays['1. Advent']           = strtotime("1 sunday", mktime(0,0,0,11,26,$year));
		$holidays['2. Advent']           = strtotime("2 sunday", mktime(0,0,0,11,26,$year));
		$holidays['3. Advent']           = strtotime("3 sunday", mktime(0,0,0,11,26,$year));
		$holidays['4. Advent']           = strtotime("4 sunday", mktime(0,0,0,11,26,$year));
		return $holidays;
	}
}

Und im Script z.B. (aus komplette Müllterminberechung)


$heuteD = date("d");
$heuteM = date("m");
$heuteY = date("Y");
$morgen = mktime( 0, 0, 0, $heuteM, $heuteD+1, $heuteY );
$feiertag = array_search($morgen, getGermanPublicHolidays(date("Y",$morgen)));
if ( $feiertag <> "" AND !($wochentag == 0) ) {
   if ( $_IPS['SENDER'] == "Execute" )
		echo $feiertag.", KEINE Abholung, dadurch 1 Tag Verschiebung";
	SetValueBoolean(42624 /*[Visualisierung\Mülltermine\Abfuhrdatum errechnen\Feiertag in der Woche]*/, true);
	SetValueString(12400 /*[Visualisierung\Mülltermine\Abfuhrdatum errechnen\Feiertag Name]*/, $feiertag);
	return;
}