Scripte für den Google Kalender API V3

Ich hoffe das hilft etwas. Gemacht habe ich das auch noch nicht.

Bitte beachte:

File attachments for the event. Currently only Google Drive attachments are supported.
In order to modify attachments the supportsAttachments request parameter should be set to true.

There can be at most 25 attachments per event,

Danke für den Link. Das sieht ja ganz gut aus, nur muss ich das dann noch nach Delphi übersetzen. Aber das ist dann wahrscheinlich nur eine Fleißsache.

Hallo Leute.

Ich versuche grad, mit der Anleitung der ersten Posts den Kalender in min IPS aufzunehmen.

Leider hat sich alleine bei der Oberfläche von Google schon ziemlich viel geändert, sodass ich schon bei den ganzen Daten (EMail / ID usw) ins Stocken gerate… Es sieht halt einfach total anders aus und ich kann zB die EMail Adresse des Client
nicht finden…

Kann mir da evtl jemand helfen??

Kannst Du mir mal sagen bei welchem Schritt Du gerade hängst?

Hi.
Scheinbar habe ich jetzt irgendwie doch die richtigen Daten eingetragen.

Wenn ich jetzt aber dein Ausleseskript laufen lasse, kommt ein Fehler der sagt, das es ‚Google_Auth_AssertionCredentials‘ nicht bei www.googleapis.com gibt…

Muss man da was aktualisieren im Skript?

Gesendet von meinem SM-T560 mit Tapatalk

Ich vermute stark, dass du nicht die Version 1.1 geladen hast, sondern die aktuelle.

Hatte das gleiche Problem :wink:
Und ja, die Anleitung ist nicht eindeutig, welche Werte man als ID und Email eintragen muss (im Bezug auf die aktuelle Google Seite)

Meinst du V1.1 von der Google API ?
Ist mir nicht aufgefallen, dass man die nehmen soll…

Ist es da egal welche 1.1.xxxx ?

Ja genau, die meine ich. Steht aber im ersten Thread :slight_smile: Ich hatte im drop-down einfach die 1.1 gewählt und dort die letzte genommen.

Läuft alles :slight_smile:

Läuft jetzt.

Hab die 1.1.6 geladen, im Skript den Ort für autoload angepasst und passt!!

Danke!!

Jetzt noch das Erscheinungsbild anpassen und gucken, was hier sonst noch für Skripte herumschwirren…

ich habs bisher auch nur rudimentär eingebaut.
Sprich die Skripte laufen im Prinzip.

Da wir mehrere Kalender verwenden, habe ich noch eine Variable zur Kalender Auswahl hinzugefügt.
Ferner habe ich die in allen Skripten wiederkehrenden notwendigen Eingaben in ein separates Skript ausgelagert. Somit müssen die Daten nur an einer Stelle eingepflegt werden.

Gruß
Maze

PS: Guten Rutsch alle Zusammen :slight_smile:

Meiner Frau gefällt nicht, das man in der Listenansicht keinen Wochentag sieht.
Hab ich evtl. ne Idee, wie ich Datum und Uhrzeitspalte noch den Wochentag einfügen könnte?
Dann bräuchte ich dieMonatsübersicht nicht mehr…

Hallo,

ich muss sagen, ich bin auch zu dämlich.

Ich hänge an folgenden Punkten.

  1. wo kann ich die API Version auswählen ? Ich habe einfach die vorgeschlagene genommen.
  2. Die Client ID meines Dienstkontos ist ein Zeichencode ohne @ und/oder apps.googelusercontent. Einfach nur eine Zeichenreihenfolge. Ist das richtig oder soll ich etwas ergänzen ?
  3. Beim Monatskalender Script bekomme ich folgende Fehlermeldung, die besagt das wohl das meine p12 datei nicht gelesen werden kann. Warum ? Ist dies das Ergebnis der falschen API Version aus Punkt 1 ??
Warning:  file_get_contents(/var/lib/symcon/scripts\certificates\ips-cal-xxxxxxxxxxx.p12): failed to open stream: No such file or directory in /var/lib/symcon/scripts/37717.ips.php on line 58

