Termine von Exchange und WebDav per PHP in IPS

Vorweg: Hab keinerlei Probleme mit Deinen Dateien! Aus der ICS lässt sich eine blitzsaubere Kurzversion erzeugen. :slight_smile: Es liegt also an Deinem Umwandlungsskript; zeig es mal her.

zu 2: Versuch mal das hier als Download-Skript (vorher natürlich URL anpassen)

<?
$ch = curl_init("http://www.url/kalender.ics");
$datei = IPS_GetKernelDir()."media\\kalender.txt";
$zieldatei = fopen($datei, "w");
curl_setopt($ch, CURLOPT_FILE, $zieldatei);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_exec($ch);
fclose($zieldatei);
?>

zu 3: Befehl passt, aber wahrscheinlich falsche Stelle. In welchem Skript wirft er denn welchen Fehler (aufgrund der Sonderzeichen, also ohne einen zusätzlichen Eingriff)?

Grüße
galleto

Wegen der Download-/Export-Probleme von Baikal hab ich mal bissl gegoogelt. Das ist für mich recht unübersichtlich und offenbar nicht so einfach möglich. Wahrscheinlich musst Du die Lösung außerhalb des IPS-Forums suchen - oder auf manuellen Download umstellen, was aber unter der Würde eines Hausautomatisierers sein dürfte. :smiley:

Grüße
galleto

Das „Problem“ liegt eigentlich nur daran. Die Adresse „https://USER:PASS@URL/baikal/cal.php/calendars/USER/default?export“ aufrufen - 10 Sekunden warten - dann die Datei „default.ics“ runterladen. Dann die Adresse „https://USER:PASS@URL/baikal/cal.php/calendars/USER/arbeit?export“ aufrufen - 10 Sekunden warten - dann die Datei „arbeit.ics“ runterladen… Und die Schleife halt weiterbauen bis man alle Kalender hat…

…aber Bau sowas mal… :smiley: …wenn ich das jetzt auf einer SPS in einer anderen „Sprache“ bauen könnte, würde ich das sicherlich hinbekommen, aber die hat es nun mal nicht so mit Datei downloaden. :cool:

Zu weiter oben, ich glaube es liegt an wiederholenden Terminen, habe den einen, der auch im Kalender war, den ich dir geschickt hab gelöscht und mit diesem Script durchlaufen lassen:


<? 

