Scripte für den Google Kalender API V3

Hallo,

nach über einem Jahr absolut zuverlässiger Funktion hat mein Kalender seinen Dienst eingestellt. Im Februar das erste Mal. Ich habe dann den Fehler gesucht und nichts gefunden. Überraschenderweise funktionierte der Kalender dann 4 Wochen später wieder, allerdings war das Glück nur von kurzer Dauer. Ein paar tage später ging dann wieder nix mehr.
Jetzt brauch ich eure Hilfe, ich krieg es wohl nicht alleine hin.
Hier die Fehlermeldung:

-----cut--------------------------------------------------------------------

13.04.2016 21:18:01*| ExecuteThreadID #4*| [google_calendar\google_calendar_v3_schablone] =
Fatal error: Uncaught exception ‚Google_Auth_Exception‘ with message ‚Error refreshing the OAuth2 token, message: ‚{
„error“ : „invalid_grant“,
„error_description“ : „Invalid JWT: Token must be a short-lived token and in a reasonable timeframe“
}‘‘ in C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Auth\OAuth2.php:364
Stack trace:
#0 C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Auth\OAuth2.php(315): Google_Auth_OAuth2->refreshTokenRequest(Array)
#1 C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Auth\OAuth2.php(240): Google_Auth_OAuth2->refreshTokenWithAssertion()
#2 C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Service\Resource.php(217): Google_Auth_OAuth2->sign(Object(Google_Http_Request))
#3 C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Service\Calendar.php(1634): Google_Service_Resource->call(‚list‘, Array, ‚Google_Service_…‘)
#4 C:\IP-Symcon\scripts\59216.ips.php(88): Google_Service_Calendar_Events_Resource->listEvents(‚user@gmai…‘, in C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Auth\OAuth2.php on line 364
Abort Processing during Fatal-Error: Uncaught exception ‚Google_Auth_Exception‘ with message ‚Error refreshing the OAuth2 token, message: ‚{
„error“ : „invalid_grant“,
„error_description“ : „Invalid JWT: Token must be a short-lived token and in a reasonable timeframe“
}‘‘ in C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Auth\OAuth2.php:364
Stack trace:
#0 C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Auth\OAuth2.php(315): Google_Auth_OAuth2->refreshTokenRequest(Array)
#1 C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Auth\OAuth2.php(240): Google_Auth_OAuth2->refreshTokenWithAssertion()
#2 C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Service\Resource.php(217): Google_Auth_OAuth2->sign(Object(Google_Http_Request))
#3 C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Service\Calendar.php(1634): Google_Service_Resource->call(‚list‘, Array, ‚Google_Service_…‘)
#4 C:\IP-Symcon\scripts\59216.ips.php(88): Google_Service_Calendar_Events_Resource->listEvents(‚user@gmail…‘,
Error in Script C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Auth\OAuth2.php on Line 364

--------------------cut------------------------------

Hallo teebeutel,

bei mir funktioniert das „Lesen-Script“ wie immer.
Welches Script funktioniert denn nicht?

Dies Script ist es

?


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

$Client_ID            =  "meine client id";
$EMail                   =  "meine client mail adresse";
$key_file_location   =  IPS_GetKernelDir()."scripts\\google-api-php-client-master\\mykey.p12";
$calendar_login         =    array('mailadresse gmail');
//                                     'zahlenkolonne');

$message_count        = 15;                            //Anzahl der Meldungen
$whoCounts           = 0;                             //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");
//geändert 160307 ansgar
//require_once 'google-api-php-client-master/autoload.php';
set_include_path(IPS_GetKernelDir()."scripts\\google-api-php-client-master\\src");
require_once 'google-api-php-client-master/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.",(int)$StartTimes[$sz])."                "  .$Titles[$sz]."
";
    }
    else
    {
        $event_display .= Date("d.m. H:i   ",(int)$StartTimes[$sz])."  ".$Titles[$sz]."
";
    }
    $sz++;
}

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

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

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

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

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

?>

Hallo zusammen,

