Hatte und habe den selben geringen Funktionsanspruch. Ich hoffe, man sieht es den Skripten nicht allzu sehr an. 
- Der Vollständigkeit halber: Zusätzlich zu den Exchange-Terminen - siehe oben - werden auch die ICS-Dateien vom Webdav-Speicher eingesammelt (die für Müll lade ich einmal im Jahr manuell vom Entsorger) und jeweils als Text-Datei gespeichert:
<?
$array = array("NameA","NameB","NameC","NameD","NameE");
//und los
foreach($array as $key => $value) {
$Name = $value;
$url = "https://USER:PASSWORT@WEBDAVURL".$Name.".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\\Kalender\\$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);
}
?>
In der Zeile $url = „https://USER:PASSWORT@WEBDAVURL“.$Name.".ics"; sind die drei groß geschrieben Angaben anzupassen!
- Jede als *.txt gespeicherte ICS-Datei wird mit einem zugehörigen Skript durchforstet, dabei alle Termine in ein einfacheres Format umgewandelt und in eine verkürzte Text-Datei gespeichert. Die einzelnen Skripte ermöglichen mir, auf Besonderheiten (wie Wiederholungstermine) der ICS-Dateien einzugehen. Mein Kurzformat ist „$TIMESTAMP,$dd,$MM,$Terminname,$Kalendername, ENDE“ - etwa „1391036400,30,01,Elternabend,Frauchen,ENDE“. Hier ein Beispielskript:
<?
/*=============================================
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 *.txt
$file_txt = IPS_GetKernelDir()."media\\Kalender\\NameB_kurz.txt";
//Ablageort für *.ics ("Sunbird")
$file_sunbird = IPS_GetKernelDir()."media\\Kalender\\NameB.txt";
//Terminart
$term_art = "Frauchen";
//------------------------------------------
//--------------------------- 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);
//print_r ($Sunbird_DS_komplett);
// war die Kalenderdatei gefüllt?
if(strpos($Sunbird_DS_komplett,'VCALENDAR'))
{
//Den kompletten Datensatz zerlegen
$Sunbird_DS_arr_komplett = explode("BEGIN:", $Sunbird_DS_komplett);
//print_r($Sunbird_DS_arr_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;
//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":
$term_inhalt = $Data_arr[1];
$term_inhalt = iconv('UTF-8','ISO-8859-1',$term_inhalt);
break;
//Wiederholender Termin
case "RRULE":
// print_r($Data_arr[1]."
");
//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":
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;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;
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;
foreach($Sunbird_arr as $key_3)
{
if (strstr($key_3, "SUMMARY") != False )
{
$term_inhalt = substr($key_3, 8);
$term_inhalt = iconv('UTF-8','ISO-8859-1',$term_inhalt);
}
}
$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 ----------------------------
?>
Falls die erzeugte „kurze Textdatei“ fehlerhaft/leer ist, dann den alternativen Zeilenumbruch durch (aus)kommentieren umschalten!
- Wenn alles in „kurze Textdateien“ umgewandelt wurde, dann werden diese mit folgendem Skript ausgelesen. Die Termine werden sortiert, dann „heute“, „morgen“, einem späteren Wochentag oder noch späteren Datum zugeordnet und farbig markiert als Tabelle in die Variable 12345 geschrieben:
<?
//Daten holen, zerlegen und sortieren
$file_abfall = IPS_GetKernelDir()."media\\Kalender\\Abfall2013_kurz.txt";
$file_geburt = IPS_GetKernelDir()."media\\Kalender\\Geburtstage_kurz.txt";
$file_arbeit = IPS_GetKernelDir()."media\\Kalender\\Arbeit_kurz.txt";
$file_privat = IPS_GetKernelDir()."media\\Kalender\\Privat_kurz.txt";
$file_frauchen = IPS_GetKernelDir()."media\\Kalender\\frauchen_kurz.txt";
$file_exchange = IPS_GetKernelDir()."media\\Kalender\\exchange_kurz.txt";
$Daten_abfall = file_get_contents($file_abfall);
$Daten_geburt = file_get_contents($file_geburt);
$Daten_arbeit = file_get_contents($file_arbeit);
$Daten_privat = file_get_contents($file_privat);
$Daten_frauchen = file_get_contents($file_frauchen);
$Daten_exchange = file_get_contents($file_exchange);
$Daten_komplett = $Daten_abfall."
".$Daten_geburt."
".$Daten_arbeit."
".$Daten_privat."
".$Daten_frauchen."
".$Daten_exchange;
$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
$muell = "Abfall";
$geburtstage = "Geburtstag";
$arbeit = "Arbeit";
$privat = "Privat";
$frauchen = "Frauchen";
$exchange = "Exchange";
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";
$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, 12);
$term_fertig = implode("", $termin_arr_kurz);
$table = "<table border=\"0\"><colgroup width=\"100\"></colgroup>".$term_fertig."<table>";
SetValue(12345,$table);
?>
Die viertletzte Zeile begrenzt die Anzahl der Termine (aktuell 12). Ein paar Zeilen vorher werden die Anzeigefarben definiert.
So, ich hoffe das ist ausreichend verständlich und die Anonymisierung hat keine Fehler eingebaut (die Formatierung hat offenbar etwas gelitten - sorry). Ansonsten: Fragen! 
Mit Dank an Ferengi-Master und Schablone!
Grüße
galleto