Fatal error:  Uncaught exception 'Google_Auth_Exception' with message 'Unable to parse the p12 file.  Is this a .p12 file?  Is the password correct?  OpenSSL error: ' in /var/lib/symcon/scripts/google-api-php-client/src/Google/Signer/P12.php:51
Stack trace:
#0 /var/lib/symcon/scripts/google-api-php-client/src/Google/Auth/AssertionCredentials.php(130): Google_Signer_P12->__construct(false, 'notasecret')
#1 /var/lib/symcon/scripts/google-api-php-client/src/Google/Auth/AssertionCredentials.php(107): Google_Auth_AssertionCredentials->makeSignedJwt(Array)
#2 /var/lib/symcon/scripts/google-api-php-client/src/Google/Auth/OAuth2.php(307): Google_Auth_AssertionCredentials->generateAssertion()
#3 /var/lib/symcon/scripts/google-api-php-client/src/Google/Auth/OAuth2.php(234): Google_Auth_OAuth2->refreshTokenWithAssertion()
#4 /var/lib/symcon/scripts/google-api-php-client/src/Google/Service/Resource.php(208): Google_Auth_OAuth2->sign(Object(Google_Http_Request))
#5 /var/lib/symcon/scripts/google-api-php-client/src/Google/Service/Calend in /var/lib/symcon/scripts/google-api-php-client/src/Google/Signer/P12.php on line 51

Hmmm, hat keiner eine Idee ?

Gugst Du das!

Ich habe mich auch gerade an der Anleitung versucht. Da die Anleitung vorne nicht mehr aktuell ist bzw. muss man andere Schritte ausüben, hapert es an der Kontoerstellung. Muss ich jetzt unter Zugangsdaten->Anmeldedaten erstellen->OAuth-Client erstellen oder Dienstkontoschlüssel. Es ist etwas Verwirrend da vorne auf den Grafiken die Rede von Dienstkonto ist aber auch von OAuth, es aber nicht mehr unter OAuth-Client ID zu finden ist.

Hallo alle zusammen,

aus gegebenen Anlass hier nochmals die Ordner auf meiner Symbox.

Ich habe nochmals die von mir runtergeladenen Google Dateien Gezipt und hier angehangen.

google-api-php-client.zip (903 KB)

Ich hoffe das hilft.

Hallo alle zusammen,

hier nochmal ein Beispiel-Script von mir.


<?
/** GoogleCalendarRead
* Martin Heinzel - 03.02.2016
* Version: 1.0
*
* Beschreibung:
* Mit diesem Script werden die nächsten drei Termine aus dem Google Kalender
* gelesen.
*
* Änderungen
* ----------
*
* tt.mm.jjjj von Version x.x -> y.y
*
* Beschreibung:
*
*/

/**
* Variablen Deklaration --------------------------------------
*/

/**
* Variablen
*/
$terminHeute    		= "";
$terminMorgen   		= "";

//* User-Daten
$Client_ID        	=  "blabla.apps.googleusercontent.com";
$EMail 	          	=  "blupblup@developer.gserviceaccount.com";
$key_file_location   =  IPS_GetKernelDir()."scripts/certificates/Kalender-af58d75d650b.p12";
$Calender_ID			= 'derknaller@googlemail.com';

/**
* Variablen Deklaration ENDE ---------------------------------
*/

//* benötigte Funktionen/Klassen
set_include_path(IPS_GetKernelDir()."scripts\\google-api-php-client\\src");
require_once 'google-api-php-client/src/Google/autoload.php';

/**
* Main --------------------------------------------------------
*/

//* Die Verbindung zum Kalender aufbauen
$client = new Google_Client();
$client->setApplicationName("Kalender");
$service = new Google_Service_Calendar($client);
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials($EMail, array('https://www.googleapis.com/auth/calendar'), $key);
$client->setAssertionCredentials($cred);

/**
* Event lesen
*/

//* Event ab dem aktuellem Datum
$start_date = date("Y-m-d")."T00:00:00+01:00";

//* Übergeben der Daten der Suchanfrage
$optParams = array('singleEvents' 	=> True,
						 'timeMin' 			=> $start_date,
					    'orderBy' 			=> 'startTime',
					    'maxResults' 	   => 3);

//* Die Suchanfrage ausführen
$events = $service->events->listEvents($Calender_ID, $optParams);

//* Initialisieren der Variablen
$event_display = "";

//* Das Ergebnis durchsuchen
foreach ($events->getItems() as $event)
{
	//* Auslesen der Startzeit
	If($event->getStart()->dateTime <> "")
	{
   	$Date_Time = $event->getStart()->dateTime;
	}
	else
	{
		$Date_Time = $event->getStart()->date;
	}

	//* Zerlegen der Startzeit
	if(strpos($Date_Time, "T")>0)
	{
		$arrDate_Time 	= 	explode("T", $Date_Time);
		$Date 			=  $arrDate_Time[0];
		$arrTime 		=  explode("+", $arrDate_Time[1]);
		$Time          =  substr($arrTime[0], 0, 8);
	}
	else
	{
	   $Date =  $Date_Time;
	   $Time =  "               ";
	}

	$arrDate =  explode("-", $Date);
	$title 	= utf8_decode($event->getSummary());
   $event_display .= $arrDate[2].".".$arrDate[1].".".$arrDate[0]." ".$Time."   ".$title."\r";


	$DatumTermin     =  $Date;
	$DatumHeute 	  =  date("Y-m-d");
   $morgen 			  =  mktime(0, 0, 0, date("m"), date("d")+1, date("Y"));
	$DatumMorgen     =  date("Y-m-d", $morgen);

	//* Anzeigen
   if(($DatumTermin == $DatumHeute) or
	   ($DatumTermin == $DatumMorgen))
	{
	
	   //ablegen Termin Heute
      if($DatumTermin == $DatumHeute)
		{
			$terminHeute = $title;
		}

	   //ablegen Termin Morgen
      if($DatumTermin == $DatumMorgen)
		{
			$terminMorgen = $title;
		}

	  //* Harmonisieren
		$title_harm =  strtolower($title);
		if(!(strpos($title_harm, "graue tonne") === false))
		{
			SetValue(CreateVariableByName($_IPS['SELF'], "graueTonne", 0), true);
		}

      if(!(strpos($title_harm, "braune tonne") === false))
		{
         SetValue(CreateVariableByName($_IPS['SELF'], "brauneTonne", 0), true);
		}

      if(!(strpos($title_harm, "blaue tonne") === false))
      {
         SetValue(CreateVariableByName($_IPS['SELF'], "blaueTonne", 0), true);
		}

      if(!(strpos($title_harm, "gelber sack") === false))
      {
         SetValue(CreateVariableByName($_IPS['SELF'], "gelberSack", 0), true);
		}
	 }
}

SetValue(CreateVariableByName($_IPS['SELF'], "Kalender", 3), $event_display);

/**
* Main ENDE ---------------------------------------------------
*/

/**
* Funktionen --------------------------------------------------
*/

function CreateVariableByName($id, $ident, $type) {
    global $_IPS;
    $vid = @IPS_GetObjectIDByIdent($ident, $id);
    if($vid === false) {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $ident);
        IPS_SetIdent($vid, $ident);
        IPS_SetInfo($vid, "This variable was created by script #".$_IPS['SELF']);
    }
    return $vid;
}

/**
* Funktionen ENDE ----------------------------------------------
*/

?>


Sorry in dem Script war noch alter Mist von mir drin!


<? 
/** GoogleCalendarRead 
* Martin Heinzel - 03.02.2016 
* Version: 1.0 
* 
* Beschreibung: 
* Mit diesem Script werden die nächsten drei Termine aus dem Google Kalender 
* gelesen. 
* 
* Änderungen 
* ---------- 
* 
* tt.mm.jjjj von Version x.x -> y.y 
* 
* Beschreibung: 
* 
*/ 

/** 
* Variablen Deklaration -------------------------------------- 
*/ 

/** 
* Variablen 
*/ 
$terminHeute            = ""; 
$terminMorgen           = ""; 

//* User-Daten 
$Client_ID            =  "blabla.apps.googleusercontent.com"; 
$EMail                   =  "blupblup@developer.gserviceaccount.com"; 
$key_file_location   =  IPS_GetKernelDir()."scripts/certificates/Kalender-af58d75d650b.p12"; 
$Calender_ID            = 'derknaller@googlemail.com'; 

/** 
* Variablen Deklaration ENDE --------------------------------- 
*/ 

//* benötigte Funktionen/Klassen 
set_include_path(IPS_GetKernelDir()."scripts\\google-api-php-client\\src"); 
require_once 'google-api-php-client/src/Google/autoload.php'; 

/** 
* Main -------------------------------------------------------- 
*/ 

//* Die Verbindung zum Kalender aufbauen 
$client = new Google_Client(); 
$client->setApplicationName("Kalender"); 
$service = new Google_Service_Calendar($client); 
$key = file_get_contents($key_file_location); 
$cred = new Google_Auth_AssertionCredentials($EMail, array('https://www.googleapis.com/auth/calendar'), $key); 
$client->setAssertionCredentials($cred); 

/** 
* Event lesen 
*/ 

//* Event ab dem aktuellem Datum 
$start_date = date("Y-m-d")."T00:00:00+01:00"; 

//* Übergeben der Daten der Suchanfrage 
$optParams = array('singleEvents'     => True, 
                         'timeMin'             => $start_date, 
                        'orderBy'             => 'startTime', 
                        'maxResults'        => 3); 

//* Die Suchanfrage ausführen 
$events = $service->events->listEvents($Calender_ID, $optParams); 

//* Initialisieren der Variablen 
$event_display = ""; 

//* Das Ergebnis durchsuchen 
foreach ($events->getItems() as $event) 
{ 
    //* Auslesen der Startzeit 
    If($event->getStart()->dateTime <> "") 
    { 
       $Date_Time = $event->getStart()->dateTime; 
    } 
    else 
    { 
        $Date_Time = $event->getStart()->date; 
    } 

    //* Zerlegen der Startzeit 
    if(strpos($Date_Time, "T")>0) 
    { 
        $arrDate_Time     =     explode("T", $Date_Time); 
        $Date             =  $arrDate_Time[0]; 
        $arrTime         =  explode("+", $arrDate_Time[1]); 
        $Time          =  substr($arrTime[0], 0, 8); 
    } 
    else 
    { 
       $Date =  $Date_Time; 
       $Time =  "               "; 
    } 

    $arrDate =  explode("-", $Date); 
    $title     = utf8_decode($event->getSummary()); 
   $event_display .= $arrDate[2].".".$arrDate[1].".".$arrDate[0]." ".$Time."   ".$title."\r"; 
} 

SetValue(CreateVariableByName($_IPS['SELF'], "Kalender", 3), $event_display); 

/** 
* Main ENDE --------------------------------------------------- 
*/ 

/** 
* Funktionen -------------------------------------------------- 
*/ 

function CreateVariableByName($id, $ident, $type) { 
    global $_IPS; 
    $vid = @IPS_GetObjectIDByIdent($ident, $id); 
    if($vid === false) { 
        $vid = IPS_CreateVariable($type); 
        IPS_SetParent($vid, $id); 
        IPS_SetName($vid, $ident); 
        IPS_SetIdent($vid, $ident); 
        IPS_SetInfo($vid, "This variable was created by script #".$_IPS['SELF']); 
    } 
    return $vid; 
} 

/** 
* Funktionen ENDE ---------------------------------------------- 
*/ 

?>

Hay Martin,

dein letzer Skript funktioniert und als Textbox auch alles sichtbar. Da habe ich aber noch drei Fragen:

  1. wie müsste ich den Skript verändern, um mir mehr (z.B. 10 Termine) anzeigen zu lassen?
  2. wie kann ich mir zusätzlich die Wochentage anzeigen lassen? -> //habe ich mit deinem Hinweis aus dem anderen Thema gelöst//
  3. wie kann ich einen 2. Kalender in einem Skript auslesen lassen?

