Termine von Exchange und WebDav per PHP in IPS

Hier das angepasste Skript (sorry wegen der unsauberen Formatierung):

<?

/*=============================================
Skriptvorlage:
export_sunbird - Martin Heinzel - 18.03.2010
Version: 2.1
Beschreibung:
In diesem Skript werden die relevanten Termindaten einer *.ics (Sunbird
Terminverwaltung) in eine *.txt konvertiert.

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


//Bitte anpassen
//------------------------------------------
//Ablageort für kurze *.txt
$file_txt = IPS_GetKernelDir()."media\\Kalender\	est_kurz.txt";
//Ablageort für lange *.txt ("ICS")
$file_sunbird = IPS_GetKernelDir()."media\\Kalender\	est.txt";
//Terminart
$term_art = "Test";
//------------------------------------------


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

// Variablen

//String für kompletten Sunbird Datensatz
$Sunbird_DS_komplett = "";
//String array für Termine
$term_arr_komplett = array();
$dauer_term_arr = array();

//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              = "";

$startdatum             = "";

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

    //Der erste Datensatz ist "2"
   if($key_1 > 1)
    {
        //einzelnen Datensatz in Daten zerlegen

         //***Achtung! Alternativer Zeilenumbruch!***
         $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":
                     $term_inhalt     = $Data_arr[1];
                     $term_inhalt     = iconv('UTF-8','ISO-8859-1',$term_inhalt);
                     break;

                    //Wiederholender Termin
                    case "RRULE":
				        $rrule = 1;
                    $timestamp = time();
                    $diesjahr = date("Y",$timestamp);
                    $term_jahr_rr = $diesjahr;

								//14taegig?
								$freq = $Data_arr[1];
                        $freq = substr($freq, 0, 22);
                        if($freq == "FREQ=WEEKLY;INTERVAL=2")
                        {
									$zweiwochen = 1;
								}

                    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);

                     $start_timestamp   = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
//                   $startdate = $Data_arr[1];

                     if ($rrule) {
								if($term_jahr_rr > $term_jahr) {
                        $term_jahr = $term_jahr_rr;
								}
                     }

                     if ($zweiwochen) {
								if($timestamp > $start_timestamp) {
								$wochen = ($timestamp - $start_timestamp)/1209600;
								$wochen = ceil($wochen);
                        $term_timestamp = $start_timestamp + ($wochen * 1209600);
								$term_jahr = date("Y",$term_timestamp);
								$term_monat = date("m",$term_timestamp);
								$term_tag = date("d",$term_timestamp);
                       	}
                     }
                     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) {
								if($term_jahr_rr > $term_jahr) {
                        $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) {
								if($term_jahr_rr > $term_jahr) {
                        $term_jahr = $term_jahr_rr;
								}
                     }
                     break;

                    case "DTEND;VALUE=DATE":
                      $end_jahr     = substr($Data_arr[1], 0, 4);
                      if ($end_jahr >= date("Y")) {
                         $end_monat     = substr($Data_arr[1], 4, 2);
                         $end_tag       = substr($Data_arr[1], 6, 2);
                         $end_timestamp   = mktime(0, 0, 0, (int)$end_monat, (int)$end_tag, (int)$end_jahr);

                         if ($start_timestamp !== $end_timestamp - (24 * 60 *60))
                            {
                            $dauer = round(($end_timestamp - $start_timestamp) / 60 / 60 / 24) - 1;

                           for ($i = 1; $i <= $dauer; $i++) {
                              $start_timestamp = $start_timestamp + (24 * 60 *60);
                              if (!$zusatz)
                                  {
                                  $zusatz_term_tag = $term_tag + 1;
                                  $zusatz = 1;
                                  }
                              else $zusatz_term_tag = $zusatz_term_tag + 1;

                                   $zusatz_term_arr[0] = $start_timestamp;
                                   $zusatz_term_arr[1] = sprintf("%02s", $zusatz_term_tag);
                                   $zusatz_term_arr[2] = sprintf("%02s", $term_monat);
                                   $zusatz_term_arr[3] = $term_inhalt;
                                   $zusatz_term_arr[4] = $term_art;
                                   $zusatz_term_arr[5] = $term_end;
                                   $zusatz_termin      = implode(",", $zusatz_term_arr);
                                   $dauer_term_arr[]   = $zusatz_termin;
                               }
                          }
                      }
                      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

//print_r($term_neu_komplett);

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

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

?>

Bitte ausprobieren. Das sollte sogar Jahreswechsel überstehen. :smiley: Nach demselben Muster könnte man jetzt auch drei-, vier- und x-wöchige Wiederholungen umsetzen.

Ich habe zusätzlich eine Kleinigkeit an den Wiederholungsterminen geändert (wenn sie erst in der Zukunft starten, dann wird der Starttermin genommen und nix berechnet), das dürfte aber hoffentlich keinen Ärger machen.

Grüße
galleto

Moin,

erst mal Danke für die Unterstützung.

Habe das Script noch ein Wenig angepasst, wegen Auswertung des Wochenzyklus.

Bisher funktioniert es sehr gut.
Werde es ein wenig beobachten und dann nochmal eine Rückmeldung geben.
Schätze mal, wenn es noch die nächste Woche so weiter läuft, ist alles gut.

Danke und Gruß
Björn

Freut mich, wenn es hilfreich war. :slight_smile:

Falls es Probleme gibt, melde Dich einfach nochmal.

Grüße
galleto

Moin,

so, also jetzt nochmal die Rückmeldung:

funktioniert einwandfrei, bisher keine Fehler.
Macht genau das, was ich wollte.

Danke Dir für die Hilfe.

Gruß Björn

Hallo,

habe zum probieren dieses SKript genommen , läuft soweit auch alles durch
allerdings ist mir unklar wo ich die String Variable eintragen muss damit
ich im WFC etwas sehe.

Danke, Grüße Alex

Wenn Du die Variable in eine Kategorie verlinkst, die im WFC angezeigt wird, dann ist auch der Variableninhalt dort sichtbar. Oder habe ich Deine Frage nicht richtig verstanden?

Grüße
galleto

Hi Galetto,

das Problem ist ich bekomme nichts angezeigt weil mir unklar
ist wo ich die Integer Variablen ID eintragen muss.

Grüße Alex

In diesem Beitrag erkläre ich es unter Nr. 2: Am Ende des Skripts steht die ID 12345, die Du für Deine (vorher angelegte) String-Variable anpassen musst. :slight_smile:

Grüße
galleto

Hi Galleto,

er meldet : Undefined variable: farbe in C:\IP-Symcon\scripts\16195.ips.php on line 69

In Zeile 69 steht : $inhalt = „<td style=„color:$farbe“>$inhalt</td>“;

Grüße Alex

Direkt vor dieser Zeile 69 gibt es einen Block, in dem die Farbe anhand der Terminart definiert wird:

               if ($art==$muell) $farbe = "orange";
                elseif ($art==$geburtstage) $farbe = "#0099FF";
                elseif ($art==$arbeit) $farbe = "darkred";
                elseif ($art==$exchange) $farbe = "darkred";
                elseif ($art==$privat) $farbe = "green";
                elseif ($art==$frauchen) $farbe = "green"; 

Wenn Du dort folgende Zeile ergänzt, müsste der Fehler erstmal weg sein (und Du hast blaue Schrift). :smiley:

else $farbe = "blue";

Damit aber unterschiedliche Terminarten in unterschiedlicher Farbe anzeigt werden, musst Du Deine Terminarten (die stehen in jedem Termin-Datensatz) mit der o.g. Farbzuweisung abstimmen.

Achtung! Dazu gibt es einen Zwischenschritt: Vor dem eben beschrieben Farbblock steht der Block, in dem Du Deine Termin-Arten den entsprechenden Variablen zuweist:

       $muell = "Abfall";
                $geburtstage = "Geburtstag";
                $arbeit = "Arbeit";
                $privat = "Privat";
                $frauchen = "Frauchen";
                $exchange = "Exchange"; 

Wenn Du Deine eigenen Termine statt „Privat“ z.B. „Alex“ nennst und rot anzeigen lassen willst, dann lauten die entsprechenden beiden Zeilen dieser beiden Blöcke:

$privat = "Alex";
elseif ($art==$privat) $farbe = "red";

Alles klar? :slight_smile:

Grüße
galleto

Juhuuuu es funktioniert danke.

Habe die Farbe bereits geändert das klappt auch !

habe jetzt noch eine Frage angenommen ich habe auf meinem
NAS mehrere ICS Dateien die ich einlesen möchte wie sieht
dann mein Skript aus. Problem ist das ich ja dort ein Benutzername
und Passwort hinterlegen sollte…

Grüße Alex

ich habe es nun gelöst bekommen allerdings nicht vom NAS
sonder vom IPS Rechner im Post #12 hast du es ja erklärt habe
dann im URL einfach :

http://IP:3777/user/ics/feiertage.ics

eingegeben und es läuft :rolleyes:

Schönes Wochenende !

HI

Wollte gerade eure Scripte testen, habe aber festgestellt das sich wohl die Source Daten von php-ews geändert haben. Oder Ich habe da einen falschen Link?

GitHub - jamesiarmes/php-ews: PHP Exchange Web Services

Wo klemmt es denn?

EDIT: Ah, verstanden, die Dateien fehlen… Ich schau mal.

Grüße
galleto

Schalte mal auf GitHub den Branch auf 0.1.x :smiley:

Grüße
galleto

Huhu, hab den Thread jetzt 2-3 mal durchgelesen. Aber so ganz bin ich mir noch nicht sicher ob ich es richtig verstanden habe. Meine Termine"liegen" mit Baikal auf meinem SynoNAS. Abfragen kann ich diese mittels calDAV.
Kann ich jetzt hiervon ein Script nutzten?
Und wenn ja, wie gehe ich jetzt hier im einzelnen vor?

Du brauchst eine Termindatei im ICS-Format. Keine Ahnung, ob Baikal das liefert, ich denke aber schon. Schau doch mal auf die Syno, was da als Quelle liegt. Die Datei lässt Du von IPS holen, als TXT speichern und dann bearbeiten. Ab Beitrag 3 in diesem Thread wird es für Dich interessant. :slight_smile:

Grüße
galleto

Ok, ich schreib es mal mit für alle die, die das gleiche mal irgendwann vorhaben. :smiley:

Habe jetzt als erstes mal das Plugin aktiviert:
https://github.com/fruux/Baikal/issues/257
Nach neustart von Baikal und wenn ich diese Adresse im Browser öffne:


https://SERVERNAME/baikal/cal.php/calendars/USERNAME/default?export

Muss ich mich als User anmelden und er läd eine ca. 255kb große Datei runter - in Outlook geöffnet, stehen hier alle meine Termine drin.

Jetzt hab ich aus Post #3 das Script 0 geholt, angepasst und ausgeführt:


$url = "https://PASS:USERNAME@SERVERNAME/baikal/cal.php/calendars/USERNAME/default?export".$Name.".ics";

Habe jetzt raus gefunden das Baikal selber keine .ics Datei ablegt. Der Link ist ein Aufruf, eine zu erstellen, die man dann direkt runterlädt. Habe die Datei jetzt zum testen wieder in den Baikal Ordner hochgeladen und das 1. Script geändert:
Zeile 3


$array = array("default");

Zeile 17


$file_txt = IPS_GetKernelDir()."/media/Kalender/$Name.txt"; 

Die .ics Datei wird jetzt als .txt im Ordner abgelegt.

Wenn ich jetzt die .txt zu kurz.txt generieren will, bekomme ich ca. 20x diesen Fehler:


Notice:  iconv(): Detected an illegal character in input string in /var/lib/symcon/scripts/29012.ips.php on line 87

Das kam davon das meine Freundin zig Smilys im Termin benutzt hat… :smiley: …habe die .ics in Outlook gezogen, alle Smilys gelöscht, nochmal abgespeichert und geladen. Auch habe ich alle Termine vor 2017 gelöscht.

Jetzt bekomme ich keine Fehler mehr wenn ich die .txt zu kurz.txt generiere. Komisch ist jetzt aber, das die kurz.txt viel größer ist wie die .txt und sehr sehr sehr oft der hier drin vorkommt:


1431381600,01,00,,Allgemein,ENDE
1431468000,02,00,,Allgemein,ENDE
1431554400,03,00,,Allgemein,ENDE

Nach händischer Löschung alle dieser Zeile, sind jetzt die Termine in IPS.

Habe jetzt alle meine 5 Kalender genommen. Bis auf das man immer muss die .ics generieren lassen, downloaden und wieder hochladen muss, funktioniert bei 3 alles wunderbar. :smiley: …bei 2en bekomme ich immer die Fehler aus Schritt 4.

Bleiben nur noch die Fragen - woher kommen bei meinem „default“ Kalender die vielen vielen Allgemein,ENDE Zeilen… :confused:
Kann auch gerne mal eine solche .ics per Mail zum analysieren versenden.
Und gibt es eine Möglichkeit das die Smilys drin bleiben können? z.B. diese hier „Superbowl 51 ����“ :slight_smile:

ball.jpg

Schön, dass es prinzipiell läuft.

zu 2: Warum lädst Du die Datei wieder hoch? Kannst Du sie nicht sofort verarbeiten? Baikal kenne ich nicht, kann da leider wenig helfen. Aber wenn Baikal einen Download (nach Aufforderung) anbietet, dann sollte es auch direkter gehen; notfalls in 2 Schritten.

zu 3: Das mit den Bildchen dürfte eine Zeichensatzfrage sein und kann m.E. kaum klappen. Hier ist PHP-Zauberei zur Bereinigung gefragt. Google mal „php string sonderzeichen entfernen“. Lieber Nur-Text als Fehler. :cool:

zu 4: Die Zeilen enthalten ja nicht mal einen Monat. :confused: Schick mir mal einen Auszug aus der Quelldatei-TXT per PN. Schau ich mir an.

Grüße
galleto

Huhu,

zu 2: Da bin ich leider zuwenig php gewandt das ich hier auf einen grünen Zweig kommen würde. :rolleyes:

zu 3: Da hab ich das mal versucht:


//Sonderzeichen entfernen
$Sunbird_DS_komplett2 = preg_replace('/[^A-Za-z0-9\
\ß\ \'\_\.\ü\ö\ä\:\;\,\=\-\+\/\\\]/', '', $Sunbird_DS_komplett);
//echo "$Sunbird_DS_komplett2";

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

Wenn ich den „$Sunbird_DS_komplett“ nehme - meldet er mir die illegalen Zeichen - erstellt aber eine .txt mit Inhalt.
Wenn ich aber „$Sunbird_DS_komplett2“ nehme - meldet er keine illegalen Zeichen - erstellt eine .txt aber ohne Inhalt.
Die Ausgabe mit echo sieht aber eigentlich soweit ganz gut aus. :confused:

zu 4: Da hab ich dir was gesendet.

Danke schon mal!! :cool: