Hauptmenü

Google Calendar

Begonnen von djhans, 27 November 2013, 22:06:39

Vorheriges Thema - Nächstes Thema

djhans

Hallo zusammen,
ich spiele gerade mit dem Calendar Modul und versuche Termine abzufragen.
Mit beliebigen öffentlichen Kalendern (z.B. Ferien NRW), die im iCal-Format vorliegen, gelingt mir das auch.

Wenn ich nun meinen eigenen Kalender abfragen will, kann ich die Daten nicht auslesen. Müssen die google Kalender alle öffentlich sein? Oder kann man auch mit Bentzername und Passwort bei der Abfrage arbeiten. Wenn ja, wie übergebe ich diese Parameter?
Oder muss ich für fhem die Kalender in Google Apps öffentlich machen...

Danke,
Christian

betateilchen

Du kannst in fhem die "Private ical-URL" aus Deinem Google-Kalender verwenden. Dann brauchst Du keine Benutzerdaten angeben und den Kalender auch nicht öffentlich machen.

Und Du bist hier im falschen Forumbereich. Fragen zum Calendar-Modul gehören in das Unterforum "Unterstützende Dienste".
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

djhans

Hi,
ok. sorry für die falsche Rubrik!
Aber:
Wo finde ich diese "private iCal-URL"
In den google-Kalender-Einstellungen steht bei dem grünen iCal Button:
Dies ist die Adresse für Ihren Kalender. Dieser Link kann nur aufgerufen werden, wenn Sie Ihren Kalender veröffentlicht haben.

Und dieser Link funktioniert nur, wenn ich die Adresse öffentlich mache. Im Thunderbirds Lightning brauche ich deshalb die Zugangsdaten.
djhans

betateilchen

Eine Zeile tiefer unter "Privatadresse"

(http://up.picr.de/16594540ew.png)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

djhans

#4
Hi,
danke, aber diese Sektion habe ich nicht! Auch unter Freigabeobtionen ist dies nicht zu ändern.
Kann es sein, dass dies irgendwo in der Google Admin-Konsole freigeschaltet werden muss?

djhans

betateilchen

speziell eingerichtet habe ich da seinerzeit eigentlich nichts.

Die Freigabeeinstellungen an sich sehen so aus:

(http://up.picr.de/16596283xy.png)

also alle abgeschaltet, mit Ausnahme der eigenen Person natürlich. (Abschnitt "bestimmte Personen")

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

djhans

#6
Hallo,
so, habe es gefunden!
Man muss das explizit in der Admin-Konsole von Google-Apps unter Apps->Kalender->Berechtigungen freischalten. Nach ein paar Stunden (google sagt max. 24h) taucht dann die besagte 2. Zeile auf.

Aber nur zum Verständnis:
Mit diesem Link kann dann jeder ohne Passwort auf den Kalender zugreifen, richtig? Ist das wirklich sicher? Im Prinzip ist es mir egal, ob jemand weiß, wann ich mein Radio einschalte, oder morgens aufstehe.  Wie sicher ist dieses Verfahren?

Danke und Gruß,
djhans

Nachtrag:
geht aber trotzdem nicht.
habe folgendes eingegeben:
define myCalendar Calendar ical url http://www.google.com/calendar/ical/s...........private-................/basic.ics
und versuche dann mit
get mycalendar full all
die Daten abzufragen.

Wenn ich mir die Daten in fhem unter myCalendar ansehe, steht unter State: "Not an ical file at URL"
Was mache ich noch falsch?
djhans

Nachtrag 2:
Url in google zurückgesetzt und nun geht es.

cpr

#7
Ja, sobald alle Freigabeeinstellungen richtig gesetzt sind, taucht die Privatadresse auf. Und ja, damit kann jeder zugreifen -- weswegen es sich der Google Apps Administrator überlegen wird, das freizuschalten.
Aber die Adresse ist ja reichlich "obskur"...

Es gibt neben der Verwendung der Privatadresse auch noch den Weg, über die Calendar API auf die Kalendertermine zuzugreifen. Hat den charmanten Effekt, dass Serientermine "erweitert" werden können.

Dazu muss über die https://cloud.google.com/console eine App angelegt werden, siehe die Dokumentation unter https://developers.google.com/google-apps/calendar/firstapp .
Ich habe dann die PHP library verwendet, weil die im Gegensatz zu Perl offiziell supportet wird.
Unter Perl musste ich viel zu viel aus CPAN installieren, um die OAuth2.0 Kommunikation hinzukriegen.

Folgender Code erstellt im gleichen Verzeichnis eine iCalendar-Datei mit dem Namen KalenderdateiFIXME.ics:
(Achtung, der Zeitbereich ist (noch) fest verdrahtet auf timeMax Ende Januar 2014.)
Auch sonst sind einige zu verändernde Variablen mit FIXME gekennzeichnet.
Die google-api-php-client Dateien müssen im include_path liegen.

<?php
//https://cloud.google.com/console
//https://developers.google.com/google-apps/calendar/
//https://groups.google.com/d/msg/google-calendar-api/MySzyAXq12Q/N3075LfV194J
//http://blog.pamelafox.org/2013/04/outputting-ical-with-php.html
//http://icalvalid.cloudapp.net/
//http://tools.ietf.org/search/rfc5545
//https://developers.google.com/apis-explorer/#s/calendar/v3/

require_once 'google-api-php-client/src/Google_Client.php';
require_once 
'google-api-php-client/src/contrib/Google_CalendarService.php';

define('SERVICE_ACCOUNT_NAME''cloud.google.com/console_CLIENTID_FIXME');
define('KEY_FILE''./cloud.google.com/console_certificate_FIXME-privatekey.p12');

$savepath "/opt/fhem/data/";
$savefile "KalenderdateiFIXME.ics";

$client = new Google_Client();
$client->setApplicationName("cloud.google.com/console_registered-appFIXME");
$client->setUseObjects(true);

$key file_get_contents(KEY_FILE);
$client->setAssertionCredentials(new Google_AssertionCredentials(
    
SERVICE_ACCOUNT_NAME,
    array(
'https://www.googleapis.com/auth/calendar'),
    
$key)
);

$cal = new Google_CalendarService($client);

$ev $cal->events;
$events $ev->listEvents("PrivatadresseFIXME", array(
'timeMin' => '2013-12-09T00:00:00.000Z',
'timeMax' => '2014-01-31T00:00:00.000Z',
#'maxResults' => 2,
'singleEvents' => true
));

function 
generateEvent($event) {
$output "BEGIN:VEVENT\r\n";
$output .= "UID:{$event->id}_suffixToParseInNotifyFIXME\r\n"
"DTSTAMP;TZID=Europe/Berlin:" formatDate($event->start->dateTime). "\r\n"
"DTSTART;TZID=Europe/Berlin:" formatDate($event->start->dateTime). "\r\n"
"DTEND;TZID=Europe/Berlin:" formatDate($event->end->dateTime). "\r\n"
"LOCATION:" $event->location "\r\n"
"SUMMARY:{$event->summary}\r\n"
;
$output .= "END:VEVENT\r\n";
return 
$output;
}

function 
formatDate($date) {
  
$t date_create($date);
  return 
$t->format("Ymd\THis");
}

function 
generateCalender($events){
$output "BEGIN:VCALENDAR\r\n"
."VERSION:2.0\r\n"
."PRODID:-//cpr//NONSGML//EN\r\n"
."X-WR-CALNAME:Heimautomation\r\n"
."X-WR-TIMEZONE:Europe/Berlin\r\n"
."CALSCALE:GREGORIAN\r\n"
."BEGIN:VTIMEZONE\r\n"
."TZID:Europe/Berlin\r\n"
."X-LIC-LOCATION:Europe/Berlin\r\n"
."BEGIN:DAYLIGHT\r\n"
."TZOFFSETFROM:+0100\r\n"
."TZOFFSETTO:+0200\r\n"
."TZNAME:CEST\r\n"
."DTSTART:19700329T020000\r\n"
."RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\n"
."END:DAYLIGHT\r\n"
."BEGIN:STANDARD\r\n"
."TZOFFSETFROM:+0200\r\n"
."TZOFFSETTO:+0100\r\n"
."TZNAME:CET\r\n"
."DTSTART:19701025T030000\r\n"
."RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\n"
."END:STANDARD\r\n"
."END:VTIMEZONE\r\n"

;

foreach ( 
$events->items as $v) {
$output .= generateEvent($v);
}

$output .= "END:VCALENDAR";
return 
$output;
}

$tmp generateCalender($events);

file_put_contents($savefile$tmp);


Ist der einfachste Weg, den ich gefunden habe, Serientermine zu erweitern.

Aus dem Calendar-Modul heraus wird dann die lokal abgespeichterte Datei referenziert.
Serientermine sind einen cronjob wert!

Ich weiß, ist häßlicher Code. ;)
Aber $client->setUseObjects(true); ist schon drin, um es später hübsch auszubauen!

Unter der Referenz für calendar.events.list gibt es noch weitere Optionen, mit denen der array des listEvents Aufrufs gefüttert werden kann, bsw orderBy startTime: https://developers.google.com/google-apps/calendar/v3/reference/events/list
Oder mit q auf bestimmte Suchbegriffe "filtern".