vielen Dank für das Howto und die Skripte. Ich habe es der Reihe nach eingerichtet und das auslesen funktioniert :slight_smile:
Was leider nicht klappt ist das auslesen mit Hilfe der „Keywords“ :frowning:
Wenn ich das richtig verstehe, musste das „Termine auslesen mit zusätzlicher HTML-Ausgabe Script“ doch nur die Termine auslesen, in denen die definierten Keywords drin sind. Bei mir ignoriert das Script anscheinend die definierten Keywords.
Meine (ganztägigen) Termine heißen:
Bioabfall: Braune Tonne
Papierabfuhr: Blaue Tonne
Gelbe Tonne / gelber Sack
Restmüllabfuhr: Graue Tonne

Mit

$Keywords = array(„Braune“);

sollte das Script doch nur die Termine „Bioabfall: Braune Tonne“ auslesen, oder? Bei mir landen jedoch alle Termine in der Variable :confused:

Hat jemand einen Tipp für mich?

Danke und Gruß
Adam

Nein. Das ist nicht so. Die Keywords werden in der HTML Ausgabe farblich markiert.

Gesendet von meinem SM-G930F mit Tapatalk

@teebeutel
Mich hat es von den Füssen gerissen. Ich liege momentan mit 39 Fieber im Bett. Ich habe Dich nicht vergessen.

Gesendet von meinem SM-G930F mit Tapatalk

hmmm, das erklärt einiges :cool:

Ich wollte mir (am Tag vor der jeweiligen Abholung) eine Nachricht auf den TV schicken(enigma2). Dazu brauche ich den nächsten Termin der jeweiligen Tonne in einer Einzelvariable, um dieses minus 1 Tag mit dem heutigem Datum zu vergleichen um eine Aktion auszulösen.

Mir als php-Anfänger bleibt wohl leider nichts anderes übrig als 4 Kalender(jeweils einen für eine Tonne) zu erstellen, da ich es nicht schaffe, die String-Variable mit allen Terminen zu zerflücken (regex??).

Sollte jemand hier vielleicht schon eine Lösung haben, gerne posten :smiley:

danke für die turboantwort und eure hilfe, ipsymcon ist geil!:slight_smile:

Gruß

@teebeutel

bei mir funktioniert dein Script.
Kontrolliere noch mal deine Zugangsdaten.
Was hat sich denn geändert in den letzten Tagen?

Schablone
@teebeutel

bei mir funktioniert dein Script.
Kontrolliere noch mal deine Zugangsdaten.
Was hat sich denn geändert in den letzten Tagen?

Nix.
Ich habe das Script seit Monaten nicht angefasst und auch meine Zugangsdaten nicht.
BTW:Ich habe einen Google Apps for work Account mit meiner eigenen Domain, vielleicht liegt es auch daran. Wobei auch das genauso ist wie vor drei Monaten.

Ich versuche mal das ganze nochmal komplett neu bei Google einzurichten.
Danke fürs prüfen, wenn das kein Fehler in IPS ist muss es ja an Google liegen.
Ich melde mich wenn ich neue Ergebnisse habe.

Ich vermute es liegt an Google Apps for work.

Die ganze Verwaltungskonsole ist nun in der Google Cloud Plattform und ist (soweit ich das beurteilen kann) ganz anders strukturiert. Ich finde mich nicht zurecht und bin in der Materie auch nicht tief genug drin. Zuviel Auswahlmöglichkeiten…
Dann muß ich mit wohl eine andere Alternative suchen.

2016-04-17 15_58_32-Anmeldedaten - KalenderV2.png

Wenn ich dann ein neues Dienstkonto erstelle gibt es neue Auswahlmöglichkeiten,

2016-04-17 16_46_16-Dienstkontoschlüssel erstellen - Tasks.png

Dort gibt es dann aber keine ClientID mehr


Andererseits kann ich beim erstellen eines OAuth2 Kontos kein Dienstkonto erstellen…
2016-04-17 16_51_35-Client-ID erstellen - API Project.png

Problem behoben :slight_smile:

Ich habs wieder hinbekommen.
Letztendlich habe ich alle Projekte in der Google Cloud gelöscht und das ganze jetzt nochmal von vorne eingerichtet. Und nun gehts.
Seltsam ist das ich heute wieder andere Auswahlmöglichkeiten hatte als gestern.

Jetzt läuft es aber wieder, mal schauen wie lange…

Hallo alle zusammen,

hier nochmal die Möglichkeit Eure Zugangsdaten zu kontrollieren.

  1. Meldet Euch bei Google mit Eurem Google-Account an.
  2. Geht zu der Seite: https://console.developers.google.com/project

Dort klickt Ihr auf Dienstkonto und wählt euer Projekt.
-> Unter Dienstkonto-ID steht Eure $EMail

  1. Klickt auf Client-ID anzeigen.
    Nun erscheint Eure Client-ID.

Und das ist das Problem. Bei mir fehlt der Eintrag „DwD Client ID“ anzeigen neuerdings. Als ich das Projekt 2014 erstellt habe war das noch da. Musste es aber leider neu erstellen.

[b]Habs durch ausprobieren selbst lösen können:
Ich hab an der Stelle in der ich den Termin-Titel in der String gespeichert habe ein Encodieren mit dem php-Befehl „utf8_encode“ eingefügt.

[/b]
Hallo,

Nutze dieses Script schon lange mit wollem Erfolg auf meinem windowsbasierenden IPS-Server.

Jetzt will ich aber den „nächsten“ Termin im Kalender mittels RPC in einer php-Webseite (ohne IPS) auf einem Raspberry (IPS läuft wie gesagt auf Win-PC) anzeigen. Dazu speichere ich den Titel des nächsten Termin (innerhalb dieses Scripts) in einer Stringvarible. In der Console (Stringvar im Objektbaum) werden die Umlaute auch korrekt angezeigt. Auf dem Rasp (bzw. der dargestellten Webseite) kommt bei allen Umlauten aber „<?>“ an. Ich glaube das es nicht am rpc, am RapsPi oder der dargestellten Webseite direkt liegt (oder doch?). Denn wenn ich die unter IPS gespeicherte String-Var manuell mit Umlauten befülle kommt auf dem RaspPi alles korrekt an, wenn der selbe Text durch das Google-Script V3 erzeugt wird kommt das Umlautproblem.

Kann mir da jemand helfen?

Gruß
hardlog

heute eingerichtet und schwupp ging!

badheizung wird nun nach dienstplan gesteuert!

überschrieben wird bei mir übrigens rein gar nix…

vielen vielen dank!!! absolut top!! danke!!!

Das freut mich! :slight_smile:

Ja, das Script zum Google Kalendar und die Anzeige im Flur ist auch mit eines der meistgenutzten Features bei uns mit IPS und funktioniert schon seit Jahren bestens.

Nochmal danke dafür …

VG Doc

Danke. Wir sollten uns mal wieder treffen. Irgendwann anfangen nächstes Jahr. Bin jetzt bis zum Jahresende in China.

Gesendet von meinem SM-G930F mit Tapatalk

Ja,
sollten wir mal langsam wieder in Angriff nehmen.
Anfang des Jahres klinkt gut, wir befinden uns jetzt schon Vorweihnachtszeit, wenn man die Regale in den Supermärkten so anschaut.

VG,
Doc

Hallo,

wie ich hier lesen kann, gibt es Profis, die den Kalender auslesen und noch mehr machen können.
Ich habe eine Frage zu einem Kalendereintrag.
Mit jedem Eintrag kann man auch einen Anhang hochladen, der dann auch mit übertragen wird, wenn der Kalender beispielsweise auf einem Tablett angezeigt wird.
Ich programmiere derzeit eine APP mit Delphi und habe auch schon den Kalender auslesen können. Nun suche ich aber noch eine Möglichkeit, diesen Anhang auszulesen.
Hat hier jemand eine Idee, gegebenenfalls auch für Java?
Irgendwie komme ich an den Anhang nicht ran, bzw finde ich keine Möglichkeit, diesen auszulesen.