Gelber Sack / Blaue Tonne aus iCal (ics) auslesen

Hallo,

nun funktioniert alles, anbei das Schript:

<?
$filename       =  IPS_GetKernelDir()."Abfuhrtermine.ics"; //Ort der iCalender-Datei liegt
//Aufruf der Funktion
$iCal_String   =  iCal_to_String($filename);
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
$restmuell                                    =  "";    //gewandelter iCalender Datensatz
$biomuell                                    =  "";    //gewandelter iCalender Datensatz
$wertstoff                                    =  "";    //gewandelter iCalender Datensatz
$papier                                        =  "";    //gewandelter iCalender Datensatz
//$baum                                            =  "";    //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);
		//Echo($iCal_DS_komplett);
        //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":
                                      $term_inhalt     = $Data_arr[1];
									//echo($term_inhalt); // zum Überprüfen ob etwas in der $term_inhalt steht
                                }
                        }
                         Switch($term_inhalt)
                             {
                               case "Restabfalltonne (60-240l)(14tgl.)": // Suchbegriff
                                $restmuell[] = $term_tag.".".$term_monat.".".$term_jahr;
                             break;
                          case "Biotonne(14tgl.)":
                                    $biomuell[] = $term_tag.".".$term_monat.".".$term_jahr;
                               break;
                          case "Gelber Sack(14tgl.)":
                                    $wertstoff[] = $term_tag.".".$term_monat.".".$term_jahr;
                               break;
                          case "Papiertonne(4wö.)":
                                     $papier[] = $term_tag.".".$term_monat.".".$term_jahr;
                             //break;
                          //case "Weihnachtsbaeume":
                                     //$baum[] = $term_tag.".".$term_monat.".".$term_jahr;
                            }
                    }
            }
        }
    }
else
    {
        //Wenn die Datei nicht existiert dann wird ERROR_FILENAME ausgegeben
        $iCal_String             = "ERROR_FILENAME";
    }




//--------------------------------Variablen Schalten---------------------------------------------------------

$today = date("d.m.Y");
//echo($today);                         
$tomorrow = date("d.m.Y", strtotime("+1 days"));
//echo($tomorrow);
	//schwarze Tonne
	if (array_search($today, $restmuell, true ) ) 
	{
   	SetValueInteger(29196 /*[Müll\Restabfalltonne]*/,1);
	}
	else
	{
	if (array_search($tomorrow, $restmuell, true ) ) 
	{
   		SetValue(29196 /*[Müll\Restabfalltonne]*/,2);
		}	
		else
		{
		SetValue(29196 /*[Müll\Restabfalltonne]*/,0);
		}
	}	

	//bio Tonne
	if (array_search($today, $biomuell, true ) ) 
	{
   	SetValueInteger(32858 /*[Müll\Biotonne]*/,1);
	}
	else 
	{
	if (array_search($tomorrow, $biomuell, true ) ) 
	{
   		SetValueInteger(32858 /*[Müll\Biotonne]*/,2);
		}
		else 
		{
		SetValueInteger(32858 /*[Müll\Biotonne]*/,0);
		}	
	}
	//Gelber Sack
	if (array_search($today, $wertstoff, true ) ) 
	{
   	SetValueInteger(35438 /*[Müll\Gelber Sack]*/,1);
	}
	else 
	{
	if (array_search($tomorrow, $wertstoff, true ) ) {
   		SetValueInteger(35438 /*[Müll\Gelber Sack]*/,2);
		}
		else
		{
		SetValueInteger(35438 /*[Müll\Gelber Sack]*/,0);
		}	
	}
	//Papier Tonne
	if (array_search($today, $papier, true ) ) {
   	SetValueInteger(36560 /*[Müll\Papiertonne]*/,1);
	}
	else 
	{
	if (array_search($tomorrow, $papier, true ) ) 
	{
   		SetValueInteger(36560 /*[Müll\Papiertonne]*/,2);
		}
		else {
		SetValueInteger(36560 /*[Müll\Papiertonne]*/,0);
		}
	}


//--------------------------------Variablen Schalten Ende---------------------------------------------------------	

$ergebnis = array($restmuell,$biomuell,$wertstoff,$papier);

//print_r($ergebnis);


return $ergebnis;




//------------------------- Main ENDE --------------------------
}
?>

Die Variablen werden einmal am Tag ( 00:01) gefüllt. Ablageort der ICS-Datei ist direkt im Symconordner

Vielen Dank für die Hilfe hier im Forum.

LG Izack

Hallo Leute,

ich stehe auf dem Schlauch :frowning: Leider bekomme ich beim Ausführen des Skriptes diesen Fehler:

Fatal error: Uncaught Error: operator not supported for strings in /var/lib/symcon/scripts/47470.ips.php:91
Stack trace:
#0 /var/lib/symcon/scripts/47470.ips.php(4): iCal_to_String(’/var/lib/symcon…’)
#1 {main}
thrown in /var/lib/symcon/scripts/47470.ips.php on line 91

Ich denke es tritt, nach dem Update auf IPS5.0 auf. Ich verstehe leider nicht wo das Problem ist.
Währe toll wenn mir jemand helfen könnte.

LG Izack

Hallo zusammen,

hier scheint der Fehler zu liegen bei :