/*============================================= 
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/arbeit_kurz.txt"; 
//Ablageort für lange *.txt ("ICS") 
$file_sunbird = IPS_GetKernelDir()."/media/Kalender/arbeit.txt"; 
//Terminart 
$term_art = "arbeit"; 
//------------------------------------------ 


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

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

                    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 

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

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

?>

Erzeugt bei mir hier:
kurz2.JPG

Sollte ich noch erwähnen das die IPS auf einem Raspberry rennt?!

zu der anderen Sache:
illegal.jpg
Kommt diese Meldung wenn ich die .txt zur kurz.txt schreibe. Datei kurz.txt wird aber angelegt, nur fehlt der Termin in dem das Sonderzeichen war.

Da Notepad++ gerade keinen Skriptvergleich machen möchte, lösen wir Problem 1 jetzt kurz und schmerzlos. :smiley:

Ich habe die Skripte immer mal wieder weiterentwickelt, nimm einfach mal das hier:

<?

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

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\\arbeit_kurz.txt";
//Ablageort für *.ics ("Sunbird")
$file_sunbird = IPS_GetKernelDir()."media\\Kalender\\arbeit.txt";
//Terminart
$term_art = "arbeit";
//------------------------------------------


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

// Variablen

//String für kompletten Sunbird Datensatz
$Sunbird_DS_komplett = "";
//String array für Termine
$term_arr_komplett = 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);

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

//Wiederholungsregel inaktiv setzen
$rrule 						= 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;

                    //Zeitstempel Datum
                    case "DTSTART;VALUE=DATE":
								if (!$rrule) {
								$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;

                    //Zeitstempel Datum und Zeit
                    case "DTSTART;TZID=Europe/Berlin":
								if (!$rrule) {
								$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 "DTSTART;VALUE=DATE;TZID=Europe/Berlin":
								if (!$rrule) {
								$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;

                    //Wiederholender Termin
                    case "RRULE":
//							print_r($Data_arr[1]."
");

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

                        //Einzelfall: 1. Dienstag im Monat
                        if($Data_arr[1] == "FREQ=MONTHLY;BYDAY=1TU")
                        {
									$rrule = 1;
									$timestamp = time();
									$diesjahr = date("Y",$timestamp);
                           $diesmonat = date("m",$timestamp);
  									$heute = date("d",$timestamp);

                           $term_jahr = $diesjahr;
                           
									// wenn 1. Dienstag des Monats schon vorbei, dann nächster Monat
	                        $monatserster = date("w", mktime(0, 0, 0, (int)$diesmonat, 1, (int)$diesjahr));
									$dienstag_arr = array("03","02","01","07","06","05","04");
									$dienstag_tag = $dienstag_arr[$monatserster];
                           if ($heute > $dienstag_tag) {
										$term_monat = sprintf("%02s", $diesmonat + 1);
		                        $monatserster = date("w", mktime(0, 0, 0, (int)$term_monat , 1, (int)$diesjahr));
										$dienstag_tag = $dienstag_arr[$monatserster];
										}
									else {
										$term_monat = $diesmonat;
										}
									$term_tag = $dienstag_tag;
                        }
                        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;
        }
	}
}

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

?>

Da ist ein Experiment zur Erkennung von Terminwiederholungen drin, aber das schadet jetzt nicht. :wink:

Bitte Ergebnis zurückmelden!

Grüße
galleto

Das andere Problem haben wir auch gleich…

Such mal in der genannten Zeile den Befehl „iconv“. Meine Zeilennummern sind anders, aber es müsste wahrscheinlich so aussehen:

$term_inhalt     = iconv('UTF-8','ISO-8859-1',$term_inhalt);

Schau mal hier (v.a. in den Beispielen), was man damit jetzt alles machen kann:
PHP: iconv - Manual

„ISO-8859-1//TRANSLIT“ oder „ISO-8859-1//IGNORE“ sollten Dir helfen.

Grüße
galleto

Moin, hatte gestern leider keine Zeit mehr.
Was soll ich groß sagen - Probleme 1-2 sind wech… :smiley:
Zum Thema Smilys, war nur noch diese eine Zeile zu ändern:


$term_inhalt     = iconv('UTF-8','ISO-8859-1//IGNORE',$term_inhalt); 

Das Problemchen 3 hab ich schon fast selber gelösst - einen Kalender kann man schon mal hiermit abholen. :cool:


<? 

// ----------------------------------------------------------------------------------------------------------------------------
$user = "geheim";          					// Baikal User Name
$pass = "noch_geheimer"; 		// Baikal User Passwort
$host = "weiß_ich_nicht";  				// Baikal Server Adresse
$kalender_id = "default";					// Baikal Kalender
$max_time = 15000; 							// Warte Timeout zwischen Export und Download
// ----------------------------------------------------------------------------------------------------------------------------


$url_export = "https://".$user.":".$pass."@".$host."/baikal/cal.php/calendars/".$user."/".$kalender_id."?export"; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)"); 
curl_setopt($ch, CURLOPT_URL, $url_export); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $max_time);
$file_txt = IPS_GetKernelDir()."/media/Kalender/".$kalender_id.".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);

//echo "$url_export
$url
$file_txt
$ch
$fp";

?>

Hier noch die Variante für mehrere Kalender: :D:D


<? 
// calDAV downloader für Baikal Server
// -----------------------------------------------------------------------------------------------------------------------------
$user = "geheim";          														// Baikal User Name
$pass = "noch_geheimer"; 											// Baikal User Passwort
$host = "weiß_icht_nicht";  													// Baikal Server Adresse
$kalender_array = array("default","fussball","muell","arbeit","feiertage");  	// Zu ladende Kalender "in" Baikal
$max_time = 15000; 																// Warte Timeout zwischen Export und Download
// -----------------------------------------------------------------------------------------------------------------------------
foreach($kalender_array as $key => $value) {

	$kalender_id = $value; 

	$url = "https://".$user.":".$pass."@".$host."/baikal/cal.php/calendars/".$user."/".$kalender_id."?export"; 

	$ch = curl_init(); 
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_VERBOSE, 1);
	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)"); 
	curl_setopt($ch, CURLOPT_URL, $url); 
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $max_time);
	$file_txt = IPS_GetKernelDir()."/media/Kalender/".$kalender_id.".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);
}
// -----------------------------------------------------------------------------------------------------------------------------
?>

Huhu, ich nochmal. :rolleyes:
Hast du auch schon eine Idee was man mit mehrtägigen Terminen macht?

Schön, dass es läuft! :slight_smile:

EDIT: Alzheimernachweis gelöscht…

Grüße
galleto

Ich glaub ich werde alt! :eek: Das von Dir zuerst verwendete Skript hatte bereits eine Lösung für Dauertermine eingebaut. :banghead:

Aufgrund eines Fehlers im Skript wurde aber der Terminname für Folgetage nicht gespeichert. Genau deshalb entstanden bei Dir die ganzen unbenannten Termine. Nun hab ich Dir ein veraltetes Skript angedreht, was keine Dauertermine kann. Damit ist zwar der Fehler weg, aber auch die Dauertermine sind verschwunden. Ich setz mich ran und suche den Fehler im richtigen Skript, dann ist alles gut.

Man, man, man, …

Grüße
galleto

So, jetzt mit funktionierenden Dauerterminen. Hoffentlich. :smiley:

<?

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

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\
ame_kurz.txt";
//Ablageort für *.ics ("Sunbird")
$file_sunbird = IPS_GetKernelDir()."media\\Kalender\
ame.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);
//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);
										}
									}
								
								$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 testen!

Grüße
galleto

Moiinn…

der hier kommt jetzt:


Notice:  Undefined variable: start_timestamp in /var/lib/symcon/scripts/48508.ips.php on line 150
Notice:  Undefined variable: start_timestamp in /var/lib/symcon/scripts/48508.ips.php on line 152
Notice:  Undefined variable: start_timestamp in /var/lib/symcon/scripts/48508.ips.php on line 156

Dafür gibt es eine theoretische Erklärung: Wenn das Skript das Terminende (case „DTEND;VALUE=DATE“: ) berechnet, kennt es den Terminanfang nicht. Da Skripte üblicherweise nicht vergesslich sind, kennt es den Terminanfang also noch nicht. Das bedeutet praktisch, dass die Termine in der Quelldatei offenbar so aufgebaut sind, dass jedes Terminende vor dem -anfang steht. Wer macht denn sowas? :eek: Aber das ist Stochern im Nebel; für eine echte Analyse müsste ich die Quelldatei sehen.

Grüße
galleto

Ok, dass Problem können wird begraben. Habe alle Terminen in einen neuen Kalender kopiert und anschließend wieder zurück in den „richtigen“. Jetzt rennt es komischerweise problemlos durch. :smiley:

Aaaaaaabber… ich da noch was gesehen. :rolleyes: Und zwar macht das Script bei mehrtägigen Terminen die ein äöü intus haben ein äü rein.


1484175600,12,01,Spätdienst ,arbeit,ENDE
1484262000,13,01,Spätdienst ,arbeit,ENDE
1484348400,14,01,Frei,arbeit,ENDE
1484434800,15,01,Frei,arbeit,ENDE
1484521200,16,01,Frei,arbeit,ENDE
1484607600,17,01,Frei,arbeit,ENDE
1484694000,18,01,Frühdienst ,arbeit,ENDE
1484780400,19,01,Frühdienst ,arbeit,ENDE
1484866800,20,01,Frühdienst ,arbeit,ENDE
1484953200,21,01,Frühdienst ,arbeit,ENDE
1485039600,22,01,Frühdienst ,arbeit,ENDE

Ja, das ist verständlich, da fehlte noch das:

$term_inhalt     = iconv('UTF-8','ISO-8859-1',$term_inhalt);

oder in Deinem besonderen Sonderzeichen-Fall :smiley: das hier:

$term_inhalt     = iconv('UTF-8','ISO-8859-1//IGNORE',$term_inhalt);

Danke fürs Testen! :slight_smile:

Das Skript sieht jetzt so aus:

 <?

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

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\
ame_kurz.txt";
//Ablageort für *.ics ("Sunbird")
$file_sunbird = IPS_GetKernelDir()."media\\Kalender\
ame.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);
//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 ----------------------------

?> 

Ich tausche es mal in Beitrag #3 unter Nr. 1 aus.

Grüße
galleto

Super! Jetzt läuft auch hier alles.:D:D Wenn man jetzt noch den Thread Namen mitgeben könnte das auch calDav und Baikal hier ausgelesen werden können, wäre alles super!:slight_smile:

Hab angefragt. :slight_smile:

Grüße
galleto

Huhu, ich bins nochmal… :smiley:

Hab eben das hier gefunden - wenn ich einen Termin aus dem emClient erstelle & bearbeite - funktioniert alles - wenn ich aber den Termin in iOS erstelle & bearbeite, funktionieren die mehrtägigen Ereignisse nicht mehr… so sehen die Termine in der .ics aus:


mit emClient neu erstellt:  (Termin OK)

BEGIN:VEVENT
UID:45A9FC58-DB2E-49AA-87F9-0644A3DBA568
SEQUENCE:2
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
DTSTART;VALUE=DATE:20170303
DTEND;VALUE=DATE:20170309
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
LAST-MODIFIED:20170305T122307Z
DTSTAMP:20170305T122307Z
CREATED:20170305T122118Z
SUMMARY:Frühdienst.
LOCATION:.
CLASS:PUBLIC
END:VEVENT
--------------------------------------------
mit iOS neu erstellt: (Termin nicht OK)

BEGIN:VEVENT
CREATED:20170305T122626Z
DTEND;VALUE=DATE:20170309
DTSTAMP:20170305T122627Z
DTSTART;VALUE=DATE:20170303
LAST-MODIFIED:20170305T122626Z
LOCATION:.
SEQUENCE:0
SUMMARY:Frühdienst.
TRANSP:OPAQUE
UID:A2BD0256-E658-4CA2-A75B-91E9866332BB
END:VEVENT
------------------------------------------------
nach Änderung des Termin mit emClient: (nur Location gelöscht - Termin OK)

BEGIN:VEVENT
UID:A2BD0256-E658-4CA2-A75B-91E9866332BB
SEQUENCE:2
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
DTSTART;VALUE=DATE:20170303
DTEND;VALUE=DATE:20170309
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
LAST-MODIFIED:20170305T123452Z
DTSTAMP:20170305T123452Z
CREATED:20170305T122626Z
SUMMARY:Frühdienst.
CLASS:PUBLIC
END:VEVENT
-----------------------------------------------
nach Änderung des Termins mit iOS: (nur Location gesetzt - Termin nicht OK)

BEGIN:VEVENT
CLASS:PUBLIC
CREATED:20170305T122626Z
DTEND;VALUE=DATE:20170309
DTSTAMP:20170305T123846Z
DTSTART;VALUE=DATE:20170303
LAST-MODIFIED:20170305T123452Z
LOCATION:.
SEQUENCE:2
SUMMARY:Frühdienst.
TRANSP:OPAQUE
UID:A2BD0256-E658-4CA2-A75B-91E9866332BB
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
END:VEVENT

Bei iOS sieht man, dass das Terminende (DTEND) vor dem Terminstart hinterlegt wird. Das bringt das Skript aus dem Tritt. schau ich mir bei Gelegenheit an.

Grüße
galleto

Huhu - habe eben bemerkt das mit dem aktuellen iOS 11.2.5 der Terminaufbau geändert wurde. Jetzt kommt der DTSTART auch vor dem DTEND und somit funktioniert das ganze jetzt auch wieder… :smiley:

…alte Termine die mit der früheren iOS erstellt wurden musste man nur 1x „anpacken“ damit diese auch richtig abgelegt wurden.:cool: