Scripte für den Google Kalender API V3

Hallo,

ist es auch möglich immer den nächsten anstehenden Termin zu laden?

Ja das geht, dazu musst Du den Parameter "$message_count " auf 1 setzen.

Hallo ich habe gestern IPS aktualisiert und jetzt bekomme ich folgenden Fehler.
Was kann das sein. ?

Fatal error: Uncaught exception ‚Google_Exception‘ with message ‚The Google PHP API library needs the openssl PHP extension‘ in C:\IP-Symcon\scripts\google-api-php-client\src\Google\Signer\P12.php:36
Stack trace:
#0 C:\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\AssertionCredentials.php(130): Google_Signer_P12->__construct(‚0???0??z??*?..‘, ‚notasecret‘)
#1 C:\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\AssertionCredentials.php(107): Google_Auth_AssertionCredentials->makeSignedJwt(Array)
#2 C:\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\OAuth2.php(307): Google_Auth_AssertionCredentials->generateAssertion()
#3 C:\IP-Symcon\scripts\google-api-php-client\src\Google\Auth\OAuth2.php(234): Google_Auth_OAuth2->refreshTokenWithAssertion()
#4 C:\IP-Symcon\scripts\google-api-php-client\src\Google\Service\Resource.php(208): Google_Auth_OAuth2->sign(Object(Google_Http_Request))
#5 C:\IP-Symcon\scripts\google-api-php-client\src\Google\Service\Calendar.php(1561): Google_Service_Resource->call('li in C:\IP-Symcon\scripts\google-api-php-client\src\Google\Signer\P12.php on line 36

Schau mal im ersten Post Punkt 14!

Hallo,
ich hatte das Problem auch mit der openssl.
Vor dem Update hat alles funktioniert und nach dem Update diese o.g. Fehlermeldung.

Die Reparatur war ja klar. Meine Frage ist jetzt:

Muss ich jetzt nach jedem Update die 2 Dateien überschreiben und die opennssl neu einbinden?

PS:
Trotzdem 1000x Danke für die Anleitung zum Auslesen der Kalender. Das ganze System wäre nur die Hälfte wert, wenn es solche Hilfe nicht gäbe. Vielen Dank!

Ja. Das ist so.

Hallo zusammen,
Dank erst mal an Martin für die tollen Skripte :slight_smile: ohne Die Anleitung wäre ich verloren gewesen… Zwei offene Fragen hätte ich.

Wenn ich das Script zum Schreiben von Terminen verwende (#3) wird ein Termin zwar eingetragen, aber beim zurücklesen mit (#2) bleibt das Feld „who“(also der Kalendername) in eckiger Klammer leer (siehe Bild „test“). Trage ich Termine vom Handy oder Google direkt ein steht da das Kürzel vom Kalender. Kann ich das beim Schreiben mit dem Script aus Beitrag (#3) auch übergeben? Im Prinzip wird doch mit der „$Calender_ID“ eindeutig festgelegt in welchen Kalender es eingetragen wird?

Die zweite Frage ist vermutlich etwas schwieriger. Ich würde gerne auch Termine löschen, wie es in der API
https://developers.google.com/google-apps/calendar/v3/reference/events/delete beschrieben ist. Darin gibt es auch das zugehörige php Beispiel.

$service->events->delete('primary', 'eventId');

Aber wie identifiziere ich einen Eintrag genau, das ich diesen auch löschen kann. Wie setzt sich den die „eventid“ zusammen? puhhh :confused: kann mir jemand einen Tip geben, wie ich heran gehen könnte? Mein Gedanke war beim Auslesen (mit #2) neben „$StartTimes,$Titles,$EndTimes,$arrStyle_akt“ einfach das Eindeutige mit in das array packen. Dann könnte ich es später wieder einfach selektieren und mit dem php schnipsel löschen.

Vielen Dank
Gruß Tom

who.jpg

Hallo zusammen, jetzt habe ich den entsprechenden Eintrag zum löschen doch gefunden.

ich habe dazu im Script (#2) von Martin unterhalb von

// Event lesen
...

// Das Ergebnis durchsuchen
    	  foreach ($events->getItems() as $event)
...

die beiden Arrays ergänzt und bei array_multisort hinzugefügt.


$ID_Eintrag[]	= $event->id; 	   // Eindeutige ID eines Kalendereintrages innerhalb einer Calender_ID
$ID_User[]        = $Calender_ID;   // zugehörige Calender ID wird gesichert


array_multisort($StartTimes,SORT_ASC,$Titles,$EndTimes,$ID_Eintrag,$ID_User);	//Arrays sortieren

Mit den beiden Arrays kann dann zu einem entsprechenden Eintrag, der Termin mit z.B…

	$service->events->delete($ID_User[1], $ID_Eintrag[1]);

…gelöscht werden

Für den fehlenden „DisplayName“ behelfe ich mir mit einem kleinem Workaround. Fehlt dieser beim Auslesen, ersetze ich ihn alternativ mit der Calender_ID, die bei mir in den Anfangsziffern nahezu gleich mit dem „DisplayNamen“ übereinstimmt.

        $who           = utf8_decode($event->getOrganizer()->displayName);
		if ($who == "") {$who = $Calender_ID;}
		$who_substr    = substr($who, 0, $whoCounts);

Vieleicht kann es noch jemand brauchen.

Grüße Tom

Besten Dank für die Info Tom.

Ich bin natürlich seid längerem wieder unterwegs
und kann momentan nicht immer sofort reagieren.

Nochmals Dankeschön!!!

Hallo,

ist das Thema

14. Aus dem alten OpenSSL Paket (Version 0.9.8zc, http://www.ip-symcon.de/service/doku...ation-v24-v25/ Dateien ssleay32.dll und libeay32.dll in den IPS Ordner (alte umbenennen)

irendwie umgehbar bzw. lösbar, dass ich nicht nach jedem Update die Dateien erneut ersetzen muss? Notfalls über ein script, dass die Dateien bei auftretendem Fehler umkopiert?

Hardlog

…warten bis IPS 4.x kommt, da sollte dieses Problem endlich der Vergangenheit angehören :slight_smile:

Oder dir selbst noch etwas scripten, was beim Ändern der Dateien automatisch kurz wartet und dann die alten Dateien wieder dort hin kopiert.

Grüße,
Chris

Danke, Chris

dann warte ich mal ab…

Gruß
hardlog

Hallo,
Ja, indem du nicht immer ein Komplettupdate machst, sondern auswählst, was upgedatet werden soll…

… das heißt?

Was soll ich denn nicht updaten?

Gruß
hardlog

Stimmt, gar nicht dran gedacht :smiley: >> Die beiden SSL Dateien werden einzeln aufgelistet im Installer/Updates, einfach davor die Haken entfernen.

> libeay32.dll
> ssleay32.dll

Grüße,
Chris

Hallo zusammen,

meiner Frau ist aufgefallen, wenn sie übers Webfront einen Termin einträgt, dieser im Google-Kalender mit einer Stunde später als Startzeit bzw. Endzeit eingetragen wird.
Ich nehm mal an, dass es an der Sommerzeit liegt.

dafür hab ich eine Änderung im Script „Termine schreiben“ vorgenommen:

Suche:

$Recur            =  GetValueInteger($id_Recur); 

davor folgendes einfügen:

$timezone = date("P");

Suche:

$start->setDateTime($StartYear."-".$StartMonth."-".$StartDay."T".$StartHour.":".$StartMinute.":00.000+01:00"); 

ersetze durch:

$start->setDateTime($StartYear."-".$StartMonth."-".$StartDay."T".$StartHour.":".$StartMinute.":00.000".$timezone);

Suche:

  $end->setDateTime($EndYear."-".$EndMonth."-".$EndDay."T".$EndHour.":".$EndMinute.":00.000+01:00"); 

ersetze durch:

$end->setDateTime($EndYear."-".$EndMonth."-".$EndDay."T".$EndHour.":".$EndMinute.":00.000".$timezone);

jetzt klappts bei mir auch mit den richtigen Start- und Endzeiten.

lg,
Christian.

Hallo Ihr Meister von IPS,
ich habe es jetzt genauso ausgeführt von Seite 1, kommt nur Fehler in Zeile 35 usw. ich denke das der erste Fehler ist das er mit dem @ Zeichen nicht klar kommt, habe es geändert in %40, geht aber genauso wenig was nun???
Ich komme nicht so richtig weiter, wollte nachdem ich immer den Kalender schön auf dem Schirm hatte es nach der blöden Änderung wieder einrichten, nachdem ich diesen Thread beobachtet hatte wie alles es so langsam hinbekommen haben.
Könnt Ihr mir helfen, wäre wirklich sehr schön.

Danke Frank

Abend Frank!

Ein paar mehr Infos könnten helfen :slight_smile: Mal den kompletten Fehler, mit Copy&Paste, in deinen Post einbauen, kann nicht schaden :wink:

Oder hast du schon mal ein wenig eingegrenzt, mit „echo“ oder „print_r“, wo das Problem liegen könnte?

Grüße,
Chris

Maybe

SSL Dateien
libeay32.dll
ssleay32.dll

Hier mal ein Listenbeispiel:

Einen kleinen Fehler hab ich noch:
Wie kriege ich den Texteintrag (speziell) wenn der Temin als ganztags deklariert ist, weiter auseinander, damit
die Ansicht / Einrückung wieder passt.

Hier der Code

<?
//Kalender
$calName = 'XXX@googlemail.com'; //Kalender
$Tage=30;

$calcData=ReadCalendar($calName, $Tage);

//usort($calcData, 'DateCompare');
//print_r($calcData);


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

//function DateCompare($a, $b)
//     {
//    if ( strtotime($a['Start']) == strtotime($b['Start']) ) return 0;
//    if ( strtotime($a['Start']) < strtotime($b['Start']) )  return -1;
//   return 1;
//    }
//
function ReadCalendar($calName, $maxDays)
    {
    require_once "google-api-php-client/src/Google/autoload.php";

    // Service Account info
    $client_id = 'XXX.apps.googleusercontent.com';
    $service_account_name = 'XXX@developer.gserviceaccount.com';
    $key_file_location = IPS_GetKernelDir()."scripts\\certificates\\Kalenderabruf.p12";

    $client = new Google_Client();
    $client->setApplicationName("Allgemein_Kalender");
    $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);


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

//HTML Class

class HTML {

  const CRLF = "
";
  const colClassName = '_col_';

  /*
  //* Erstellt HTML-Code für ein Tabelle mit Werten
  // $name = className für table
  // $titleArr = array('Spaltenname1','Spaltenname2',..)
  // $dataArr = array(
  //*    array('WertZeile1Spalte1','WertZeile1Spalte2',..)
  //* dataArr = array(
  //*   'spalte1' => 'spalte2',
  // )
  //
  public static function Table($name,array $titleArr,array $dataArr) {
    $cn = self::colClassName;
    $html = '<table class="'.$name.'">'.self::CRLF.'<tr>';
    foreach($titleArr as $i => $title) {
      $html .= '<th class="'.$cn.$i.'">'.$title.'</th>';  //Überschrift
    }
    $html .= '</tr>'.self::CRLF;
    if(! empty($dataArr)) {
      foreach($dataArr as $k => $subArr) {
        $html .= '<tr>'.self::CRLF;
        if(is_array($subArr)) {
          foreach($subArr as $i => $colValue) {
            $html .= '<td class="'.$cn.$i.'">'.$colValue.'</td>';
          }
        }
        else {
          $html .= '<td class="'.$cn.'0">'.$k.'</td><td class="'.$cn.'1">'.$subArr.'</td>';
         }
        $html .= '</tr>'.self::CRLF;
      }
    }
    $html .= '</table>'.self::CRLF;
    return $html;
  }
}


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

    $c=0;
    foreach ($events->getItems() as $event)
                {
            $Ergebnis[$c]['Start'] = fmt_gdate($event->getStart());
            $Ergebnis[$c]['Ende'] = fmt_gdate($event->getEnd());
                $Ergebnis[$c]['Beschreibung'] = iconv('UTF-8', 'ISO-8859-1',$event->getSummary());
                $Ergebnis[$c]['Ort'] = iconv('UTF-8', 'ISO-8859-1',$event->getLocation());

                $c++;
                }

    echo HTML::Table('Tab',array('Start','Ende','Beschreibung','Ort'),$Ergebnis);
   }


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

?>

Sieht dann wie folgt aus:

Übersicht.JPG