case „Restabfalltonne (60-240l)(14tgl.)“: // Suchbegriff
$restmuell = $term_tag.".".$term_monat.".".$term_jahr;
break;

Was ist daran falsch?

Lg Izack

Hallo,

ich vermute, es liegt daran, dass Du zuerst $restmuell als String deklarierst (=""), später aber als Array ( ) benutzt. Versuchs doch mal mit $restmuell = array().

Grüße, Gerhard

Hallo Gehard,

jo das war es vielen Dank für deine Hilfe.

Anbei das geänderte Skript um die Termine in Stringvariablen abzulegen.

<?
$filename       =  IPS_GetKernelDir()."Abfuhrtermine.ics"; //Ort der iCalender-Datei liegt
//Aufruf der Funktion
$iCal_String   =  iCal_to_String($filename);
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                             =  array();    //Komplette iCalender Datensatz
$restmuell                                    =  array();    //gewandelter iCalender Datensatz
$biomuell                                    =  array();    //gewandelter iCalender Datensatz
$wertstoff                                    =  array();    //gewandelter iCalender Datensatz
$papier                                        =  array();    //gewandelter iCalender Datensatz
//$baum                                            =  "";    //gewandelter iCalender Datensatz
$term_jahr                                  =  array();    //Termin Jahr
$term_monat                                 =  array();    //Termin Monat
$term_tag                                   =  array();    //Termin Tag
$term_inhalt                                =  array();    //Termin Text

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

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

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

        //Termine in Variable einlesen
        $iCal_DS_komplett                    = file_get_contents($filename);
		//Echo($iCal_DS_komplett);
        //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":
                                      $term_inhalt     = $Data_arr[1];
									//echo($term_inhalt); // zum Überprüfen ob etwas in der $term_inhalt steht
                                }
                        }
                         Switch($term_inhalt)
                             {
                               case "Restabfalltonne (60-240l)(14tgl.)": // Suchbegriff
                                $restmuell[] = $term_tag.".".$term_monat.".".$term_jahr;
                             break;
                          case "Biotonne(14tgl.)":
                                    $biomuell[] = $term_tag.".".$term_monat.".".$term_jahr;
                               break;
                          case "Gelber Sack(14tgl.)":
                                    $wertstoff[] = $term_tag.".".$term_monat.".".$term_jahr;
                               break;
                          case "Papiertonne(4wö.)":
                                     $papier[] = $term_tag.".".$term_monat.".".$term_jahr;
                         
                            }
                    }
            }
        }
    }
else
    {
        //Wenn die Datei nicht existiert dann wird ERROR_FILENAME ausgegeben
        $iCal_String             = "ERROR_FILENAME";
    }





//--------------------------------Variablen Füllen---------------------------------------------------------

$restmuell_String = implode("|", $restmuell);
//echo $restmuell_String;
$Muellsorte='1';
MUELL_TerminEintragungMuellsorte(54143 /*[Müll\Muellabfuhr]*/, $Muellsorte, $restmuell_String);

$papier_String = implode("|", $papier);
//echo $papier_String; 
$Muellsorte='2';
MUELL_TerminEintragungMuellsorte(54143 /*[Müll\Muellabfuhr]*/, $Muellsorte, $papier_String);

$bio_String = implode("|", $biomuell);
//echo $papier_String; 
$Muellsorte='3';
MUELL_TerminEintragungMuellsorte(54143 /*[Müll\Muellabfuhr]*/, $Muellsorte, $bio_String);


$gelber_String = implode("|", $wertstoff);
//echo $papier_String; 
$Muellsorte='4';
MUELL_TerminEintragungMuellsorte(54143 /*[Müll\Muellabfuhr]*/, $Muellsorte, $gelber_String);

	
	

//--------------------------------Variablen Schalten Ende---------------------------------------------------------	

$ergebnis = array($restmuell,$biomuell,$wertstoff,$papier);

//print_r($ergebnis);


return $ergebnis;




//------------------------- Main ENDE --------------------------
}
?>

LG Izack

Hallo Izack,

gerne würde ich dein Skript probieren.

Habe meinen Kalender eingetragen in Zeile 2

$filename = IPS_GetKernelDir().„C:\ips\Abfuhrtermine.ics“; //Ort der iCalender-Datei liegt

Was müsste noch gemacht werden? Müssen per Hand Variablen erstellt werden?

Hallo Leute,

ich will mal versuchen eine ics mit dem Script auszulesen. Beim Ausführen passiert aber nichts. Keine Daten & keine Fehler.
Jetzt habe ich nach und nach mit print_r mir die Daten anzeigen lassen und komme nicht weiter.
Mit

//einzelnen Datensatz in Daten zerlegen

            $iCal_arr = explode(" ", $value);

            print_r(explode(" ", $value));

kommt

Array
(
    [0] => VEVENT

CLASS:PUBLIC

CREATED:20210205T100104Z

DTSTAMP:20210205T100104Z
usw.....


If wird aber komplett ignoriert?

//Nur Datensätze vom Typ "VEVENT" durchlaufen
			if ($iCal_arr[0] == "VEVENT")
			{

Warum? Index [0] ist doch „VEVENT“

kann mir jemand Helfen?

Gruß

Nein, Auch der Rest der Ausgabe zählt noch zum Index 0.

Aber vielleicht wäre das iCal Modul aus dem Store etwas für dich.

Burkhard