ZVO - Gelber Sack / Blaue Tonne auslesen

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.

hallo Ralf,
wo holst du denn die Funktion „getGermanPublicHolidays“ her ?
habs gefunden

Hallo Jens,

ich bin soweit.

Das ist die Funktion:


function iCal_to_String($filename)
{
/*=============================================================
iCal_to_String - Martin Heinzel - 16.12.2011
Version: 0.1

Beschreibung:
Mit dieser Funktion wird eine iCalender Datei in eine String-
variable gewandelt.


Änderungen
----------

tt.mm.jjjj von Version x.x -> y.y

Beschreibung:

================================================================*/

// Variablen Deklaration --------------------------------------

// Variablen
//--------------
$iCal_DS_komplett 					=	"";	//Komplette iCalender Datensatz
$iCal_String            			=  "";	//gewandelter iCalender Datensatz
$term_jahr  							= 	"";   //Termin Jahr
$term_monat 							= 	"";   //Termin Monat
$term_tag								=	"";   //Termin Tag
$term_inhalt 							=	"";   //Termin Text

//-------------------------------------------------------------

//--------------------------- Main ----------------------------

//Daten holen
if(file_exists($filename))
{

	//Termine in Variable einlesen
	$iCal_DS_komplett					= file_get_contents($filename);
	//Den kompletten Datensatz zerlegen
	$iCal_DS_komplett_arr 			= explode("BEGIN:", $iCal_DS_komplett);

	//alle Datensätze durchlaufen
	foreach($iCal_DS_komplett_arr as $key => $value)
	{
		//Der erste Datensatz ist "2"
	   if($key > 1)
		{
			//einzelnen Datensatz in Daten zerlegen
		   $iCal_arr = explode("
", $value);

			//Nur Datensätze vom Typ "VEVENT" durchlaufen
			if($iCal_arr[0] == "VEVENT")
			{
    			//alle Daten durchlaufen
				foreach($iCal_arr as $ikey => $ivalue)
				{
					//Daten zerlegen in Parameter und Wert
            	$Data_arr = explode(":", $ivalue);

					//Kontrolle der Parameter
					Switch($Data_arr[0])
					{

						//Zeitstempel Datum
						case "DTSTART;VALUE=DATE":
						   $term_jahr  	= substr($Data_arr[1], 0, 4);
						   $term_monat 	= substr($Data_arr[1], 4, 2);
						   $term_tag		= substr($Data_arr[1], 6, 2);
							break;

						case "SUMMARY;LANGUAGE=de":
				      	$term_inhalt 	= $Data_arr[1];

					}
				}
				
				$iCal_String            .= $term_tag.".".$term_monat.".".$term_jahr.",".$term_inhalt."
";
				
			}
		}
	}
}
else
{
	//Wenn die Datei nicht existiert dann wird ERROR_FILENAME ausgegeben
	$iCal_String 			= "ERROR_FILENAME";
}

return $iCal_String;
//------------------------- Main ENDE --------------------------

}

Die Einbindung:



//Ort der iCalender-Datei
$filename   	=  IPS_GetKernelDir()."meldungen\\muell\\Leerungstermine0003807.ics";
//Aufruf der Funktion
$iCal_String   =  iCal_to_String($filename);
//ausgeben der Termine
echo $iCal_String;


Ich habs jetzt erst mal in ein String gepackt.
Schau dir das mal an.
Wenn Du doch mehrere Strings (String Array) haben möchtest
melde dich Bitte.

Hallo Martin,

schaut gut aus!
Vielen Dank erst einmal dafür … ich muss nun schauen, wie ich das Ergebis verwerte. Im Grunde wäre ja am einfachsten den String nun zu zerlegen und in meine 4 Arrays zu speichern, damit ich mein altes Script weiter benutzen kann.

Gruß
Jens

Ja jetzt wird mir ja einiges klar. :smiley:
Nee dann lass mal.

Ich mach da Array draus.

Ich glaub ich habs schon :wink:

						 Switch($term_inhalt)
							 {
							   case "Restmuell":
		                		$restmuell[] = $term_tag.".".$term_monat.".".$term_jahr;
		                     break;
		                  case "Biomuell":
									$biomuell[] = $term_tag.".".$term_monat.".".$term_jahr;
				               break;
		                  case "Gelber Sack":
									$wertstoff[] = $term_tag.".".$term_monat.".".$term_jahr;
				               break;
		                  case "Papiertonne":
							 		$papier[] = $term_tag.".".$term_monat.".".$term_jahr;
		                     break;
		                  case "Weihnachtsbaeume":
							 		$baum[] = $term_tag.".".$term_monat.".".$term_jahr;
							}
//Aufruf der Funktion
$iCal_String   =  iCal_to_String($filename);

//ausgeben der Termine
//print_r($iCal_String);
foreach($iCal_String[0] as $datum)
	{echo $datum."
";}

Gruß
Jens

Hallo Forum,

ich versuche mich gerade an Ralfs Script.
Jedoch verstehe ich das mit der Function „getGermanPublicHolidays“ nicht.:confused:

Kann mir hier jemand weiterhelfen?
Trotz intensiver Suche konnte ich noch keine vernünftige Antwort darauf finden.
Der richtige Suchbegriff könnte hier schon weiterhelfen.:rolleyes:

Vielen Dank.

Darklord

Ist nur die Frage was Du an den deutschen Feiertagen nicht verstehst.

Gruß
Bruno

Was verstehst du da nicht?
Kann dir PHP: Funktionen - Manual weiterhelfen?

Dazu wird er im php.net maximal den Einstiegsparameter bezüglich Ostern finden ;).

Die Funktion ist doch im Beitrag 41 enthalten.

Was fehlt dir denn zum Verständnis?

Mit easter_date($year) bekommst du "den Begin des Ostersonntag im durch year spezifizierten Jahr " und damit werden alle weiteren Feiertage ausgerechnet, da sie „relativ“ zum Ostersonntag sind.

Hallo an alle,

danke für Eure Antworten.
Ich habe mich leider missverständlich ausgedrückt.
Die Berechnung der Feiertage relativ zu Ostern ist nicht das Problem

Sondern „easter_date($year)“.
Wenn ich das richtig verstanden habe wird das nach Gaus berechnet, siehe Script.

Den Aufruf verstehe ich hierbei nicht.
Ich gehe mal davon aus, dass dieses ein eigenes Script ist, das durch das Feiertag-Script aufgerufen wird.
Ist das richtig?
Irgendwie macht es hier noch nicht wirklich „klick“.
Ich hoffe, dass Ihr mir hier auf die Sprünge helfen könnt.

Vielen Dank.

<?php

   function ostersonntag($year) {

      $J = date ("Y", mktime(0, 0, 0, 1, 1, $year));

      $a = $J % 19;
      $b = $J % 4;
      $c = $J % 7;
      $m = number_format (8 * number_format ($J / 100) + 13) / 25 - 2;
      $s = number_format ($J / 100 ) - number_format ($J / 400) - 2;
      $M = (15 + $s - $m) % 30;
      $N = (6 + $s) % 7;
      $d = ($M + 19 * $a) % 30;

      if ($d == 29) {
         $D = 28;
      } else if ($d == 28 and $a >= 11) {
         $D = 27;
      } else {
         $D = $d;
      }

      $e = (2 * $b + 4 * $c + 6 * $D + $N) % 7;


      $easter = mktime (0, 0, 0, 3, 21, $J) + (($D + $e + 1) * 86400);

      return $easter;

   }

   echo date("Y-m-d", ostersonntag('2004'));

?> 

das ist ne eigenständige Funktion.
Aufruf incl. echo-Ausgabe:

echo ostersonntag(2012);

…und du bekommst das Datum für Orstern 2012.:wink:

Das ist eine Standard Funktion im PHP, so wie echo.

Hallo zusammen

bei uns wird eine Website mit Ical Event herausgegeben. Leider kann ich nicht alle datein auf einmal speichern, sondern müßte jede einzeln auswählen. Kann mann das mit einen Script auslesen?
weiter vorn habe ich schon gelesen das ical verwendet worden ist, aber so wie ich das verstanden haben konnte da die kompletten events gezogen werden. Könnt ihr mir weiterhelfen?

http://www.lra-aoe.de/umweltschutz-recht-und-technik/abfallwirtschaft/abfallkalender-neu/winhoering/

Vielen Dank

Hallo alle zusammen,
ich hoffe Ihr könnt mir weiterhelfen?

Da ich in Bargteheide wohne habe ich mir meine Daten mit hilfe von Snoopy von der AWSH geholt.
Jetzt haben die aber leider Ihre Seite umgbaut und ich bekomme keine Daten mehr, meine erneuten versuche mein PHP-Code umzubauen um wieder an die Daten zu kommen klapt leider nicht, vielleicht könnt Ihr mir ein klein wenig weiterhelfen?

Die Seite von AWSH ist hier zu finden:
https://www.awsh.de/abfuhrtermine/abfuhrkalender/

nachdem man den Ort auswählt:
Bargteheide

bekommt man die auswahl der Müllart und schon hier kommt mein code nicht weiter, die auswahl des Ortes wir noch eingetragen aber die AWSH seite reagiert nicht drauf!

Hier mein Code:


<? 

include("Snoopy.class.php"); 

$snoopy = new Snoopy; 
$snoopy->referer="http://www.awsh.de/abfuhrtermine/abfuhrkalender/"; 

$submit_url = "http://www.awsh.de/abfuhrtermine/abfuhrkalender/"; 
$submit_vars["ort"] = "506"; 
//$submit_vars["strasse"] = "disabled"; 

//Session reaktivieren 
$snoopy->submit($submit_url,$submit_vars); 
//Daten holen 
$snoopy->submit($submit_url,$submit_vars); 
$buffer = $snoopy->results; 
echo "Inhalt buffer";
echo $buffer;
echo "Inhalt buffer ende";

habt Ihr eine Idee wie ich weiter komme?

Gruß
Matthias

Wenn du dir mal die Abfragen in z.B. der Chrome Entwicklerkonsole anschaust, dann siehst du, dass die ein paar neue Felder hinzugefügt haben. Das musst du dann wahrscheinlich auch tun.

paresy

Danke für die super schnelle antwort.

Du hast recht wenn ich händisch den Ort eingebe, erweitert sich die seite und ich finde auch die Müllart Felder z.B. R02, usw. im Quellcode der Seite.

Wenn ich per Php über snoopy den Ort eintrage erweitert sich die Seite von AWSH nicht und genau da hänge ich fest :frowning:

gruß

Moin,

nachdem ich das hier gelesen habe, war ich etwas enttäuscht, dass es nicht für mein lauschiges Städtchen geht.

Also habe ich mich aufgemacht, und die eigene Quelle angezapft.

Beispiel: Cloppenburger Str.

http://services.oldenburg.de/index.php?id=45

Nun stellt sich mir allerdings die Frage, wie man das einheitlich für die Allgemeinheit zur Verfügung stellen kann. Denn ich bekomme den kompletten Kalender ausgehändigt, und nicht nur den nächsten Termin für alle Tonnen. Das werde ich wohl mal als nächstes Filtern. Da ich mir wünsche das im WebFront auch schick mit ner Grafik darzustellen, wollte ich mal fragen, ob wir da etwas gemeinsam auf die Beine stellen wollen.

Mein Skript wirft derzeit alle Termine für die einzelnen Tonnen in ein Array. Vllt. will ja im weiteren Verlauf irgendjemand eine globale Übersicht haben?!

Oder hat Paresy keine Luft auf Stress? :stuck_out_tongue:

Gruß
Kevin

Da steht doch auch was von „Neue Abfuhrerinnerung“ und ein Mailskript gibt es auch schon :eek:

Gruß
Bruno

Die benötigte ‚snoopy.class.php‘ runterladen und in den ‚scripts‘ Ordner kopieren.
SourceForge.net: Snoopy

Wie mache ich das bei der Symbox ?
Ich habe mit WinSCP auf Root koopiert aber wie kommt es in das System ?

Ist es noch Aktuell oder gibt es was neueres für den ZVO, bei mir kommen sie auch :wink: