Google Kalender Termine im WebFront anzeigen

So ein Mist das mit den Kalender lief so gut. Wir nutzen den Kalender sehr häufig um Termine untern einander auszutauschen. Ist da schon jemand dran an der Umstellung für mich ist das leider eine Nummer schwer um den Kalender mit der APi Umstellung zum Laufen zu bekommen.

Gruß Stephan

Wenn man nur die Mülltermine braucht, ansonsten aber auf die Kalenderfunktion verzichten kann, könnte man die Termine für die Leerung auch einfach in vier String-Variablen schreiben. Ich habe das mal in einem Skript versucht. Dabei habe ich berücksichtigt, dass an einem Tag auch mal mehrere Tonnen geleert werden. In dem Skript erzeuge ich jeweils für die Leerung heute und morgen max. vier Variablen, die sozusagen die Stellpätze an der Straße repräsentieren. Diese Variablen kann ich dann in IPSView leicht verwenden, um die Mülltonnen anzuzeigen. Wenn man nur eine Tonne pro Tag zulässt, würde sich das Skript natürlich deutlich vereinfachen.
Bei der manuellen Eingabe der Leerungstermine ist wichtig, dass das Datum in der Form „TT.MM.JJJJ“ mit führender Null geschrieben wird, also z.B „06.01.2014|20.01.2014|03.02.2014|17.02.2014|…“

Gruß
Peter


<?
$max_stellplaetze=4; // wieviel Mülltonnen werden max. an einem Tag geleert?

for($i=0;$i<$max_stellplaetze;$i++)  // Mit 0 initialisieren
{
	$id_tonne_heute[$i] = CreateVariablebyname(34207, "Muelltonne".$i."_heute", 1);
	$id_tonne_morgen[$i] = CreateVariablebyname(34207, "Muelltonne".$i."_morgen", 1);
	SetValue($id_tonne_heute[$i],0);
	SetValue($id_tonne_morgen[$i],0);
}

// in diesen String-Variablen steht jeweils die Liste alle Leerungstermine
// die Termine müssen Anfang des Jahres einmalig manuell in die Variablen geschrieben werden.
$restmuell = GetValue(44396);
$biotonne = GetValue(14679);
$blauetonne = GetValue(49786);
$gelbersack = GetValue(23708);

$tomorrow = date("d.m.Y", strtotime("+1 day"));
$today = date("d.m.Y");

$rm_tage = explode("|", $restmuell);
$bio_tage = explode("|",$biotonne);
$bt_tage = explode("|", $blauetonne);
$gs_tage = explode("|", $gelbersack);

// Welche Tonnen werden heute geleert?
$stellplatz=0;
if(array_search ( $today , $rm_tage) !== FALSE)  // heute Restmüll?
	SetValue($id_tonne_heute[$stellplatz++],1);
if(array_search ( $today , $bio_tage) !== FALSE)  // heute Biomüll?
	SetValue($id_tonne_heute[$stellplatz++],2);
if(array_search ( $today , $bt_tage) !== FALSE)  // heute Biomüll?
	SetValue($id_tonne_heute[$stellplatz++],3);
if(array_search ( $today , $gs_tage) !== FALSE)  // heute Blaue Tonne?
	SetValue($id_tonne_heute[$stellplatz],4);

//Welche Tonnen werden morgen geleert?
$stellplatz=0;
if(array_search ( $tomorrow , $rm_tage) !== FALSE)  // morgen Restmüll?
	SetValue($id_tonne_morgen[$stellplatz++],1);
if(array_search ( $tomorrow , $bio_tage) !== FALSE)  // morgen Biomüll?
	SetValue($id_tonne_morgen[$stellplatz++],2);
if(array_search ( $tomorrow , $bt_tage) !== FALSE)  // morgen Blaue Tonne?
	SetValue($id_tonne_morgen[$stellplatz++],3);
if(array_search ( $tomorrow , $gs_tage) !== FALSE)  // morgen Gelber Sack?
	SetValue($id_tonne_morgen[$stellplatz],4);


// -------------------------------------------------
function CreateVariableByName($id, $name, $type, $profile = "")
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    return $vid;
}

?>

Hallo Peter!

Das war eine wunderbare Vorlage, um bei mir wieder alles zum Laufen zu bringen, mit ein paar Anpassungen zu meinem alten Aufbau, gefällt es mir jetzt sogar besser als vorher :slight_smile:

So kann ich automatisch Termine einlaufen lassen und noch manuell im WebFront etwas bei Bedarf ändern :slight_smile:

Das bearbeitete Skript sieht dann so aus:

<?
// Konfiguration:
// In den String Variablen müssen alle Termine nach diesem Muster eingetragen werden:
//   05.01.2015|11.02.2015|25.02.2015|09.03.2015|...........
$TermineSchwarzeTonne = GetValue(33569 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Termine\schwarze Tonne]*/);  // ID der String Variable mit Terminen für die schwarze Tonne
$TermineGrueneTonne = GetValue(38003 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Termine\grüne Tonne]*/);    // ID der String Variable mit Terminen für die grüne Tonne
$TermineGelberSack = GetValue(48284 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Termine\gelber Sack]*/);     // ID der String Variable mit Terminen für den gelben Sack

// Hier die BOOLEAN Variablen (true = Tonne wird geleert, false = Tonne wird nicht geleert)
$schwarzeTonneHeute = 58237 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\HEUTE (schwarze Tonne)]*/;
$schwarzeTonneMorgen = 45120 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\MORGEN (schwarze Tonne)]*/;
$grueneTonneHeute = 16547 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\HEUTE (grüne Tonne)]*/;
$grueneTonneMorgen = 55806 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\MORGEN (grüne Tonne)]*/;
$gelberSackHeute = 44565 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\HEUTE (gelber Sack)]*/;
$gelberSackMorgen = 40138 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\MORGEN (gelber Sack)]*/;

// Zu Beginn alles auf false setzen, damit später die entsprechenden Tonnen auf true gesetzt werden können
SetValue($schwarzeTonneHeute, false);
SetValue($grueneTonneHeute, false);
SetValue($gelberSackHeute, false);
SetValue($schwarzeTonneMorgen, false);
SetValue($grueneTonneMorgen, false);
SetValue($gelberSackMorgen, false);

$tomorrow = date("d.m.Y", strtotime("+1 day"));
$today = date("d.m.Y");

$rm_tage = explode("|", $TermineSchwarzeTonne);
$bt_tage = explode("|", $TermineGrueneTonne);
$gs_tage = explode("|", $TermineGelberSack);

// Welche Tonnen werden heute geleert?
if(array_search ( $today , $rm_tage) !== FALSE)  // heute schwarze Tonne?
    SetValue($schwarzeTonneHeute, true);
if(array_search ( $today , $bt_tage) !== FALSE)  // heute grüne Tonne?
    SetValue($grueneTonneHeute, true);
if(array_search ( $today , $gs_tage) !== FALSE)  // heute gelber Sack?
    SetValue($gelberSackHeute, true);

// Welche Tonnen werden morgen geleert?
if(array_search ( $tomorrow , $rm_tage) !== FALSE)  // morgen schwarze Tonne?
    SetValue($schwarzeTonneMorgen, true);
if(array_search ( $tomorrow , $bt_tage) !== FALSE)  // morgen grüne Tonne?
    SetValue($grueneTonneMorgen, true);
if(array_search ( $tomorrow , $gs_tage) !== FALSE)  // morgen gelber Sack?
    SetValue($gelberSackMorgen, true);

?>

Einfach aber gut :slight_smile:

Vielen Dank und Grüße,
Chris

Hallo zusammen,

und hier noch eine funktionierende Version mit korrekter Dienste Authentifzierung:

[ol]
[li]Google PHP API runterladen und im unterordner des script Verzeichnisses speichern (https://github.com/google/google-api-php-client)
[/li][li]Danach in der google Console ein neues Projekt anlegen (https://console.developers.google.com/project)
[/li][li]Nun die Calendar API in diesem Projekt aktivieren und bei Zugangsdaten neue Client ID erstellen (Typ Dienstkonto)
[/li][li]Das keyfile runterladen und im IPS Ordner entsprechend ablegen (nicht public)
[/li][li]Den Google Kalender in den Einstellungen für diesen Service-User (Generierte Email-Adresse für diese Client-ID) freigeben und berechtigen.
[/li][li]Aus dem alten OpenSSL Paket (Version 0.9.8zc, https://www.openssl.org/)die Dateien ssleay32.dll und libeay32.dll in den IPS Ordner (alte umbenennen)
[/li][li]in der PHP-ini die Extension Open ssl aktivieren (extension = php_openssl.dll)
[/li][li]script s.u. konfiguriren- fertig
[/li][/ol]

Jetzt liest das Script die kommenden Termine (heute +1 Woche) ein und gibt sie aus.
Können nat. auch in eine Variable geschrieben werden etc.



	$C["CLIENT-ID"]   = "irgendwasgeneriertes.apps.googleusercontent.com";
	$C["EMAIL"]       = "irgendwasgeneriertes@developer.gserviceaccount.com";
	$C["PRIVATEKEY"]  = "pfad zum key file, zb. ../mykey.p12";
	$C["CALENDAR"]   = "Name des Kalenders zb. irgendwas@googlemail.com";

	$C["LINESEP"]    = "<br>
";

	require_once 'google-api-php-client/autoload.php';

	$client = new Google_Client();
	// Replace this with your application name.
	$client->setApplicationName("IPS");
	$service = new Google_Service_Calendar($client);

	$key = file_get_contents($C["PRIVATEKEY"]);
	$cred = new Google_Auth_AssertionCredentials(
														  $C["EMAIL"],
														 array('https://www.googleapis.com/auth/calendar.readonly'),
														  $key
																);
	$client->setAssertionCredentials($cred);

	$cals = $service->calendarList->listCalendarList();

	// Convert recurring events to single events
	// Look for events in the next week - now to now+1week
	$params = array(
	 'singleEvents' => TRUE,
	 'timeMin' => (new DateTime())->format(DateTime::RFC3339),
	 'timeMax' => (new DateTime())->add(new DateInterval('P1W'))->format(DateTime::RFC3339),
	);
	$events = $service->events->listEvents($C["CALENDAR"], $params);

 $caltxt ="";
	foreach ($events->getItems() as $event) {
	 $eventDate = $event->getStart()->dateTime;
	 $evDate = new DateTime($eventDate);
	 $date = $evDate->getTimestamp();
	 $caltxt .= (date("H:i", $date) != "00:00")?date("d.m.Y H:i", $date)." ":date("D d.m.Y", $date )." ";
	 $caltxt .= utf8_decode($event->getSummary());
	 $caltxt .= $C["LINESEP"];
	}

// jetzt was zb. in eine variable schreiben etc.	

if($_IPS['SENDER'] == "Execute")
{
    echo "<pre>";
    echo $caltxt;
}

Hallo,
du kannst Google gerne bitten, dir zukünftig ein Fax zu senden, da dir die neuen Medien noch fremd sind.
Falls es dir Microsoft per Fax noch nicht mitgeteilt haben sollte, für Windows 95, 98 und, jetzt top aktuell, selbst für XP gibt es keine Sicherheitsupdates mehr… :eek:

Übrigens: Google Contacts API v3 wird ab 05.05.2015 Pflicht.

@stele99

Danke für deine gute Erklärung! => Läuft auf Anhieb :smiley:

Bei Punkt 6, Besorgen der beiden Dateien, bin ich leider gescheitert… wo sollen diese sein, hab sie so nicht gefunden.:confused:
Hab dann die Dateien aus diesem Link genommen:

http://www.ip-symcon.de/files/service/OpenSSL-0.9.8.zip

Insgesamt ist es alles ein wenig tricky…Wenn ich mir das nicht aufschreibe und in einem Jahr ist wieder was… seh ich alt aus.

Ansonsten lief es auf Anhieb. Fehlt nur noch aufhübschen für das WFE.

Jürgen

Vielen Dank für dein Script und die tolle Anleitung dazu - hat bei mir auf Anhieb funktioniert, ich wusste nicht mal, das Google diese Möglichkeit bietet.

Jetzt muss ich mur noch überlegen, wie ich die Daten sinnvoll in Variablen verpacke um die z.b. für die Heizungssteuerung nutzen zu können.

geht mir genauso, ich schreibe mir mittlerweile alles was ich so konfiguriere oder bastele in eine Wiki rein

Hallo zusammen,

Also ei mir läuf es icht so gut.
Ich bekomme folgende fehlermeldung:

Fatal error: Uncaught exception ‚Google_Auth_Exception‘ with message ‚Error refreshing the OAuth2 token, message: ‚{
„error“ : „invalid_grant“
}‘‘ in C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\OAuth2.php:358
Stack trace:
#0 C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\OAuth2.php(309): Google_Auth_OAuth2->refreshTokenRequest(Array)
#1 C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\OAuth2.php(234): Google_Auth_OAuth2->refreshTokenWithAssertion()
#2 C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Service\Resource.php(208): Google_Auth_OAuth2->sign(Object(Google_Http_Request))
#3 C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Service\Calendar.php(1120): Google_Service_Resource->call(‚list‘, Array, ‚Google_Service_…‘)
#4 C:\Program Files\IP-Symcon\scripts\55510.ips.php(25): Google_Service_Calendar_CalendarList_Resource->listCalendarList()
#5 {main}
thrown in C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\OAuth2.php on line 358
Abort Processing during Fatal-Error: Uncaught exception ‚Google_Auth_Exception‘ with message ‚Error refreshing the OAuth2 token, message: ‚{
„error“ : „invalid_grant“
}‘‘ in C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\OAuth2.php:358
Stack trace:
#0 C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\OAuth2.php(309): Google_Auth_OAuth2->refreshTokenRequest(Array)
#1 C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\OAuth2.php(234): Google_Auth_OAuth2->refreshTokenWithAssertion()
#2 C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Service\Resource.php(208): Google_Auth_OAuth2->sign(Object(Google_Http_Request))
#3 C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Service\Calendar.php(1120): Google_Service_Resource->call(‚list‘, Array, ‚Google_Service_…‘)
#4 C:\Program Files\IP-Symcon\scripts\55510.ips.php(25): Google_Service_Calendar_CalendarList_Resource->listCalendarList()
#5 {main}
thrown
Error in Script C:\Program Files\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\OAuth2.php on Line 358

Gruß Stepahn

Erst mal Danke für das Skript!

Inzwischen redet es mit meinem Google Kalender :slight_smile:

Allerdings werden die Termine ohne korrektes Datum ausgelesen bzw. wird das Datum und die Uhrzeit der Skript-Ausführung vor den Namen des Termin gesetzt und nicht das eigentliche Datum des Termins.

Kann da jemand helfen?

Beste Grüße

Axel

@teas1512

„Uncaught exception ‚Google_Auth_Exception‘ … error“ : „invalid_grant“

Hast du in deinem tatsächlichen Google Kalender die generierte eMail zugelassen? Sieht nach einem Berechtigungsproblem aus
=> authentication

Von mir auch schon mal ein Danke für die Anleitung zum Script.
Den Fehler mit der Zeit habe ich auch, allerdings nur bei den heutigen Terminen. Termin in der Zukunft werden korrekt ausgelesen.
Gehakt hatte es bei mir auch erst, weil ich den richtigen Kalendernamen wie im Script gefordert eingetragen habe und nicht die ursprüngliche email Adresse des Kalenders.

Vllt. kannst du uns nochmal kurz erklären, wie man den Zeitraum bzw. die Anzahl der Eintrage bestimmen kann.
Kann man die Eintrage irgendwie wieder in ein XML schreiben um das evtl. wieder kompatibel zu den alten Scripten zu machen um nicht allzuviel umauen zu müssen?

Viele Grüße,
Doc

edit: die falsche Zeit wird anscheinend nur bei den ganztägigen Terminen gesetzt

Hallo…

ich verwende bei mir folgende Skripte:

  1. Eine kleine Funktionssammlung, die den Googlekalender ausliest. Die Basis stammt von hier (Accessing Google Calendar using the php API | mytechscraps). Die Funktion „ReadCalendar“ liefert ein Array zurück, welches man unkompliziert weiterverarbeiten kann.

$calname = Der Name des Googlekalenders … z.B. ‚xxxxxxxxx@group.calendar.google.com‘
$maxDays = die Anzahl der auszulesenden Tage (ab heute)
$shortCut = beliebige Zeichenkette (wird im Skript zwei beim Auslesen von mehreren Kalendern verwendet)


<?
function ReadCalendar($calName, $maxDays, $shortCut)
	{
	require_once "google-api-php-client-master/autoload.php";

	// Service Account info
	$client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com';
	$service_account_name = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com';
	$key_file_location = 'google-api-php-client-master/Google-IPS-Kalenderxxxxxxxxxxxxxxxxx.p12';


	$client = new Google_Client();
	$client->setApplicationName("TestKalender");
	$service = new Google_Service_Calendar($client);
	$key = file_get_contents($key_file_location);
	$cred = new Google_Auth_AssertionCredentials($service_account_name, array('https://www.googleapis.com/auth/calendar.readonly'), $key);

	$client->setAssertionCredentials($cred);


	// Convert recurring events to single events
	// Look for events in the next week - now to now+1week
	$params = array( 'singleEvents' => TRUE,
	   				  'timeMin' => (new DateTime())->format(DateTime::RFC3339),
	   				  'timeMax' => (new DateTime())->add(new DateInterval('P' .$maxDays .'D'))->format(DateTime::RFC3339),);

	$events = $service->events->listEvents($calName, $params);

//print_r ($events->getItems());

	$c=0;
	foreach ($events->getItems() as $event)
				{
            $Ergebnis[$c]['StartDatum'] = fmt_gdate($event->getStart());
            $Ergebnis[$c]['StartZeit'] = fmt_gtime($event->getStart());
				$Ergebnis[$c]['EndeDatum'] = fmt_gdate($event->getEnd());
				$Ergebnis[$c]['EndeZeit'] = fmt_gtime($event->getEnd());
				$Ergebnis[$c]['Beschreibung'] = iconv('UTF-8', 'ISO-8859-1',$event->getSummary());
				$Ergebnis[$c]['Ort'] = iconv('UTF-8', 'ISO-8859-1',$event->getLocation());
				$Ergebnis[$c]['shortCut'] = $shortCut;
         	if($Ergebnis[$c]['StartZeit'] == "00:00" && $Ergebnis[$c]['EndeZeit'] == "00:00")
            	{
	            $Ergebnis[$c]['EndeDatum'] = date("d.m.Y", strtotime($Ergebnis[$c]['EndeDatum']."-1 day"));
					}
				$c++;
				}
	usort($Ergebnis, 'DateCompare');
	return $Ergebnis;
   }


function fmt_gdate( $gdate )
	{
	 if ($val = $gdate->getDateTime())
         {
       return (new DateTime($val))->format( 'd.m.Y' );
          }
       else if ($val = $gdate->getDate())
        {
        return (new DateTime($val))->format( 'd.m.Y');
        }
	}

function fmt_gtime( $gdate )
	{
	 if ($val = $gdate->getDateTime())
         {
   	    return (new DateTime($val))->format( 'H:i' );
         }
       else if ($val = $gdate->getDate())
      	{
        return ('00:00');
        	}
   }

function DateCompare($a, $b)
	 {
    if ( strtotime($a['StartDatum']) == strtotime($b['StartDatum']) ) return 0;
    if ( strtotime($a['StartDatum']) < strtotime($b['StartDatum']) )  return -1;
    return 1;
	 }

?>


  1. Das „Anzeigeskript“:

Ich habe das Skript von crypto (#122) etwas modifiziert, so das es mit der obigen Kalenderfunktion zusammenarbeitet:


<?

require_once "Google_Kalender_Funktionen.ips.php";


// Hier die GoogleKalender eintragen

//Kalender 1
$Userid1='kalenderxxxx@gmail.com';
$Tage1=100;
$ShortCut1=1;


//Kalender 2
$Userid2='xxxxxxxxx@group.calendar.google.com';
$Tage2=300;
$ShortCut2=4;


//Hier die Farbe für die ShortCuts angeben

$SC_Farbe[1] = "gray";
$SC_Farbe[2] = "#00AD00";
$SC_Farbe[3] = "darkred";
$SC_Farbe[4] = "lightblue";


//Hier den Style wählen

$blinkToday = true; // (true/false) blinken des heutigen Kalendereintrages An/Aus

/******** Farbnamen, RGB-Formatierung, Hex-Zahlen möglich *********/

$StyleText[1] = "white"; // Textfarbe Datum
$StyleText[2] = "gray"; // Textfarbe Wochentag

/*** xx-small, x-small, small, normal, large, x-large, xx-large ***/

/************** oder Angabe in pt - z.B. "12pt" *******************/

$StyleText[3] = "small"; // Textgröße Datum
$StyleText[4] = "small"; // Textgröße Wochentag
$StyleText[5] = "small"; // Textgröße Eintrag


/****************** Ab hier wieder die Finger lassen **************/
// Wochentage auf Deutsch

$tag[0] = "Sonntag";
$tag[1] = "Montag";
$tag[2] = "Dienstag";
$tag[3] = "Mittwoch";
$tag[4] = "Donnerstag";
$tag[5] = "Freitag";
$tag[6] = "Samstag";

$deco = "";

if($blinkToday)
   {
    $deco = "blink";
    }
   

//******************************************************************************

$calc1=ReadCalendar($Userid1, $Tage1, $ShortCut1);
$calc2=ReadCalendar($Userid2, $Tage2, $ShortCut2);
$calcData=array_merge($calc1, $calc2);

//$calcData=$calc2;
usort($calcData, 'DateCompare');

//print_r($calcData);

$calDataTxt = "<table style='border-spacing:0px; width:100%'>"; // Starte Tabellenansicht
$check_date = "";

foreach($calcData as $thisData)
        {
      if($thisData['EndeDatum'] != date("d.m.Y", strtotime("yesterday")))
        {
        if($check_date != "" and $thisData['StartDatum'] != $check_date)
             {
             $calDataTxt .= "</table></th></tr>";
             }
        if($thisData['StartDatum'] != $check_date)
           {
           if($thisData['StartDatum'] == date("d.m.Y"))
                {
               $headerTxt = "Heute:";
               }
            elseif($thisData['StartDatum'] == date("d.m.Y", strtotime("+1 day")))
               {
                $headerTxt = "Morgen:";
                }
            else
               {
               $headerTxt = $thisData['StartDatum'];
               }
           $calDataTxt .= "<tr><td style='  padding:4px;
                                                        backgroun-color:#213245;
                                                        background: -moz-linear-gradient(left, rgba(31,50,79,0) 40%, #213245 100%);
                                                        background: -webkit-gradient(linear, left top, right top, color-stop(4%,rgba(31,50,79,0)), color-stop(100%,#213245));
                                                        background: -webkit-linear-gradient(left, rgba(31,50,79,0) 40%, #213245 100%);
                                                        background: -o-linear-gradient(left, rgba(31,50,79,0) 40%, #213245 100%);
                                                        background: -ms-linear-gradient(left, rgba(31,50,79,0) 40%, #213245 100%);
                                                        background: linear-gradient(to right, rgba(31,50,79,0) 40%), #213245 100%;'>
                                                        <span style='color:".$StyleText[1].";font-weight:200;font-size:".$StyleText[3]."'>"
                                                        .$headerTxt.
                                                        "</span></td>
                                           <td style='text-align:right; width:100px; padding:4px;background-color:#213245'>"
                                                        ."<span style='color:".$StyleText[2].";font-weight:normal;font-size:".$StyleText[4]."'>"
                                                        .$tag[date("w", strtotime($thisData['StartDatum']))].
                                                        "<span>".
                                                        "</td>
                                                        </tr>
                                                        <tr>
                                                        <th colspan='2' style='text-align:left;padding-left:20px;padding-right:0px;padding-bottom:10px;padding-top:0px;'>
                                                        <table style='border-spacing:0px; width:100%;padding:5px; border:1px solid #1f3247;'>";
            $check_date = $thisData['StartDatum'];
            $calDataTxt .= SetEintrag($thisData);
           }
          else
           {
           $calDataTxt .= SetEintrag($thisData);
           }
        }
     }

$calDataTxt .= "</table></th></tr></table>"; // Tabelle schließen

SetValue(CreateVariableByName($IPS_SELF, "Kalender", 3, "~HTMLBox"), $calDataTxt);

/*********** Werte in eine Datei schreiben. Ich habe keine Verwendung dafür *******/

$calDataTxt = '';

foreach($calcData as $thisData) $calDataTxt .= $thisData['StartDatum'].'>'.$thisData['shortCut'].$thisData['Beschreibung']."
";

/*

$handle = fopen("C:/IP-Symcon/Termine.txt", "w");
fwrite($handle, $calDataTxt);
fclose($handle);
*/

if($IPS_SENDER == "Execute")
{
    echo $calDataTxt;
}

//***************************************************************************************************

function CreateVariableByName($id, $name, $type, $profile = "")
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    return $vid;
}



function SetEintrag($thisData)
{
    global $tag, $SC_Farbe, $deco, $StyleText;
    if($thisData['StartZeit'] == "00:00")
        {
        if($thisData['StartDatum'] == $thisData['EndeDatum'])$thisData['StartZeit']="Ganztägig";
        else $thisData['StartZeit']="bis ".substr($tag[date("w", strtotime($thisData['EndeDatum']))],0,2).", ".$thisData['EndeDatum'];
        }
    else $thisData['StartZeit'] .= " - ".$thisData['EndeZeit']." Uhr";
    if($thisData['StartDatum'] == date("d.m.Y"))
    {
        return "<tr><td><span style='font-weight:normal;font-size:".$StyleText[5].";text-decoration:".$deco.";;color:".$SC_Farbe[$thisData['shortCut']]."'>".$thisData['Beschreibung']."</span></td>
                        <td style='text-align:right;'>
                        <span style='font-weight:normal;font-size:".$StyleText[5].";text-decoration:".$deco.";color:".$SC_Farbe[$thisData['shortCut']]."'>".$thisData['StartZeit']."</span></td></tr>";
    }
    else
    {
        return "<tr><td><span style='font-weight:normal;font-size:".$StyleText[5].";color:".$SC_Farbe[$thisData['shortCut']]."'>".$thisData['Beschreibung']."</span></td>
                        <td style='text-align:right'><span style='font-weight:normal;font-size:".$StyleText[5].";color:".$SC_Farbe[$thisData['shortCut']]."'>".$thisData['StartZeit']."</span></td></tr>";
    }

}
?>

Beachte:
require_once „Google_Kalender_Funktionen.ips.php“; '== das Skript zu 1. !!!

Gruß

Swifty

Hallo,

dein Script zu 1. hatte ich auch schon getestet. Allerdings wusste ich noch nicht, wie ich die Daten verarbeiten sollte, da die Termin ja nicht mehr chronologisch ausgelesen werden. Bei mir werden immer alle ganztägigen zuerst angezeigt, auch die von den nächsten Tagen. Ich weiss nicht, ob das mit der alten API auch schon so war.

Ich benötige eigentlich ein XML um das mit den weiteren Scripten die ich für den Designer habe weiter zu benutzen.

Dein 2. Script müsste ich nochmal testen.

Danke nochmal,
Doc

Hallo…

das Geheimnis liegt hier: „usort($Ergebnis, ‚DateCompare‘);“ …

Ich habe mal im Script 1 etwas ergänzt. Jetzt gibt die Funktion alles in der richtigen Reihenfolge zurück. Vorher hatte das der obige Befehl im Script 2 übernommen … :smiley:

Gruß

Swifty

PS: Bezüglich XML kann ich Dir leider nicht weiterhelfen.

Hallo Swifty,

habe ich das mal so von dir übernommen und funktioniert soweit.

Ich habe aber das Problem, das du ja für die unterschiedlichen Farben der Kalendereinträge auch unterschiedliche Kalender verwendest.
Ich habe bei mir alles in einem Kalender und würde das auch gerne beibehalten. In dem alten XML-Script wurden die unterschiedlichen Farben durch Schlüsselwörter wie „Geburtstag“, „Tonne“, usw. bestimmt.

Hast du eine Idee, wie man das in deinem Script auch umsetzten könnte?

Grüße,
Doc

Hallo…

denkbar währe folgender Ansatz:

Die Variablen $calcData (Zeile 58) beinhaltet ja ein Array, in dem für jedes Ereignis ein Datensatz in folgender Form vorliegt:

[0] => Array
(
[StartDatum] => 29.11.2014
[StartZeit] => 00:00
[EndeDatum] => 29.11.2014
[EndeZeit] => 00:00
[Beschreibung] => Gelbe Tonne
[Ort] =>
[shortCut] => 0
)

[1] =&gt; Array
    (
        [StartDatum] =&gt; 03.12.2014
        [StartZeit] =&gt; 00:00
        [EndeDatum] =&gt; 03.12.2014
        [EndeZeit] =&gt; 00:00
        [Beschreibung] =&gt; Geburtstag Frau Mustermann
        [Ort] =&gt; 
        [shortCut] =&gt; 0
    )

Du könntest im obigen Skript nach der Zeile „usort($calcData, ‚DateCompare‘);“ (ca. Zeile 61) eine Foreach-Schleife einbauen und darin für jedes Ereignis in $calcData die Beschreibung analysieren und sodann den ShortCut entsprechend anpassen.
In der Art: Wenn Beschreibung „Tonne“ enthält, dann ShortCut=1 … wenn Beschreibung "Geburtstags enthält, dann shortCut=2 u.a.w.

Gruß

Swifty

Hallo alle zusammen,

ich habe gerade in diesem Thread gesehen das hier auch schon an einer Lösung gearbeitet wird.
Ich bin auch schon seit ein paar Tagen damit beschäftigt meine Google-Scripte (die alten sind ja mit der Zend-Classe)
umzusetzen.

Mein Vorschlag:

Sollen wir nicht ein neuen Thread aufmachen (z.B. Google-Calender Scripe) wo wir alle funktionierenden Scripte
sammeln und auch aktuell halten? Und eventuell diesen Thread als Diskussion und Fragen zu den Scripten?

Dann könnten wir den alten Thread von mir für Termine eintragen löschen oder schliessen.

Ich denke das macht mehr Sinn als wenn wir alle Einzelkämpfer sind. :smiley:

Ich habe das hier mal vorbereitet.

Meine Unterstützung hast du!
macht Sinn

Super! Machen wir das so.
Las uns meinen alten Thread einfach nur schließen.
Dann geht da nichts verloren.

Ich denke das ich irgendwann am WE oder nächste Woche meine alten Scripte überarbeitet habe.

Ich mache im ersten Post bei Zeiten noch mal ein paar Screenshots zur Dokumentation rein.
Beim anlegen eines Projektes sind einige Stolpersteine die umschifft werden müssen!