Scripte für den Google Kalender API V3

Sorry,

ich hatte in dem Post davor die falsche Zeile editiert. Ich habe mehrere Termine mit dem vorhergehenden Skript anzeigen lassen können, aber keine Wochentagesnamen. Ist das in dem aktuellen schon eingearbeitet bzw geht das überhaupt? Den Skript kann ich erst nachmittags testen.

Gruß oekomat

Nein. Mit dem Script können nur mehrere Kalender eingelesen werden. Siehe Beschreibung.
Das ist ein altes Script aus 2012 was ich für dich abgeändert habe. Da sind keine Wochentage drin.

Machen kann man alles. Mit den Wochentagen ist für mich auch interessant. Ich schaue mir das mal an.

Ok, danke dir vorab. Dann warte ich mal auf dein „Go“. :cool:

Gruß oekomat

ich hab die bislang letzte Version mal genauer angeschaut.
Wenn ich den 2. Kalender auch auslesen will, darf der nur unter dem gleichen Google-Account sein? Ich habe zwei Google-Kalender in der Familie mit eigenständigen Accounts, also auch 2 mail-Adressen. Durch die Freigabe würde ich jedoch auch 2 Client_IDs bekommen und 2 p12 Dateien oder wie muss ich das sehen?

Gruß oekomat

Ich würde das jetzt mal mit ja beantworten. Zu 1000% möchte ich das nicht garantieren.

So aus der Hüfte geschossen würde ich das alles noch einmal machen.
Das Script nochmals kopieren und die Daten abändern.

Tu mir bitte ein gefallen. Mir wurde gesagt das die Screenshots aus dem ersten Post nicht mehr passen/veraltet sind.
Wenn Du jetzt sowieso nochmals durch das ganze Prozedere gehst, kannst Du dann mal neue Screenshots machen?

Bitte, bitte, bitte. Ganz lieb gug!!!

Das stimmt, die sind nicht mehr aktuell. Ja, kein problem ich mach die screenshots und kann sie dir schicken,damit du die posts editieren kannst. Wird aber vorauss. erst morgen abend.

Wenn du mit den Wochentagen weiter bist, lass es mich wissen. :cowboy_hat_face:.

Gruss oekomat

Gesendet von meinem SM-G930F mit Tapatalk

Besten Dank! :slight_smile:

Bei mir läuft das schon. :smiley:

Hier das Script mit den Wochentagen.
Ich habe das bei mir nicht getestet!!


<?
/** GoogleCalendarRead  
* Martin Heinzel - 03.02.2016  
* Version: 1.1  
*  
* Beschreibung:  
* Mit diesem Script werden die nächsten drei Termine aus dem Google Kalender  
* gelesen.  
*  
* Änderungen  
* ----------  
*  
* 20.04.2017 von Version 1.0 -> 1.1  
*  
* Beschreibung:  
* Termine werden Jetzt mit dem Wochentag "Mo, Di, ... usw.
* angezeigt. 
*/  

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

/**  
* Variablen  
*/  
$Wochentage_Array = array(1=>"Mo",2=>"Di  ",3=>"Mi ",4=>"Do",5=>"Fr",6=>"Sa",0=>"So"); 

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

    $Date_Time_TimeStamp	= EventTime_to_TimeStamp($Date_Time); 
    $Wochentag      		        = Date("w",(int)$Date_Time_TimeStamp); 
    $Tag                                    = $Wochentage_Array[$Wochentag]; 
    $title     = utf8_decode($event->getSummary());  
	
    //Abfrage ganztägiger Termin 
    if(Date("H:i:s",(int)$Date_Time_TimeStamp) === "00:00:00") 
    { 
        $event_display .= $Tag. "  ".Date("d.m.Y",(int)$Date_Time_TimeStamp)."  Ganztägig    ".$title."\r"; 
    } 
    else 
    { 
        $event_display .= $Tag. "  ".Date("d.m.Y   H:i:s   ",(int)$Date_Time_TimeStamp)."   ".$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;  
}  

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

bin jetzt dabei die Screenshots zu machen und den Skript mit den Wochentagen zu testen. Der Skript wirft Fehler aus, aber nur weil du die Variable Calender_login jetzt in dem neuen Skript in Calender_Id umbenannt hast. Hab das bei mir angepasst.

ich habe für meinen zweiten Kalender jetzt das ganz Spielchen nochmal durch und überlege, wie ich das in einer Textbox zusammen anzeigen lassen kann. einfach copy&paste hintereinander wird ja nicht funktionieren.

gruß oekomat

PS: kann dir die Fotos emailen.

Hallo Martin.

Ich habe mich das Wochenende mal mit dem Google Kalender und deinem Sript beschäftigt.
Nach einigen Anläufen mit der Google Console und den dortigen Einträgen,
habe ich es nun zum laufen bekommen :slight_smile:

Gute Arbeit, vielen Dank dafür.

Aber eine Kleinigkeit ist mir aufgefallen:
Die ~Textbox Variable wird nicht mit dem Profil (Textbox) angelegt !

Es fehlte das setzen des Profils beim anlegen der Variable in der Funktion und in dessen Parameterübergabe.

Hab das mal nachgescriptet, für die Nachwelt…

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

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

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

function CreateVariableByName($id, $ident, $type, $profil) {  
    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']);  
		IPS_SetVariableCustomProfile($vid, $profil);
    }  
    return $vid;  
}  

Gruß Lutz

Sorry Jungs. Bin schon wieder unterwegs.
@Lutz
Ich muss mir das noch mal anschauen. Bei deiner Lösung gefällt mir das IPS_SELF nicht. Das gibt es so nicht mehr.

Gesendet von meinem SM-G930F mit Tapatalk

Normalerweise müsste man da ein PHP Modul von machen.

Gesendet von meinem SM-G930F mit Tapatalk

Hallo Martin.

Ich hatte den Quelltext von Dir so übernommen und nur ergänzt.

Habe ich aber auch überlesen. Stimmt !

Sollte man auch noch anpassen…

Edit:
Habe gerade mal getestet

echo $IPS_SELF." ".$_IPS[‚SELF‘];

liefert die gleiche ID, daher funktioniert es noch… :wink:

Grüße
Lutz

hallo Martin,

wie schaut es aus? hab die Versoin 20.04.17 am laufen, allerdings nur mit einem Kalender. Wie könnte ich den 2. Google Kalender mit den gleichen Anzeigeeinstellungen in einer TextBox anzeigen lassen?

Gruß oekomat

Das erste Script im Beitrag #2 macht genau das. Ich müsste das mal überarbeiten.
Eventuell funktioniert das auch noch so.
Ich muss das testen!!

[EDIT]
Moment mal.
Das Script vom 20.04 (Post#180) ist doch schon für mehrere Kalender.

Freigeben von mehreren Kallendern ist im ersten Post ab Punkt 9. beschrieben
[\EDIT]

Hallo Martin,

habe alles nach Anleitung eingerichtet… aber wohl doch irgendwo einen Fehler gemacht. Ich bekomme beim Ausführen des Skripts (Post 180) die folgende Fehlermeldung.

RasPi (mit IPS 4.0) hat Zugang zum Internet.

Kannst Du bitte helfen?

1.000 Dank.

VG
Lars


<br />
<b>Fatal error</b>:  Uncaught exception 'Google_IO_Exception' with message 'Could not resolve host: accounts.google.com' in /usr/share/symcon/scripts/google-api-php-client/src/Google/IO/Curl.php:126
Stack trace:
#0 /usr/share/symcon/scripts/google-api-php-client/src/Google/IO/Abstract.php(136): Google_IO_Curl->executeRequest(Object(Google_Http_Request))
#1 /usr/share/symcon/scripts/google-api-php-client/src/Google/Auth/OAuth2.php(343): Google_IO_Abstract->makeRequest(Object(Google_Http_Request))
#2 /usr/share/symcon/scripts/google-api-php-client/src/Google/Auth/OAuth2.php(315): Google_Auth_OAuth2->refreshTokenRequest(Array)
#3 /usr/share/symcon/scripts/google-api-php-client/src/Google/Auth/OAuth2.php(240): Google_Auth_OAuth2->refreshTokenWithAssertion()
#4 /usr/share/symcon/scripts/google-api-php-client/src/Google/Service/Resource.php(217): Google_Auth_OAuth2->sign(Object(Google_Http_Request))
#5 /usr/share/symcon/scripts/google-api-php-client/src/Google/Service/Calendar.php(1634): Google_Service_Resource->call('list', Array, 'Go in <b>/usr/share/symcon/scripts/google-api-php-client/src/Google/IO/Curl.php</b> on line <b>126</b><br />

PS: PING via TelNet über den RasPi funktioniert auf accounts.google.com. HTH. VG: Lars.

Hallo Lars,

ich habe jetzt erst deinen Hilferuf gesehen!! :banghead:
Asche auf mein Haupt!! :o

Bist Du da schon weiter gekommen?
Brauchst Du da noch Hilfe?

Hi Schablone, ja, ist gelöst. Wollte ich noch posten, insofern danke für die Erinnerung :slight_smile: War das bekannte Problem der Namensauflösung in IPS 4.0. Nach einem Update auf 4.3 funktioniert alles, wie es soll. Danke für die Anleitung und Dein Skript. VG

Gesendet von meinem SM-G955F mit Tapatalk

ich veruzweifle wieder mal ab mir selbst.

Meine Ausgabe sieht so aus:

$ort           = substr($event_display, 34,50);
$termin = $ort;

Dort steht entweder „Stefan“ oder „Juerg“. Untenstehendes wäre das Ziel, dies wird jedoch komplett ignoriert. Was mach ich da falsch?

if ($termin == "Juerg")
	{
		SetValue(14899 /*[Kalender\Skripte\Google Kalender Pikett
ächster Termin Pikett]*/, "juerg.1");
		//echo "Jürg geklappt";
	}

if ($termin == "Stefan")
	{
		SetValue(14899 /*[Kalender\Skripte\Google Kalender Pikett
ächster Termin Pikett]*/, "stefan.1");
	}