Termine von Exchange und WebDav per PHP in IPS

Danke für die Datei. Da sind sehr viele merkwürdige Format-Abweichungen und -Mischungen drin. Einige kann ich abfangen, andere aufgrund von (teils bereits vorhandenen) Folgeproblemen nicht.

  1. SUMMARY;LANGUAGE=de
    Das tritt gelegentlich auf und ist kein Problem.

  2. DTEND;TZID… und DTSTART;TZID="(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien"
    Das betrifft offenbar nur die 7 wahrscheinlich zuletzt eingetragenen Termine. Kannst Du die verwendete Zeitzone bei der Termineingabe beeinflussen? Da das ICS-Trennzeichen zwischen Parameter (z.B. Startzeit) und konkretem Inhalt „:“ ist, bringt die Angabe „UTC+01:00“ das Skript aus dem Tritt. Ich kann das zwar vorab ersetzen, aber aufgrund ihrer Länge verursacht diese Zeitzone bereits in der ICS-Datei einen Zeilenumbruch in der nachfolgenden Datumsangabe. Das bekomme ich nicht in den Griff, weil die Zeilenumbrüche als Trennung zwischen den Termindetails verwendet werden. Da sieht das Skript keinen Unterschied und schneidet das umgebrochene Datum einfach ab, wodurch es ganz verloren geht. :confused:

Beipiel:

DTEND;TZID="(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien":2014
0705T113000
DTSTAMP:20140427T120401Z
DTSTART;TZID="(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien":20
140705T100000

  1. Jedes Terminende wird vor dem Terminstart genannt (das ist der Grund für Deine Fehlermeldungen). Wer macht denn sowas!? Microsoft? :mad:
    Folgeprobleme entstehen dadurch in dem Teil des Skripts, wo die mehrtägigen Termine behandelt werden. Die Umkehrung von End- und Starttermin plus die vielen Formatabweichungen/-Mischungen ergeben eine Kombinationsvielfalt, die ich praktisch nicht mehr abfangen kann. Deshalb müsstest Du mit „unbehandelten“ Dauerterminen leben, von denen Dir dadurch nur der Starttermin angezeigt wird. Allerdings habe ich bei Dir auch keine Dauertermine gefunden. :wink:

Mit den genannten Einschränkungen sollte das hier funktionieren:

<?

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

Beschreibung:
In diesem Skript werden die relevanten Termindaten einer *.ics (Sunbird
Terminverwaltung) in eine *.txt konvertiert.

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


//Bitte anpassen
//------------------------------------------
//Ablageort für *.txt
$file_txt = IPS_GetKernelDir()."media\\Kalender\\datei_kurz.txt";
//Ablageort für *.ics ("Sunbird")
$file_sunbird = IPS_GetKernelDir()."media\\Kalender\\Datei.txt";
//Terminart
$term_art = "NAME";
//------------------------------------------


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

// Variablen

//String für kompletten Sunbird Datensatz
$Sunbird_DS_komplett = "";
//String array für Termine
$term_arr_komplett = array();
$dauer_term_arr = array();
//$term_arr_komplett[] = "000000000,00,00,,";
//timestamp,tag,monat,inhalt,art


//Daten holen
if(file_exists($file_sunbird))

//Termine in Variable einlesen
$Sunbird_DS_komplett = file_get_contents($file_sunbird);

// war die Kalenderdatei gefüllt?
if(strpos($Sunbird_DS_komplett,'VCALENDAR')){

//Zeitzone korrigieren
$Sunbird_DS_komplett = str_replace("DTSTART;TZID=\"(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien\"", "DTSTART;VALUE=DATE", $Sunbird_DS_komplett, $count);

//Den kompletten Datensatz zerlegen
$Sunbird_DS_arr_komplett = explode("BEGIN:", $Sunbird_DS_komplett);

//alle Datensätze durchlaufen
foreach($Sunbird_DS_arr_komplett as $key_1 => $value_1)
{

$term_inhalt            = "";
$term_end               = "ENDE";

$term_tag         	 	= "";
$term_monat             = "";
$term_jahr              = "";

$startdate             = "";

//Schalter inaktiv setzen
$rrule 						= 0;
$zusatz                 = 0;

    //Der erste Datensatz ist "2"
   if($key_1 > 1)
    {
        //einzelnen Datensatz in Daten zerlegen
	     $Sunbird_arr = explode("
", $value_1);
//        $Sunbird_arr = explode("
", $value_1);

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

                //Kontrolle der Parameter
                Switch($Data_arr[0])
                {
                    case "SUMMARY;LANGUAGE=de":
                    case "SUMMARY":
                      $term_inhalt     = $Data_arr[1];
                    	 $term_inhalt     = iconv('UTF-8','ISO-8859-1',$term_inhalt);
                        break;

                    //Wiederholender Termin
                    case "RRULE":

                        //Wiederholung zerlegen und in array
//                        $term_rule_arr = explode(";", $Data_arr[1]);

								$rrule = 1;
								$timestamp = time();
								$diesjahr = date("Y",$timestamp);
								$term_jahr_rr 		 = $diesjahr;
                        break;

                    //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);
							if ($rrule)
								{
								$term_jahr = $term_jahr_rr;
                       	}
							$startdate = $Data_arr[1];
		      			$start_timestamp   = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
						  break;

                    //Zeitstempel Datum und Zeit
                    case "DTSTART":
                    case "DTSTART;TZID=Europe/Berlin":
							$term_jahr      = substr($Data_arr[1], 0, 4);
                    	$term_monat     = substr($Data_arr[1], 4, 2);
                    	$term_tag       = substr($Data_arr[1], 6, 2);
							if ($rrule) {
								$term_jahr = $term_jahr_rr;
                       	}
                     break;

							case "DTSTART;VALUE=DATE;TZID=Europe/Berlin":
							 $term_jahr     = substr($Data_arr[1], 0, 4);
                      $term_monat     = substr($Data_arr[1], 4, 2);
                      $term_tag       = substr($Data_arr[1], 6, 2);
							 if ($rrule) {
								$term_jahr = $term_jahr_rr;
                       	}
                      break;

                      break;
                }
            }

            //Restliche Daten generieren
            //Time stamp
	            $term_timestamp   = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);

            //Termin array zusammenstellen
         	$term_arr[0]  = $term_timestamp;
           	$term_arr[1] = sprintf("%02s", $term_tag);
	         $term_arr[2] = sprintf("%02s", $term_monat);
           	$term_arr[3] = $term_inhalt;
           	$term_arr[4] = $term_art;
           	$term_arr[5] = $term_end;

            //Termin in einen String
            $termin           = implode(",", $term_arr);
	         $term_arr_komplett[] = $termin;
        }
	}
}

//$term_arr_komplett = array_merge($term_arr_komplett,$dauer_term_arr);
sort($term_arr_komplett); // nach Zeit sortieren
$term_neu_komplett = implode("
", $term_arr_komplett); // in String zurück

$handle=fopen($file_txt, "w");
fwrite($handle,$term_neu_komplett);
fclose($handle);

}
//---------------------- Main Ende ----------------------------

?>

Ich hoffe, ich hab keinen Copy&Paste-Fehler gemacht. :wink:

Für die Amsterdam-Termine musst Du Dir was an der Quelle einfallen lassen, sie fallen sonst überwiegend raus!

Grüße
galleto

Ein hallo Zusammen an die Experten :slight_smile:

Ich habe nur noch ein kleines Problem bei der Ausführung des letzten Skript aus dem #3 Beitrag

Und zwar kommt bei der Ausführung des Skript folgende Meldung:

Notice: Undefined variable: termin_arr in C:\IP-Symcon\scripts\38114.ips.php on line 76
Warning: array_slice() expects parameter 1 to be array, null given in C:\IP-Symcon\scripts\38114.ips.php on line 76
Warning: implode(): Invalid arguments passed in C:\IP-Symcon\scripts\38114.ips.php on line 77

Habt Ihr da vielleicht ein Tipp für mich woran es liegen könnte?

Hier mal der Code dazu …


  <?
$file_henning = IPS_GetKernelDir()."media\\henning_kurz.txt";
$Daten_henning = file_get_contents($file_henning);

$Daten_komplett = $Daten_henning;
$Daten_arr_komplett = explode("
", $Daten_komplett);
sort($Daten_arr_komplett);

//Daten durchlaufen
foreach($Daten_arr_komplett as $key_1 => $value_1) {

         //Zeitstempel extrahieren
         if (substr($value_1,9,1) == ",") $laenge = 9;
         else $laenge = 10;
        $timestamp = substr($value_1,0,$laenge);
         $now = time();

         //für alle zukünftigen Datensätze

       if(!function_exists('date2timestamp')) {
          function date2timestamp($datum1) {
        list($day, $month, $year) = explode(".", $datum1);
        $year = sprintf("%04d", $year);
        $month = sprintf("%02d", $month);
        $day = sprintf("%02d", $day);
        return(mktime(0, 0, 0, $month, $day, $year));
         }
        }
         $termindatum = date("d.m.Y",$timestamp);
         $heutedatum = date("d.m.Y",$now);

         if (date2timestamp($termindatum) >= date2timestamp($heutedatum)) {

                //Datensatz zerlegen und Daten entnehmen
                $Datensatz_arr = explode(",", $value_1);
                @$datumalt = $datumneu;
               $datum = date("d.m.Y",$timestamp);
             $inhalt = $Datensatz_arr[3];
                $art = "";
             $art = $Datensatz_arr[4];

                //Datum ggf. ersetzen und färben
                $heute   = date("d.m.Y",$now);
             $morgen = date("d.m.Y",($now + 86400));
             $wochentage = array("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Sonnabend", "Sonntag");
             $tag = date("w",$timestamp);

                if ($datum == $heute) {
                    $datumneu = "<td style=\"color:red\">heute</td>";
                    }
             elseif ($datum == $morgen) {
                    $datumneu = "<td style=\"color:red\">morgen</td>";
                    }
             elseif ($timestamp <= ($now + 604800)) {
                    if (!$tag) $datumneu = "<td>Sonntag</td>";
                    else $datumneu = "<td>".$wochentage[$tag-1]."</td>";
                    }
                else {
                $datumneu = "<td>".date("d.m.",$timestamp)."</td>";
                }

                  if ($datumneu == $datumalt) $datum = "<td></td>";
                  else $datum = $datumneu;

                //Inhalt präzisieren und färben
                $henning = "Henning";
		          if ($art==$henning) $farbe = "green";
                $inhalt = "<td style=\"color:green\">$inhalt</td>";

            //Termine zusammenführen

            $termin = "<tr>".$datum.$inhalt."</tr>";
            $termin_arr[] = $termin;
         }
}
$termin_arr_kurz = array_slice($termin_arr, 0, 12);
$term_fertig = implode("", $termin_arr_kurz);
$table = "<table border=\"0\"><colgroup width=\"100\"></colgroup>".$term_fertig."<table>";
SetValue(34210 /*[Skripte\Test+\Dummy Module\Cal]*/,$table);

?>

Irgendwie ist Dir der Inhalt verloren gegangen, die Variable scheint leer zu sein.

Du kannst mal im Skript testweise den Befehl print_r($XYZ); hinter einer Variable (XYZ = jeweiliger Name) einfügen und das Skript manuell ausführen, um zu sehen, was in der Variable steckt. Wenn Du so von oben nach unten einzeln durch die Variablen des Skripts gehst, findest Du die Stelle, wo die Inhalte verschwinden… Auf den ersten Blick finde ich den Fehler leider nicht.

EDIT: Bei mir läuft Dein Skript. Ich vermute, die Datei henning_kurz.txt ist leer.

Grüße
galleto

hmm, dem muss ich widersprechen. Die Textdatei ist prall gefüllt und sieht so aus:


943916400,00,00,2. Weihnachtsfeiertag,NAME,ENDE
943916400,00,00,Allerheiligen,NAME,ENDE
...

Gruß

EDIT: Mir fällt gerade auf das jede Zeile (henning_kurz.txt) mit „943916400,00,00,“ anfängt?! Das wird wahrscheinlich nicht korrekt sein :slight_smile: Was läuft da denn schief?

Sieht so aus, als ob bei der Erstellung dieser Datei jeweils der aktuelle Zeitstempel eingetragen wird. Das Skript reduziert danach (!) auf die zukünftigen Ereignisse, was freilich zu einem Null-Ergebnis führt.

Der Fehler liegt also in einem anderen Skript. Dort, wo die txt-Datei erzeugt wird.

Grüße
galleto

Also die Skripte sehen so aus:


 <?

$array = array("Henning");

//und los
foreach($array as $key => $value) {

    $Name = $value;

    $url = "https://****.de/owa/calendar/a44279601c81e196c81dc@He**g-*.de/1f547d8726fd4364bfd4769915601775477804/calendar.ics";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_URL, $url);

    $file_txt = IPS_GetKernelDir()."media\\$Name.txt";
    $fp = fopen($file_txt, 'wb');

    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);

    curl_exec ($ch);
    curl_close ($ch);
    fclose($fp);
    }

?>

Inhalt der Langen txt Version


BEGIN:VEVENT
SUMMARY:Reformationstag
DTSTART;TZID=W. Europe Standard Time:20141031T000000
DTEND;TZID=W. Europe Standard Time:20141101T000000
UID:247f60de-d9ef-4e29-b885-5ceb0385695d
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20141218T152252Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION:Deutschland
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-BUSYSTATUS:FREE
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-DISALLOW-COUNTER:FALSE
END:VEVENT


Und danach wird das zweite Skript ausgeführt, wo auch der Fehler liegt?!


 <?

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

Beschreibung:
In diesem Skript werden die relevanten Termindaten einer *.ics (Sunbird
Terminverwaltung) in eine *.txt konvertiert.

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


//Bitte anpassen
//------------------------------------------
//Ablageort für *.txt
$file_txt = IPS_GetKernelDir()."media\\henning_kurz.txt";
//Ablageort für *.ics ("Sunbird")
$file_sunbird = IPS_GetKernelDir()."media\\henning.txt";
//Terminart
$term_art = "NAME";
//------------------------------------------


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

// Variablen

//String für kompletten Sunbird Datensatz
$Sunbird_DS_komplett = "";
//String array für Termine
$term_arr_komplett = array();
$dauer_term_arr = array();
//$term_arr_komplett[] = "000000000,00,00,,";
//timestamp,tag,monat,inhalt,art


//Daten holen
if(file_exists($file_sunbird))

//Termine in Variable einlesen
$Sunbird_DS_komplett = file_get_contents($file_sunbird);

// war die Kalenderdatei gefüllt?
if(strpos($Sunbird_DS_komplett,'VCALENDAR')){

//Zeitzone korrigieren
$Sunbird_DS_komplett = str_replace("DTSTART;TZID=\"(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien\"", "DTSTART;VALUE=DATE", $Sunbird_DS_komplett, $count);

//Den kompletten Datensatz zerlegen
$Sunbird_DS_arr_komplett = explode("BEGIN:", $Sunbird_DS_komplett);

//alle Datensätze durchlaufen
foreach($Sunbird_DS_arr_komplett as $key_1 => $value_1)
{

$term_inhalt            = "";
$term_end               = "ENDE";

$term_tag                  = "";
$term_monat             = "";
$term_jahr              = "";

$startdate             = "";

//Schalter inaktiv setzen
$rrule                         = 0;
$zusatz                 = 0;

    //Der erste Datensatz ist "2"
   if($key_1 > 1)
    {
        //einzelnen Datensatz in Daten zerlegen
         $Sunbird_arr = explode("
", $value_1);
//        $Sunbird_arr = explode("
", $value_1);

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

                //Kontrolle der Parameter
                Switch($Data_arr[0])
                {
                    case "SUMMARY;LANGUAGE=de":
                    case "SUMMARY":
                      $term_inhalt     = $Data_arr[1];
                         $term_inhalt     = iconv('UTF-8','ISO-8859-1',$term_inhalt);
                        break;

                    //Wiederholender Termin
                    case "RRULE":

                        //Wiederholung zerlegen und in array
                        $term_rule_arr = explode(";", $Data_arr[1]);

                                $rrule = 1;
                                $timestamp = time();
                                $diesjahr = date("Y",$timestamp);
                                $term_jahr_rr          = $diesjahr;
                        break;

                    //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);
                            if ($rrule)
                                {
                                $term_jahr = $term_jahr_rr;
                           }
                            $startdate = $Data_arr[1];
                          $start_timestamp   = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
                          break;

                    //Zeitstempel Datum und Zeit
                    case "DTSTART":
                    case "DTSTART;TZID=Europe/Berlin":
                            $term_jahr      = substr($Data_arr[1], 0, 4);
                        $term_monat     = substr($Data_arr[1], 4, 2);
                        $term_tag       = substr($Data_arr[1], 6, 2);
                            if ($rrule) {
                                $term_jahr = $term_jahr_rr;
                           }
                     break;

                            case "DTSTART;VALUE=DATE;TZID=Europe/Berlin":
                             $term_jahr     = substr($Data_arr[1], 0, 4);
                      $term_monat     = substr($Data_arr[1], 4, 2);
                      $term_tag       = substr($Data_arr[1], 6, 2);
                             if ($rrule) {
                                $term_jahr = $term_jahr_rr;
                                
                           }
                      break;

                      break;
                }
            }

            //Restliche Daten generieren
            //Time stamp
                $term_timestamp   = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);

            //Termin array zusammenstellen
             $term_arr[0]  = $term_timestamp;
               $term_arr[1] = sprintf("%02s", $term_tag);
             $term_arr[2] = sprintf("%02s", $term_monat);
               $term_arr[3] = $term_inhalt;
               $term_arr[4] = $term_art;
               $term_arr[5] = $term_end;

            //Termin in einen String
            $termin           = implode(",", $term_arr);
             $term_arr_komplett[] = $termin;
        }
    }
}

//$term_arr_komplett = array_merge($term_arr_komplett,$dauer_term_arr);
sort($term_arr_komplett); // nach Zeit sortieren
$term_neu_komplett = implode("
", $term_arr_komplett); // in String zurück

$handle=fopen($file_txt, "w");
fwrite($handle,$term_neu_komplett);
fclose($handle);

}
//---------------------- Main Ende ----------------------------

?>

Bin leider nicht der php Crack … :confused:

Ich glaub, ich hab es: Bei Dir gibt es eine Datumsbezeichnung namens „DTSTART;TZID=W. Europe Standard Time“, die das Skript bisher nicht kennt und daher übersieht. Die muss nur ergänzt werden (vergleiche Beitrag #4):

Im zuletzt von Dir zitierten Skript gibt es einen Abschnitt „//Zeitstempel Datum“ und einen „//Zeitstempel Datum und Zeit“. In einen der beiden (vermutlich den letzteren) musst Du direkt nach der „Überschrift“ folgende Zeile einfügen:

case "DTSTART;TZID=W. Europe Standard Time":

Anmerkung: Der Reformationstag 2014 wird aber so oder so nicht im Ergebnis auftauchen, da er in der Vergangenheit liegt. :wink:

Grüße
galleto

Perfekt! Das wars!!! Danke für deine Mühe/Geduld!!

EDIT: Es war im ersten Abschnitt: "//Zeitstempel Datum …

Weiter so :wink:

Beste Grüße

Eine Frage hätte ich da noch, was müsste entsprechend angepasst werden wenn die Ausgabe der Langen Txt (ics) Datei wie folgt aussieht:


BEGIN:VEVENT
DTSTART:20141224T230000Z
DTEND:20141225T230000Z
SUMMARY:Weihnachtstag
LOCATION:Deutschland
END:VEVENT
BEGIN:VEVENT
DTSTART:20141225T230000Z
DTEND:20141226T230000Z
SUMMARY:2. Weihnachtsfeiertag
LOCATION:Deutschland
END:VEVENT
BEGIN:VEVENT
DTSTART:20141230T230000Z
DTEND:20141231T230000Z
SUMMARY:Sylvester
LOCATION:Deutschland
END:VEVENT

Es hätte diverse Vorteile für mich diese(s) Datei(Format) auszuwerten, dann kann ich nämlich die Internetfreigabe meines Kalenders wieder aufheben, ist halt einfach ein besseres Gefühl :slight_smile: In Zeiten der NSA …

Siehe Beitrag #4!

Grüße
galleto

Ok, das klappt jetzt auch, leider fällt aber Heiligabend auf den 23.12. bzw. alle Ganztätigen Termine sind ein Tag zu früh. Kann ich das noch irgendwie abfangen?

In der ICS Datei sieht das ganze so aus:


BEGIN:VEVENT
DTSTART:20141223T230000Z
DTEND:20141224T230000Z
SUMMARY:Heiliger Abend
LOCATION:Deutschland
END:VEVENT

Gruß

Die Ursache liegt in den Ausgangsdaten, da fangen die Termine fälschlicherweise um 23 Uhr des Vortages an:

Ich schaue heute Abend mal, ob ich dafür eine Korrekturfunktion in das Skript einbauen kann.

Grüße
galleto

Hmm, evtl. ein Zeitzonenproblem ???

Gruß Proxima

Denke ich auch.

Folgenden Code bitte direkt nach dem bzw. den „case“ einfügen, in dem/denen (auch) „DTSTART:“ definiert ist:

$error = substr($Data_arr[1], 9, 7);

if ($error == "230000Z")
	{
	$term_jahr      = substr($Data_arr[1], 0, 4);
	$term_monat     = substr($Data_arr[1], 4, 2);
	$term_tag       = substr($Data_arr[1], 6, 2);
	if ($rrule) {
			$term_jahr = $term_jahr_rr;
           	        }
	$date = date("Ymd", mktime(0, 0, 0, $term_monat, $term_tag + 1, $term_jahr));
	$term_jahr      = substr($date, 0, 4);
	$term_monat  = substr($date, 4, 2);
	$term_tag       = substr($date, 6, 2);
	}
else {

Anschließend vor dem nächsten „break;“ ein „}“ einfügen, sodass die bisherigen Befehle nach dem „else“ korrekt geklammert sind.

Sollte funktionieren, sonst einfach nochmal fragen.

Grüße
galleto

Danke, das funktioniert auch! In der Zwischenzeit habe ich auch ein wenig rum getüfftelt. Und zwar habe ich in der Case Anweisung mich auf das „DTEND“ bezogen. Sollte auch kein Problem sein, oder hat da jemand Einwände ;)? Jedenfalls stimmen die Termine/Tage bei mir.

Hier noch mal alle drei Skripte welche bei mir mit Exchange 2010 (SBS2011) funktionieren.


<?

    // Termine der nächsten x Monate
    $month = 3;

    // libraries
    require_once('php-ews/ExchangeWebServices.php');
    require_once('php-ews/NTLMSoapClient.php');
    require_once('php-ews/NTLMSoapClient/Exchange.php');
    require_once('php-ews/EWS_Exception.php');
    require_once('php-ews/EWSType.php');
    require_once('php-ews/include_user.php');

    // autoload
    spl_autoload_register( function ($class) { $class = explode('_', $class); if ($class[0] == 'EWSType') require_once 'php-ews/' .$class[0] . '/' . $class[1] . '.php'; } );

    // Define EWS
    $ews = new ExchangeWebServices($host, $username, $password, $version);

    // Set init class
    $request = new EWSType_FindItemType();
    // Use this to search only the items in the parent directory in question or use ::SOFT_DELETED
    // to identify "soft deleted" items, i.e. not visible and not in the trash can.
    $request->Traversal = EWSType_ItemQueryTraversalType::SHALLOW;
    // This identifies the set of properties to return in an item or folder response
    $request->ItemShape = new EWSType_ItemResponseShapeType();
    $request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::DEFAULT_PROPERTIES;

    // Define the timeframe to load calendar items
    $request->CalendarView = new EWSType_CalendarViewType();
    $request->CalendarView->StartDate =  date("c");// current date
    $request->CalendarView->EndDate = date("c", strtotime("+".$month." months"));// "countmonths" month(s) later

    // Only look in the "calendars folder"
    $request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType();
    $request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType();
    $request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::CALENDAR;

    // Send request
    $response = $ews->FindItem($request);

    // ics header
    $icsdetails = "BEGIN:VCALENDAR".chr(10);
    $icsdetails = $icsdetails."VERSION:2.0".chr(10);
    $icsdetails = $icsdetails."PRODID:IPS".chr(10);

    // Loop through each item if event(s) were found in the timeframe specified
    if ($response->ResponseMessages->FindItemResponseMessage->RootFolder->TotalItemsInView > 0){
        $events = $response->ResponseMessages->FindItemResponseMessage->RootFolder->Items->CalendarItem;
        foreach ($events as $event){
            $start = $event->Start;
            $end = $event->End;
            $subject = $event->Subject;
            $location = $event->Location;
            // ics detail
            $icsdetails = $icsdetails."BEGIN:VEVENT".chr(10);


            // clean date
            $cleandate = array("-", ":");
            $icsdetails = $icsdetails."DTSTART:".str_replace($cleandate, "", $start).chr(10);
            $icsdetails = $icsdetails."DTEND:".str_replace($cleandate, "", $end).chr(10);
            $icsdetails = $icsdetails."SUMMARY:".$subject.chr(10);
            $icsdetails = $icsdetails."LOCATION:".$location.chr(10);
            $icsdetails = $icsdetails."END:VEVENT".chr(10);


        }
    }
    else {
        // No items returned
    }

    // ics footer
    $icsdetails = $icsdetails."END:VCALENDAR".chr(10);

//print_r($icsdetails);

    // write ics file
    $fileout="../media/$username.ics";
    $fileptr = fopen($fileout, "w");
    fwrite($fileptr, $icsdetails);
    fclose($fileptr);

//    echo "<p><a href='ics/$username.ics'>$username.ics</a></p>";

?>




 <?
$file_txt = IPS_GetKernelDir()."media\\henning_kurz.txt";
$file_sunbird = IPS_GetKernelDir()."media\\henning.ics";
//Terminart
$term_art = "Henning";
//String für kompletten Sunbird Datensatz
$Sunbird_DS_komplett = "";
//String array für Termine
$term_arr_komplett = array();
$dauer_term_arr = array();
//$term_arr_komplett[] = "000000000,00,00,,";
//timestamp,tag,monat,inhalt,art


//Daten holen
if(file_exists($file_sunbird))

//Termine in Variable einlesen
$Sunbird_DS_komplett = file_get_contents($file_sunbird);

// war die Kalenderdatei gefüllt?
if(strpos($Sunbird_DS_komplett,'VCALENDAR')){

//Den kompletten Datensatz zerlegen
$Sunbird_DS_arr_komplett = explode("BEGIN:", $Sunbird_DS_komplett);

//alle Datensätze durchlaufen
foreach($Sunbird_DS_arr_komplett as $key_1 => $value_1)
{

$term_inhalt            = "";
$term_end               = "ENDE";

$term_tag                  = "";
$term_monat             = "";
$term_jahr              = "";

$startdate             = "";

//Schalter inaktiv setzen
$rrule                         = 0;
$zusatz                 = 0;

    //Der erste Datensatz ist "2"
   if($key_1 > 1)
    {

//////////////////////////////
//einzelnen Datensatz in Daten zerlegen
//$Sunbird_arr = explode("
", $value_1);     //Aktivieren bei TXT Datei
$Sunbird_arr = explode("
", $value_1);         //Aktivieren bei ICS Datei
///////////////////////////////

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

                //Kontrolle der Parameter
                Switch($Data_arr[0])
                {
                    case "SUMMARY;LANGUAGE=de":
                    case "SUMMARY":
                      $term_inhalt     = $Data_arr[1];
                         $term_inhalt     = iconv('UTF-8','ISO-8859-1',$term_inhalt);
                        break;

                    //Wiederholender Termin
                    case "RRULE":

                        //Wiederholung zerlegen und in array
                        $term_rule_arr = explode(";", $Data_arr[1]);

                                $rrule = 1;
                                $timestamp = time();
                                $diesjahr = date("Y",$timestamp);
                                $term_jahr_rr          = $diesjahr;
                        break;
                    //Zeitstempel Datum
                      case "DTEND":
 			            			$term_jahr     = substr($Data_arr[1], 0, 4);
                     			$term_monat     = substr($Data_arr[1], 4, 2);
                     			$term_tag       = substr($Data_arr[1], 6, 2);
                        if ($rrule) {
                                			$term_jahr = $term_jahr_rr;
                           			}
                        	$startdate = $Data_arr[1];
                        	$start_timestamp   = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
                        break;
                }
            }

            //Restliche Daten generieren
            //Time stamp
                $term_timestamp   = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);

            //Termin array zusammenstellen
             $term_arr[0]  = $term_timestamp;
               $term_arr[1] = sprintf("%02s", $term_tag);
             $term_arr[2] = sprintf("%02s", $term_monat);
               $term_arr[3] = $term_inhalt;
               $term_arr[4] = $term_art;
               $term_arr[5] = $term_end;

            //Termin in einen String
            $termin           = implode(",", $term_arr);
             $term_arr_komplett[] = $termin;
        }
    }
}

//$term_arr_komplett = array_merge($term_arr_komplett,$dauer_term_arr);
sort($term_arr_komplett); // nach Zeit sortieren
$term_neu_komplett = implode("
", $term_arr_komplett); // in String zurück

$handle=fopen($file_txt, "w");
fwrite($handle,$term_neu_komplett);
fclose($handle);

}

?>


<?
$file_henning = IPS_GetKernelDir()."media\\henning_kurz.txt";
$Daten_henning = file_get_contents($file_henning);
$Daten_komplett = $Daten_henning;
$Daten_arr_komplett = explode("
", $Daten_komplett);

sort($Daten_arr_komplett);

//Daten durchlaufen
foreach($Daten_arr_komplett as $key_1 => $value_1) {

         //Zeitstempel extrahieren
         if (substr($value_1,9,1) == ",") $laenge = 9;
         else $laenge = 10;
         $timestamp = substr($value_1,0,$laenge);
         $now = time();

         //für alle zukünftigen Datensätze

       if(!function_exists('date2timestamp')) {
        		function date2timestamp($datum1) {
        		list($day, $month, $year) = explode(".", $datum1);
        		$year = sprintf("%04d", $year);
        		$month = sprintf("%02d", $month);
        		$day = sprintf("%02d", $day);
        		return(mktime(0, 0, 0, $month, $day, $year));
         }
        }
         $termindatum = date("d.m.Y",$timestamp);
         $heutedatum = date("d.m.Y",$now);

         if (date2timestamp($termindatum) >= date2timestamp($heutedatum)) {

                //Datensatz zerlegen und Daten entnehmen
                $Datensatz_arr = explode(",", $value_1);
	             @$datumalt = $datumneu;
   	          $datum = date("d.m.Y",$timestamp);
      	       $inhalt = $Datensatz_arr[3];
         	    $art = "";
            	 $art = $Datensatz_arr[4];

                //Datum ggf. ersetzen und färben
	             $heute  = date("d.m.Y",$now);
   	          $morgen = date("d.m.Y",($now + 86400));
      	       $wochentage = array("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag");
         	    $tag = date("w",$timestamp);

                if ($datum == $heute) {
                    $datumneu = "<td style=\"color:red\">heute</td>";
                    }
	             elseif ($datum == $morgen) {
                    $datumneu = "<td style=\"color:red\">morgen</td>";
                    }
   	          elseif ($timestamp <= ($now + 604800)) {
                    if (!$tag) $datumneu = "<td>Sonntag</td>";
                    else $datumneu = "<td>".$wochentage[$tag-1]."</td>";
                    }
                else {
                $datumneu = "<td>".date("d.m.",$timestamp)."</td>";
                }

                  if ($datumneu == $datumalt) $datum = "<td></td>";
                  else $datum = $datumneu;

                //Inhalt präzisieren und färben

					 $henning = "Henning";
		          if ($art==$henning) $farbe = "orange";
                $inhalt = "<td style=\"color:$farbe\">$inhalt</td>";
                
              //Termine zusammenführen
            $termin = "<tr>".$datum.$inhalt."</tr>";
            $termin_arr[] = $termin;
         }
}
$termin_arr_kurz = array_slice($termin_arr, 0, 8);   //Anzahl der Termine festlegen - 8 Termine)
$term_fertig = implode("", $termin_arr_kurz);
$table = "<table border=\"0\"><colgroup width=\"100\"></colgroup>".$term_fertig."<table>";
SetValue(12345 ,$table);
?>

Bei mehrtägigen Terminen bekommst Du jetzt halt den vorletzten Tag als Starttermin angezeigt, ansonsten stimmt es. :wink:

Grüße
galleto

Moin,

vielleicht kann mir ja mal jemand weiter helfen.

Habe das Script grundsätzlich zum laufen bekommen, nur bei den widerkehrenden Terminen funktioniert das nicht.

Script 1: Die ICS Dateien kommen vom Synology CalDAV - geht

Script 2: Werden in _kurz.txt umgewandelt - geht soweit auch, ohne Fehlermeldung

Script 3: Dann werden alle _kurz.txt Dateien durchsucht um die Terminen zusammen gebracht, sortiert usw - geht im Grunde auch

Jetzt habe ich aber einen Termin angelegt (Beginn ab 16.02.2016, Müllabfuhr, Wiederholung: alle 2 Wochen), ist auch aus der ICS so zu lesen, leider gibt mir das 2.te Script als Datum immer wieder den 16.02.2016, es berechnet nicht den wiederholenden Termin, der nächste wäre ja der 01.03.2016

Hat da jemand eine Idee zu?

Danke und Gruß
Björn

Wiederholungen müssen aufgelöst und im Skript als Einzeltermin ausgegeben werden. Bastelarbeit. :smiley: Ich schau mir das bei Gelegenheit mal an.

Grüße
galleto

Okay, das dürfte machbar sein. Folgende Idee:

Wenn diese Wiederholungsregel auftaucht…

RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=TU

…dann lese ich den Terminstart (DTSTART) aus, leite daraus die Woche ab (un-/gerade) und setze Dir einen Termin für den genannten Wochentag in der nächsten un-/geraden Woche.

Ich brauche dazu das Format Deiner „DTSTART“-Zeile oder noch besser den kompletten Terminblock (VEVENT). Außer dem Terminnamen „Müllabfuhr“ dürfte da ja nix privates drin sein. :wink:

Grüße
galleto

Moin,

danke für die Unterstützung.
Habe mal den Inhalt der .ics Datei für den Schwarzen Sack beigefügt:


BEGIN:VCALENDAR
PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
VERSION:2.0
BEGIN:VEVENT
CREATED:20160220T163141Z
LAST-MODIFIED:20160220T165842Z
DTSTAMP:20160220T165842Z
UID:7f5551fa-e251-4aa5-82bb-0150a56df299
SUMMARY:Schwarzer Sack
RRULE:FREQ=WEEKLY;INTERVAL=2
X-MOZ-LASTACK:20160220T163236Z
DTSTART;VALUE=DATE:20160216
DTEND;VALUE=DATE:20160217
TRANSP:TRANSPARENT
X-MOZ-GENERATION:2
BEGIN:VALARM
ACTION:DISPLAY
TRIGGER;VALUE=DURATION:-P1D
DESCRIPTION:Mozilla Standardbeschreibung
END:VALARM
END:VEVENT
END:VCALENDAR

Hoffe das klappt so.

Danke und Gruß
Björn