Hallo zusammen,
jemand fragte mich ob das Script, dass ich zunächst nur um die Verarbeitung einer .ics Datei erweitert hatte, einwandfrei bei mir läuft. Die Antwort, nein das tat es nicht. Ich habe es komplett überarbeitet, teils entschlackt und als neue Funktion, die Anzeige für den aktuellen Tag hinzugefügt. Nun läuft es bei mir fehlerfrei!
Beispiel für das Webfront (Voransage die auch einen Tag vor dem Ereignis gepusht wird)
Und an dem entsprechende Tag heißt es dann im Webfront:
Leerung heute:…
Script:
<?
//******************************************************************
// Urheber der Ursprungsversion ist 'mesa' Stand 20.05.2016
// https://www.symcon.de/forum/threads/31601-M%C3%BCll-Reminder-Bring-den-M%C3%BCll-raus%21?highlight=m%FCllplan
//
// überarbeitet von D.Voss
//
//
// Vielen Dank erstmal an den urspruenglichen Verfasser mesa...!
//
// Aenderung fuer das Einlesen einer ICal Datei die von der Hildesheimer Abfallentsorgung (ZAH) angeboten wird.
// Dadurch entfällt die jaehrliche Eingabe der ca. 60 Termine im Jahr in dieses Script...
//
// - Dazu auf die Seite 'https://www.zah-hildesheim.de/Termine/abholtage' gehen
// - Den Ort, Ortsteil und die Strasse auswaehlen
// - Ueber das iCal Icon einen Download anstossen
// - Und die heruntergeladene Datei in das Verzeichnis ablegen das in $icsdatei angegeben ist
//
//******************************************************************
//
// Aufruf Parameter
//
$mode = $_IPS['MODE']; // Modus "Abends" und "Morgens"
//
// Wichtig fuer die korrekte Timestamp Bestimmung
//
setlocale(LC_ALL, "");
// Eingabe nötig
// Termin "Nächste Leerung" als Stringvariable anlegen
// kann dann im Webfront angezeigt werden
//******************************************************************
$nächster_termin = 38940; // Bitte eigene Werte eintragen*
//******************************************************************
// Eingabe nötig
// Webfront ID zur Pushnachrichten Übertagung
//******************************************************************
$webfront_id = 29137; // Bitte eigene Werte eintragen*
//******************************************************************
// In diesem Script sind folgende Namen hinterlegt
// Tonne 1 > Wertstoff
// Tonne 2 > Bioabfall
// Tonne 3 > Restabfall
// Tonne 4 > neue Werte eingeben
//
// Die folgende .ics Datei kann man unter ZAH Hildesheim herunterladen
//
$icsdatei = "C:\\IP-Symcon\\media\\Abfuhrkalender_Hildesheim.ics";
$zeilen = file( $icsdatei, FILE_IGNORE_NEW_LINES );
if( $zeilen === false )
{
IPS_LogMessage( "Die Abfuhrkalender Datei wurde nicht gefunden!", $icsdatei );
return false;
}
//
// Durchlaufen des Arrays und erzeugen der Datetime Objekte in den entsprechenden Arrays
//
$icssuchbegriff1 = "Gelber Sack"; // Suchbegriff fuer Tonne 1 -> Wertstoff
$icssuchbegriff2 = "Biomüll"; // Suchbegriff fuer Tonne 2 -> Bioabfall
$icssuchbegriff3 = "Restmüll"; // Suchbegriff fuer Tonne 3 -> Restabfall
$zeitpunkt = "";
$NameT1 = "Wertstoff - gelber Sack";
$tonne1 = array();
$NameT2 = "Bioabfall - grüne Tonne";
$tonne2 = array();
$NameT3 = "Restabfall - graue Tonne";
$tonne3 = array();
foreach ($zeilen as $zeile) {
if( stristr( $zeile, "DTSTART" ) === False )
{
}
else
{
//
// Datum extrahieren aus...
// Beispielzeile: DTSTART;TZID=Germany/Berlin:20171110T070000
// das gesuchte Datum befindet sich direkt hinter dem Doppelpunkt
// im Format JJJJMMTT
//
$zeitpunkt = substr( $zeile, strpos( $zeile, ":") + 1, 8 );
$zeitpunkt = substr( $zeitpunkt, 0, 4 ) . "-" . substr( $zeitpunkt, 4, 2 ) . "-" . substr( $zeitpunkt, 6, 2 );
}
if( stristr( $zeile, "SUMMARY" ) === False )
{
}
else
{
//
// Abfall Art extrahieren aus...
// Beispielzeile: SUMMARY:Abfuhr Biomüll
//
if( stristr( $zeile, $icssuchbegriff1 ) === False )
{
}
else
{
//
// Tonne 1
//
$tonne1[] = new DateTime( $zeitpunkt );
}
if( stristr( $zeile, $icssuchbegriff2 ) === False )
{
}
else
{
//
// Tonne 2
//
$tonne2[] = new DateTime( $zeitpunkt );
}
if( stristr( $zeile, $icssuchbegriff3 ) === False )
{
}
else
{
//
// Tonne 3
//
$tonne3[] = new DateTime( $zeitpunkt );
}
}
}
//
// Den aktuellen Tag um 0 Uhr ermitteln
//
$today_tmp = new DateTime();
$today = new DateTime( date( 'Y-m-d', mktime( 0,0,0, (int)$today_tmp->format('m'), (int)$today_tmp->format('d'), (int)$today_tmp->format('Y') ) ) );
// wenn nur 3 Tonnen vorhanden sind kann dies genutzt werden um eine Meldung "neue Werte eintragen"
// per Pushnachricht zu melden, hier als Beispiel 31.12. und 1.1.
// Es müssen zwei Werte eingetragen sein.
// Eingabe nötig bzw. anpassen
$NameT4 = "Neue Müllkalender Datei herunterladen !"; // oder "neue Werte eintragen"
$tonne4 =
[
new DateTime( date( 'Y-m-d', mktime( 0,0,0, 01, 01, (int)$today_tmp->format('Y') + 1 ) ) ), // 01.01.20xx
new DateTime( date( 'Y-m-d', mktime( 0,0,0, 12, 31, (int)$today_tmp->format('Y') ) ) ) // 31.12.20xx
];
//
// Auswertung der erzeugten Arrays
//
$next_tonne1 = new Datetime( date( 'Y-m-d', mktime( 0,0,0, (int)$today_tmp->format('m'), (int)$today_tmp->format('d') - 1, (int)$today_tmp->format('Y') ) ) );
$next_tonne2 = new Datetime( date( 'Y-m-d', mktime( 0,0,0, (int)$today_tmp->format('m'), (int)$today_tmp->format('d') - 1, (int)$today_tmp->format('Y') ) ) );
$next_tonne3 = new Datetime( date( 'Y-m-d', mktime( 0,0,0, (int)$today_tmp->format('m'), (int)$today_tmp->format('d') - 1, (int)$today_tmp->format('Y') ) ) );
$next_tonne4 = new Datetime( date( 'Y-m-d', mktime( 0,0,0, (int)$today_tmp->format('m'), (int)$today_tmp->format('d') - 1, (int)$today_tmp->format('Y') ) ) );
$i=-1;
foreach ($tonne1 as &$d)
{
$i++;
$diff = $today->diff($d);
if( (int)$diff->format("%r%a") >= 0 )
{
$next_tonne1 = $tonne1[$i];
break;
}
}
$i=-1;
foreach ($tonne2 as &$d)
{
$i++;
$diff = $today->diff($d);
if( (int)$diff->format("%r%a") >= 0 )
{
$next_tonne2 = $tonne2[$i];
break;
}
}
$i=-1;
foreach ($tonne3 as &$d)
{
$i++;
$diff = $today->diff($d);
if( (int)$diff->format("%r%a") >= 0 )
{
$next_tonne3 = $tonne3[$i];
break;
}
}
$i=-1;
foreach ($tonne4 as &$d)
{
$i++;
$diff = $today->diff($d);
if( (int)$diff->format("%r%a") >= 0 )
{
$next_tonne4 = $tonne4[$i];
break;
}
}
$diff_tonne1 = $today->diff( $next_tonne1, false);
$diff_tonne2 = $today->diff( $next_tonne2, false);
$diff_tonne3 = $today->diff( $next_tonne3, false);
$diff_tonne4 = $today->diff( $next_tonne4, false);
$diff_tonne1_in_tagen = (int)$diff_tonne1->format("%r%a");
$diff_tonne2_in_tagen = (int)$diff_tonne2->format("%r%a");
$diff_tonne3_in_tagen = (int)$diff_tonne3->format("%r%a");
$diff_tonne4_in_tagen = (int)$diff_tonne4->format("%r%a");
//echo "Today is " . $today->format("y-m-d") ."
";
//echo "Next Tonne 1 in ". $diff_tonne1_in_tagen ."
";
//echo "Next Tonne 2 in ". $diff_tonne2_in_tagen ."
";
//echo "Next Tonne 3 in ". $diff_tonne3_in_tagen ."
";
//echo "Next Tonne 4 in ". $diff_tonne4_in_tagen ."
";
//
// Die 'naechsten Liefertage' sortieren und den kleinsten Wert groesser als 0 (Heute) heraussuchen,
// das ist naemlich der gesuchte naechste Termin!
//
$sortierung = array( $diff_tonne1_in_tagen, $diff_tonne2_in_tagen, $diff_tonne3_in_tagen, $diff_tonne4_in_tagen );
sort( $sortierung, SORT_NUMERIC );
//
// Script Ausfuehrung am Morgen (00:30)
// Fuer die Ueberpruefung der Abfuhr fuer den aktuellen Tag
//
if( $mode == "Morgens" )
{
$leerung_heute = 0;
foreach( $sortierung as $s )
{
if( $s == 0 )
{
$leerung_heute = $s;
break;
}
}
//
// Heutige Leerung benennen und
// Kontrolle ob es noch weitere Leerungen gibt...
//
$result = GetValue( $nächster_termin );
if( $leerung_heute == $diff_tonne1_in_tagen)
{
$result = "Leerung heute : " . $NameT1;
if( $leerung_heute == $diff_tonne2_in_tagen )
{
$result .= " & " . $NameT2;
}
if( $leerung_heute == $diff_tonne3_in_tagen )
{
$result .= " & " . $NameT3;
}
}
else if( $leerung_heute == $diff_tonne2_in_tagen )
{
$result = "Leerung heute : " . $NameT2;
if( $leerung_heute == $diff_tonne3_in_tagen )
{
$result .= " & " . $NameT3;
}
}
else if( $leerung_heute == $diff_tonne3_in_tagen )
{
$result = "Leerung heute : " . $NameT3;
}
}
//
// Script Ausfuehrung am Abend (18:30)
// Fuer die Ueberpruefung der Abfuhr fuer den naechsten Tag
// inkl. event. Notificatiion Sendung
//
if( $mode == "Abends" )
{
$next_leerung_in_tagen = 0;
foreach( $sortierung as $s )
{
if( $s > 0 )
{
$next_leerung_in_tagen = $s;
break;
}
}
//
// Naechste Leerung benennen und
// Kontrolle ob es am naechsten Liefertermin noch weitere Leerungen gibt...
//
$result = '"Keine weitere Leerung in diesem Jahr..."';
$notification = '"Keine weitere Leerung in diesem Jahr..."';
if($next_leerung_in_tagen == $diff_tonne1_in_tagen)
{
$notification = $NameT1;
$result = "Nächste Leerung am ". strftime("%A", $next_tonne1->getTimestamp()) . ": " . $NameT1;
if( $next_leerung_in_tagen == $diff_tonne2_in_tagen )
{
$result .= " & " . $NameT2;
$notification .= " & " . $NameT2;
}
if( $next_leerung_in_tagen == $diff_tonne3_in_tagen )
{
$result .= " & " . $NameT3;
$notification .= " & " . $NameT3;
}
}
else if( $next_leerung_in_tagen == $diff_tonne2_in_tagen )
{
$notification = $NameT2;
$result = "Nächste Leerung am " . strftime("%A", $next_tonne2->getTimestamp()) . ": " . $NameT2;
if( $next_leerung_in_tagen == $diff_tonne3_in_tagen )
{
$result .= " & " . $NameT3;
$notification .= " & " . $NameT3;
}
}
else if( $next_leerung_in_tagen == $diff_tonne3_in_tagen )
{
$notification = $NameT3;
$result = "Nächste Leerung am ". strftime("%A", $next_tonne3->getTimestamp()) . ": " . $NameT3;
}
else if( $next_leerung_in_tagen == $diff_tonne4_in_tagen )
{
$notification = $NameT4;
$result = $NameT4;
}
//
//push notification nur Abends und wenn am naechsten Tag eine Leerung erwartet wird!
//
if( $next_leerung_in_tagen == 1 )
{
WFC_PushNotification( $webfront_id, 'Müllabfuhr! - ', 'Morgen ist der '. $notification . ' dran.', 'trickling', 0 );
}
}
//
// Webfront String Variable aktualisieren
//
SetValue( $nächster_termin, $result );
?>
Meine Struktur im Webfront:
Meine Lösung um das Script um 0:30 aufzurufen:
<?
//
// Parameter setzen
//
$mode = "Morgens"; // "Abends" = Ueberpruefung Abends "Morgens" = Ueberpruefung Morgens durch ein Event das hier zuvor angelegt wurde!)
//
// Ab hier keine Anpassungen mehr...
//
//
// eigentliches Ausfuehrungsscript
//
$id_script_muell_reminder = IPS_GetScriptIDByName( "Müll_Reminder", IPS_GetObjectIDByName( "Scripte", 0 ) );
IPS_RunScriptWaitEx( $id_script_muell_reminder, Array( "MODE" => $mode ) );
?>
Und um 18:30…
<?
//
// Parameter setzen
//
$mode = "Abends"; // "Abends" = Ueberpruefung Abends "Morgens" = Ueberpruefung Morgens durch ein Event das hier zuvor angelegt wurde!)
//
// Ab hier keine Anpassungen mehr...
//
//
// eigentliches Ausfuehrungsscript
//
$id_script_muell_reminder = IPS_GetScriptIDByName( "Müll_Reminder", IPS_GetObjectIDByName( "Scripte", 0 ) );
IPS_RunScriptWaitEx( $id_script_muell_reminder, Array( "MODE" => $mode ) );
?>
Das ganze läuft bei mir unter Windows und enthält in den obersten Zeilen einige Einstellungen, genau wie im Ursprungscript…
Ich hoffe es kann jemandem von nutzen sein, wenn auch nur als Anregung…
Ein schönes We…
Gollum