Da unser Entsorger leider bis heute nicht in der Lage ist, die Daten in verarbeitbarer Form bereit zustellen, habe ich Ende letzten Jahres ein „Berechnungsscript“ geschrieben. Es lief dieses Jahr relativ problemlos.
Bei uns sind die Termine sehr regelmäßig ;), nur bei Feiertagen in der jeweiligen Woche gibt es eine Verschiebung.
Die ganzen „if($IPS_SENDER == „Execute“)“ sind „nur“ zum debuggen.
Das Script läuft einmal Nachts und zeigt am Tag vor der Abholung die Meldung an.
<?php
function boolString($bValue = false) { // returns string
return ($bValue ? ', Feiertag diese Woche' : '');
}
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;
}
}
// HIER die passenden Tage eintragen
// An welchem Tag (0-6) in der geraden oder ungeraden Woche wird was abgeholt
$abfuhrtermine = array ( 'u' => array ( '2' => 'Restmüll rausstellen',
'3' => 'Altpapier/Verpackung rausstellen'),
'g' => array ( '3' => 'Altpapier rausstellen',
'5' => 'Bioabfälle rausstellen'));
$tag[0] = "So";
$tag[1] = "Mo";
$tag[2] = "Di";
$tag[3] = "Mi";
$tag[4] = "Do";
$tag[5] = "Fr";
$tag[6] = "Sa";
$feiertag_diese_woche = GetValueBoolean(42624 /*[Visualisierung\Mülltermine\Datum errechnen\Feiertag in der Woche]*/);
$heuteD = date("d");
$heuteM = date("m");
$heuteY = date("Y");
//*** TEST Tag
$heuteD = 7;
$heuteM = 10;
$heuteY = 2012; //***/
$morgen = mktime( 0, 0, 0, $heuteM, $heuteD+1, $heuteY );
if($IPS_SENDER == "Execute")
echo "Aktueller Tag : ".date("d.m.Y", mktime( 0, 0, 0, $heuteM, $heuteD, $heuteY ))."
Betrachteter Tag: ";
$datum = date("d.m.Y", $morgen);
$woche = date("W", $morgen); // W - Wochennummer des Jahres (z.B.: 28)
$wochentag = date("w", $morgen); // w - Wochentag (0(Sonntag) bis 6(Samstag))
$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\Datum errechnen\Feiertag in der Woche]*/, true);
return;
}
// Feiertagsmerker am Sonntag zurücksetzen
If ($wochentag == 0 )
SetValueBoolean(42624 /*[Visualisierung\Mülltermine\Datum errechnen\Feiertag in der Woche]*/, false);
if($IPS_SENDER == "Execute")
echo $tag[$wochentag]." ".$datum.", Tag ".$wochentag.boolString($feiertag_diese_woche);
// Prüfung auf Gerade oder Ungerade Woche
if($woche % 2 == 0) {
if($IPS_SENDER == "Execute")
echo ", gerade Woche
";
$gu = 'g';
} else {
if($IPS_SENDER == "Execute")
echo ", ungerade Woche
";
$gu = 'u';
}
$ausgabe = "";
SetValueBoolean(18009 /*[Visualisierung\Mülltermine\Meldung anzeigen]*/, false);
if ( !$feiertag_diese_woche ) {
if ( isset($abfuhrtermine[$gu][$wochentag])) {
$ausgabe = $abfuhrtermine[$gu][$wochentag].", Abholung am ".$tag[$wochentag]." ".$datum;
SetValueBoolean(18009 /*[Visualisierung\Mülltermine\Meldung anzeigen]*/, true);
}
} elseif ( isset($abfuhrtermine[$gu][$wochentag-1])) {
$ausgabe = $abfuhrtermine[$gu][$wochentag-1].", Abholung am ".$tag[$wochentag]." ".$datum . " (Feiertagsverschiebung)";
SetValueBoolean(18009 /*[Visualisierung\Mülltermine\Meldung anzeigen]*/, true);
}
if($IPS_SENDER == "Execute")
echo $ausgabe;
SetValueString(47956 /*[Visualisierung\Mülltermine\Meldung]*/, $ausgabe);
?>
Angespornt durch den Beitrag habe ich die Feiertage mit berücksichtigt. Passt für Hannover bis auf einen Tag Ende Dezember, da sind zwei Feiertage in der Woche und ein Abfuhrtermin verschiebt sich um 2 Tage, der andere nicht :O.
Außerdem habe ich die von Axel gesuchte (und gefundene :)) Funktion mit eingetragen.