Danke vorab.

Gruß oekomat

Probier das mal. Damit kannst Du mehr als einen Kalender einlesen.


<? 
/*============================================================= 
skrGoogleKalenderLesen - Martin Heinzel - 01.05.2012 
Version: 2.1 

Beschreibung: 
Mit diesem Script werden die nächsten "X" Termine aus den Google Kalendern 
gelesen. 

Änderungen 
---------- 

07.06.2012 von Version 0.1 -> 1.0 

Beschreibung: 

Erste Version des Scriptes. Geändert wurde: 

-    Es werden nun Start und Endzeit angegeben. 
-    Bei ganztägigen Terminen steht anstelle der Zeit der Text „Ganztägig“ 
-    Vor dem Termin steht in eckigen Klammern der Kalender, aus dem der Termin ist. 
   Die Anzahl der angezeigten Zeichen des Kalendernamens kann eingestellt werden. 

27.11.2014 von Version 1.0 -> 2.0 

Beschreibung: 

Script wurde angepasst auf die Google Kalender API V3 

20.04.2017 von Version 2.0 -> 2.1 

Beschreibung: 

Script wurde angepasst auf IPS V4.x und Symbox/Raspi 

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

//#################################### Bitte einstellen ##################################################################### 

$Client_ID            =  "blabla.apps.googleusercontent.com";  
$EMail                =  "blupblup@developer.gserviceaccount.com";  
$key_file_location    =  IPS_GetKernelDir()."scripts/certificates/Kalender-af58d75d650b.p12";  
$calendar_login       =    array('irgendwas@googlemail.com', 
                                 'schaun_wir_mal0@group.calendar.google.com'); 
									   
$message_count        = 10;                            //Anzahl der Meldungen 
$whoCounts            = 3;                             //Anzahl der dargestellten Zeichen des Kalenders 

//########################################################################################################################### 


// Variablen Deklaration -------------------------------------- 

// Variablen 
//-------------- 

$StartTimes       =  array(); 
$EndTimes         =  array(); 
$Titles           =  array(); 

//------------------------------------------------------------- 

//benötigte Funktionen/Klassen 
set_include_path(IPS_GetKernelDir()."scripts\\google-api-php-client\\src");  
require_once 'google-api-php-client/src/Google/autoload.php';  

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

// Die Verbindung zum Kalender aufbauen 
$client = new Google_Client(); 
$client->setApplicationName("Kalender"); 
$service = new Google_Service_Calendar($client); 
$key = file_get_contents($key_file_location); 
$cred = new Google_Auth_AssertionCredentials($EMail, array('https://www.googleapis.com/auth/calendar'), $key); 
$client->setAssertionCredentials($cred); 

// Event lesen 
//============== 

// Die einzelnen Kalender abfragen 
foreach ($calendar_login as $Calender_ID) 
{ 

// Übergeben der Daten der Suchanfrage 
$optParams = array('singleEvents'     => True, 
                         'timeMin'             => (new DateTime())->format(DateTime::RFC3339), 
                        'orderBy'             => 'startTime', 
                        'maxResults'        => $message_count); 

// Die Suchanfrage ausführen 
$events = $service->events->listEvents($Calender_ID, $optParams); 

    // Das Ergebnis durchsuchen 
    foreach ($events->getItems() as $event) 
    { 
        // Auslesen der Startzeit 
        If($event->getStart()->dateTime <> "") 
        { 
           $Date_Time_Start      = $event->getStart()->dateTime; 
           $Date_Time_End         = $event->getEnd()->dateTime; 
        } 
        else 
        { 
            $Date_Time_Start      = $event->getStart()->date; 
           $Date_Time_End         = $event->getEnd()->date; 
        } 

      $StartTimes[]     = EventTime_to_TimeStamp($Date_Time_Start); 
        $EndTimes[]     = EventTime_to_TimeStamp($Date_Time_End); 

        if(count($calendar_login) > 1) 
        { 
           $who           = utf8_decode($event->getOrganizer()->displayName); 
           $who_substr    = substr($who, 0, $whoCounts); 
            $Titles[]          = "[".$who_substr."] ".utf8_decode($event->getSummary()); 
        } 
        else 
        { 
            $Titles[]          = utf8_decode($event->getSummary()); 
        } 
    } 
} 

array_multisort($StartTimes,SORT_ASC,$Titles,$EndTimes);    //Arrays sortieren 
$count   = count($StartTimes);                                    //Anzahl der Termine 

//Max Schleifenzählers 
if($count <= $message_count){    $i = $count; } 
else                        {    $i = $message_count; } 
$sz      = 0;                                                             //Schleifenzähler 

//Terminanzeige zusammenbauen 
$event_display = "";                                        // Initialisieren der Anzeige 

while($sz < $i) 
{ 
    //Abfrage ganztägiger Termin 
    if(Date("H:i:s",(int)$StartTimes[$sz]) === "00:00:00") 
    { 
        $event_display .= Date("d.m.Y",(int)$StartTimes[$sz])." ---  Ganztägig  ---   ".$Titles[$sz]."
"; 
    } 
    else 
    { 
        $event_display .= Date("d.m.Y H:i:s",(int)$StartTimes[$sz])." - ".Date("H:i:s",(int)$EndTimes[$sz])."   ".$Titles[$sz]."
"; 
    } 
    $sz++; 
} 

//echo $event_display; 
SetValue(CreateVariableByName($IPS_SELF, "Kalender", 3, "~TextBox"), $event_display); 

//------------------------- Main ENDE -------------------------- 

//------------------------ Funktionen ------------------------- 

function CreateVariableByName($id, $ident, $type) {  
    global $_IPS;  
    $vid = @IPS_GetObjectIDByIdent($ident, $id);  
    if($vid === false) {  
        $vid = IPS_CreateVariable($type);  
        IPS_SetParent($vid, $id);  
        IPS_SetName($vid, $ident);  
        IPS_SetIdent($vid, $ident);  
        IPS_SetInfo($vid, "This variable was created by script #".$_IPS['SELF']);  
    }  
    return $vid;  
}  

/** 
 * Returns a timestamp of the Google event Time 
 * 
 * @param  string $eventTime The Google event Time in "2010-06-11T07:30:00.000-07:00" 
 * @return int Timestamp of the Google event Time 
 */ 
function EventTime_to_TimeStamp($eventTime) 
{ 

        // Zerlegen der Startzeit 
        if(strpos($eventTime, "T")>0) 
        { 
            //Datum 
            $arrDate_Time     =     explode("T", $eventTime); 
            $Date             =  $arrDate_Time[0]; 
            $arrDate         =  explode("-", $Date); 
            $term_jahr     =  (int)$arrDate[0]; 
            $term_monat    =     (int)$arrDate[1]; 
            $term_tag      =  (int)$arrDate[2]; 

            //Uhrzeit 
            $arrTime         =  explode("+", $arrDate_Time[1]); 
            $Time          =  substr($arrTime[0], 0, 8); 
            $arrTimeVal        =  explode(":", $Time); 
            $term_Stunde   =  (int)$arrTimeVal[0]; 
            $term_Minute   =  (int)$arrTimeVal[1]; 
            $term_Sekunde  =  (int)$arrTimeVal[2]; 

        } 
        else 
        { 
            //Datum 
            $arrDate         =  explode("-", $eventTime); 
            $term_jahr     =  (int)$arrDate[0]; 
            $term_monat    =     (int)$arrDate[1]; 
            $term_tag      =  (int)$arrDate[2]; 

            //Uhrzeit 
            $term_Stunde   =  0; 
            $term_Minute   =  0; 
            $term_Sekunde  =  0; 
        } 

    return mktime($term_Stunde, $term_Minute, $term_Sekunde, $term_monat, $term_tag, $term_jahr); 
} 

//--------------------- Funktionen ENDE ------------------------ 

?>