Google Kalender Termine im WebFront anzeigen

Schade das keine Antwort kommt! Also hiermit nochmal, kann mir bitte jemand helfen wie ich die Feiertage und Geburtstage sichtbar mache und das es sich in einer vorgegebenen Zeit selber aktualisiert?
Bitte Leute ist doch Ostern

Gesendet von meinem iPad mit Tapatalk

Hallo Leute um meine Frage wirklich oben zu halten, hier nochmal meine Frage an alle ob mir einer Helfen kann???

Hallo!

Also für die aktualisierung erstellst du einfach einen Timer auf dein Script das dir den Kalender ausliest. (Objekt hinzufügen - Ereignis - stündlich - alle x Stunden)

Ich denke Geburtstags - und Feiertagskalender ist schwieriger, da es eigene Kalender in Google sind. Du rufst aber nur deinen persönlichen Kalender ab. Die anderen Kalender sind sozusagen nur dazugeblendet.
Wenn ich das richtig interpretiert habe.

lg Marco

Super vielen Dank, werde ich gleich ausprobieren wenn ich zu Hause bin

Gesendet von meinem SM-N9005 mit Tapatalk

Hallo zusammen,

seit gestern kann ich keine Termine mit dem Google Kalender auslesen… es kommt zur Fehlermeldung im Script:

Habe den Kalender und den Magic Token geprüft, die Sicherheitseinstellungen in Google… hab keine Erklärung und bin ratlos.:confused:
Einzig was ich sehe, dass der Stream nicht zu öffnen ist. Forbidden… Hab weder am Google Kalender noch am Script etwas geänder.

Ich habe das Script von Beitrag #122.
Hat jemand eine Idee?

Warning: simplexml_load_file(http://www.google.com/calendar/feeds/familienkalenderXYZ%40googlemail.com/private-4c49a57258XYZABC/full?singleevents=true&max-results=20&orderby=starttime&start-min=2014-11-18T00%3A00%3A00%2B01%3A00&start-max=2014-11-28T09%3A59%3A10%2B01%3A00&sortorder=a): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden
in C:\IP-Symcon\scripts\58299.ips.php on line 59

Warning: simplexml_load_file(): I/O warning : failed to load external entity „http://www.google.com/calendar/feeds/familienkalenderXYZ%40googlemail.com/private-4c49a5XYZXYZ1cfec1f80d06d81566/full?singleevents=true&max-results=20&orderby=starttime&start-min=2014-11-18T00%3A00%3A00%2B01%3A00&start-max=2014-11-28T09%3A59%3A10%2B01%3A00&sortorder=a“ in C:\IP-Symcon\scripts\58299.ips.php on line 59

Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\58299.ips.php on line 62

Warning: Invalid argument supplied for foreach() in C:\IP-Symcon\scripts\58299.ips.php on line 62

Warning: usort() expects parameter 1 to be array, null given in C:\IP-Symcon\scripts\58299.ips.php on line 97

Warning: Invalid argument supplied for foreach() in C:\IP-Symcon\scripts\58299.ips.php on line 100

Warning: Invalid argument supplied for foreach() in C:\IP-Symcon\scripts\58299.ips.php on line 148

Hi. Ich kann das nur bestätigen. Das Fehlerbild ist bei mir identisch. Habe es aber bislang nicht weiter untersucht.

Hallo,
wie seit ca. 1 Jahr bekannt, wird jetzt die Google API v2 nicht mehr unterstützt.
Update auf v3 bringt Abhilfe.

So wie du es schreibst war es dir schon lange bekannt.
Verm. hast du das Update auch schon vollzogen und kannst uns erleuchten?

Grüße,
Doc

Nein, leider nicht. Verstehe nur nicht, wie manche die „Neuigkeit“ posten können, als seien sie aus allen Wolken gefallen.

Vielleicht hilft das hier:
https://developers.google.com/google-apps/calendar/migration

Mhm, mein Kalender ging bis gestern noch ohne Probleme… War das mit der V2 irgendwie befristet? Edit: Ja habs gefunden bis 17.11, nun wurde V2 abgeschaltet…

Hab mir den Link angeschaut… kann mir jemand sagen was ich hier in Verbindung mit IPS konkret machen muss.?
Ist das eine neue DLL oder muss im Quelltext etwas geändert werden…

Bin hilflos… please help

Jürgen

Nicht gut, keine Ahnung wann ich nun meinen Müll raustellen soll. Komisch ist das diese Url in der Form noch funktioniert…

Lösung habe ich leider auch noch keine. ips-#3521

Warte auf weitere Anweisungen :smiley:

Vielen Dank. t33kanne

Hab bei mir auch erstmal den Timer deaktiviert. Dass nicht dauernd Fehlermeldungen kommen

Naja, mir war es zumindest nicht bekannt…

Wie auch immer, v3 macht einem das Leben zumindest nicht leichter. Zuerst braucht man zwingend einen API-Key, den man sich unter https://console.developers.google.com für ein „Calendar API Project“ erstellen muss. Für private Kalender muss man nun oAuth machen, was mir nicht trivial erscheint.

Wer aber, so wie ich, nur die Daten aus einem öffentlichen Kalender abfragen will (wann bei uns die Müllabfuhr kommt darf gerne jeder wissen) kann dies mit folgendem Skript tun. Einen API-Key braucht man trotzdem!


// Umbau wegen Einstellung der Calendar API v2 am 18.11.2014
// Dieser neue Code auf Basis API v3 spielt so nur mit öffentlichen Kalendern!
// Das Ergebnis ist jetzt kein XML mehr sondern JSON

// Config
define("CALENDAR_ID", "xxxxx%40group.calendar.google.com");
define("API_KEY", "sahdfhsdfhsdkhfsdkhjfksj");
define("MAX_RESULTS", 3);

$url  = "https://www.googleapis.com/calendar/v3/calendars/".CALENDAR_ID."/events?key=".API_KEY;
$url .= "&timeMin=".urlencode(date("c"))."&singleEvents=true&orderBy=startTime&maxResults=".MAX_RESULTS;
$json = Sys_GetURLContent($url);
$cal  = json_decode($json);

// Setlocale spielt irgendwie nicht
$weekdays = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");

$date = "<table width='90%' align='center'>";
foreach($cal->items as $item) {

	$title = stripslashes(utf8_decode($item->summary));
	$startTime = strtotime( $item->start->dateTime );
	$morgen = time() + 86400;

   if(date("d.m.y") == date("d.m.y", $startTime)) {
		$heute = true;
		$today++;
	} else if(date("d.m.y", $morgen) == date("d.m.y", $startTime)) {
		$morgen = true;
		$heute = false;
	} else {
    	$heute = false;
		$morgen = false;
	  	if($today > 0) {
      		$today = 0;
	  		$date .= "
";
    	}
   }

	$date .= "<tr>";

   if ($heute) {
    	$date_day = "Heute";
	//TTSTimerSetzen($title);
    } else if ($morgen) {
    	$date_day = "Morgen";
	} else {
    	$date_day = $weekdays[date("N", $startTime )] . ", " . date("d.m.",$startTime);
	}
	$date .= "<td>".$date_day."</td><td>".$title."</td>";
	$date .= "</tr>";

}

$date .= "</table>";

Hoffe das hilft dem einen oder anderen.

Hallo,
habe mal folgendes probiert:

Das Beispielskript scheint soweit zu funktionieren.

Hier ist die API beschrieben:

Diese Äusserung erinnert mich irgendwie an eine Szene aus Per Anhalter durch die Galaxis (The Hitchhiker’s Guide to the Galaxy)

Ganz bekomme ich sie nicht mehr zusammen, lief aber in etwa so:

Als die Flotte der Vogonen auftaucht, um die Erde zwecks Baus einer galaktischen Hyperraum-Expressroute zu zerstören, hat man sich bei den Außerirdischen beschwert.
Die Erdbewohner bekamen daraufhin die Antwort, das Vorhaben sei doch schon vor tausend Jahre am schwarzen Brett des Planeten Magrathea bekannt gegeben worden und man hätte doch schon längst die Evakuierung des Planeten Erde vornehmen können.

Ohne Grüsse
Harald

P.S. Bei mir ist u.a. der Müllkalender abgelaufen, was mich nicht besonders belastet.
Allerdings wird auch die Heizung nicht mehr zeitgerecht gesteuert. Das wird mir eine Lehre sein, mich niemals mehr auf einen „Service“ von Google bei wichtigen Dingen abzustützen.
Motto von Google scheint zu sein: Der Herr hat’s gegeben, der Herr hat’s genommen oder was „kostenlos“ ist kann jederzeit wieder unbrauchbar gemacht werden.

So ein Mist das mit den Kalender lief so gut. Wir nutzen den Kalender sehr häufig um Termine untern einander auszutauschen. Ist da schon jemand dran an der Umstellung für mich ist das leider eine Nummer schwer um den Kalender mit der APi Umstellung zum Laufen zu bekommen.

Gruß Stephan

Wenn man nur die Mülltermine braucht, ansonsten aber auf die Kalenderfunktion verzichten kann, könnte man die Termine für die Leerung auch einfach in vier String-Variablen schreiben. Ich habe das mal in einem Skript versucht. Dabei habe ich berücksichtigt, dass an einem Tag auch mal mehrere Tonnen geleert werden. In dem Skript erzeuge ich jeweils für die Leerung heute und morgen max. vier Variablen, die sozusagen die Stellpätze an der Straße repräsentieren. Diese Variablen kann ich dann in IPSView leicht verwenden, um die Mülltonnen anzuzeigen. Wenn man nur eine Tonne pro Tag zulässt, würde sich das Skript natürlich deutlich vereinfachen.
Bei der manuellen Eingabe der Leerungstermine ist wichtig, dass das Datum in der Form „TT.MM.JJJJ“ mit führender Null geschrieben wird, also z.B „06.01.2014|20.01.2014|03.02.2014|17.02.2014|…“

Gruß
Peter


<?
$max_stellplaetze=4; // wieviel Mülltonnen werden max. an einem Tag geleert?

for($i=0;$i<$max_stellplaetze;$i++)  // Mit 0 initialisieren
{
	$id_tonne_heute[$i] = CreateVariablebyname(34207, "Muelltonne".$i."_heute", 1);
	$id_tonne_morgen[$i] = CreateVariablebyname(34207, "Muelltonne".$i."_morgen", 1);
	SetValue($id_tonne_heute[$i],0);
	SetValue($id_tonne_morgen[$i],0);
}

// in diesen String-Variablen steht jeweils die Liste alle Leerungstermine
// die Termine müssen Anfang des Jahres einmalig manuell in die Variablen geschrieben werden.
$restmuell = GetValue(44396);
$biotonne = GetValue(14679);
$blauetonne = GetValue(49786);
$gelbersack = GetValue(23708);

$tomorrow = date("d.m.Y", strtotime("+1 day"));
$today = date("d.m.Y");

$rm_tage = explode("|", $restmuell);
$bio_tage = explode("|",$biotonne);
$bt_tage = explode("|", $blauetonne);
$gs_tage = explode("|", $gelbersack);

// Welche Tonnen werden heute geleert?
$stellplatz=0;
if(array_search ( $today , $rm_tage) !== FALSE)  // heute Restmüll?
	SetValue($id_tonne_heute[$stellplatz++],1);
if(array_search ( $today , $bio_tage) !== FALSE)  // heute Biomüll?
	SetValue($id_tonne_heute[$stellplatz++],2);
if(array_search ( $today , $bt_tage) !== FALSE)  // heute Biomüll?
	SetValue($id_tonne_heute[$stellplatz++],3);
if(array_search ( $today , $gs_tage) !== FALSE)  // heute Blaue Tonne?
	SetValue($id_tonne_heute[$stellplatz],4);

//Welche Tonnen werden morgen geleert?
$stellplatz=0;
if(array_search ( $tomorrow , $rm_tage) !== FALSE)  // morgen Restmüll?
	SetValue($id_tonne_morgen[$stellplatz++],1);
if(array_search ( $tomorrow , $bio_tage) !== FALSE)  // morgen Biomüll?
	SetValue($id_tonne_morgen[$stellplatz++],2);
if(array_search ( $tomorrow , $bt_tage) !== FALSE)  // morgen Blaue Tonne?
	SetValue($id_tonne_morgen[$stellplatz++],3);
if(array_search ( $tomorrow , $gs_tage) !== FALSE)  // morgen Gelber Sack?
	SetValue($id_tonne_morgen[$stellplatz],4);


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

?>

Hallo Peter!

Das war eine wunderbare Vorlage, um bei mir wieder alles zum Laufen zu bringen, mit ein paar Anpassungen zu meinem alten Aufbau, gefällt es mir jetzt sogar besser als vorher :slight_smile:

So kann ich automatisch Termine einlaufen lassen und noch manuell im WebFront etwas bei Bedarf ändern :slight_smile:

Das bearbeitete Skript sieht dann so aus:

<?
// Konfiguration:
// In den String Variablen müssen alle Termine nach diesem Muster eingetragen werden:
//   05.01.2015|11.02.2015|25.02.2015|09.03.2015|...........
$TermineSchwarzeTonne = GetValue(33569 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Termine\schwarze Tonne]*/);  // ID der String Variable mit Terminen für die schwarze Tonne
$TermineGrueneTonne = GetValue(38003 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Termine\grüne Tonne]*/);    // ID der String Variable mit Terminen für die grüne Tonne
$TermineGelberSack = GetValue(48284 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Termine\gelber Sack]*/);     // ID der String Variable mit Terminen für den gelben Sack

// Hier die BOOLEAN Variablen (true = Tonne wird geleert, false = Tonne wird nicht geleert)
$schwarzeTonneHeute = 58237 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\HEUTE (schwarze Tonne)]*/;
$schwarzeTonneMorgen = 45120 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\MORGEN (schwarze Tonne)]*/;
$grueneTonneHeute = 16547 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\HEUTE (grüne Tonne)]*/;
$grueneTonneMorgen = 55806 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\MORGEN (grüne Tonne)]*/;
$gelberSackHeute = 44565 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\HEUTE (gelber Sack)]*/;
$gelberSackMorgen = 40138 /*[Skripte & Variablen\Müllabfuhr\Termine Offline\Abholung\MORGEN (gelber Sack)]*/;

// Zu Beginn alles auf false setzen, damit später die entsprechenden Tonnen auf true gesetzt werden können
SetValue($schwarzeTonneHeute, false);
SetValue($grueneTonneHeute, false);
SetValue($gelberSackHeute, false);
SetValue($schwarzeTonneMorgen, false);
SetValue($grueneTonneMorgen, false);
SetValue($gelberSackMorgen, false);

$tomorrow = date("d.m.Y", strtotime("+1 day"));
$today = date("d.m.Y");

$rm_tage = explode("|", $TermineSchwarzeTonne);
$bt_tage = explode("|", $TermineGrueneTonne);
$gs_tage = explode("|", $TermineGelberSack);

// Welche Tonnen werden heute geleert?
if(array_search ( $today , $rm_tage) !== FALSE)  // heute schwarze Tonne?
    SetValue($schwarzeTonneHeute, true);
if(array_search ( $today , $bt_tage) !== FALSE)  // heute grüne Tonne?
    SetValue($grueneTonneHeute, true);
if(array_search ( $today , $gs_tage) !== FALSE)  // heute gelber Sack?
    SetValue($gelberSackHeute, true);

// Welche Tonnen werden morgen geleert?
if(array_search ( $tomorrow , $rm_tage) !== FALSE)  // morgen schwarze Tonne?
    SetValue($schwarzeTonneMorgen, true);
if(array_search ( $tomorrow , $bt_tage) !== FALSE)  // morgen grüne Tonne?
    SetValue($grueneTonneMorgen, true);
if(array_search ( $tomorrow , $gs_tage) !== FALSE)  // morgen gelber Sack?
    SetValue($gelberSackMorgen, true);

?>

Einfach aber gut :slight_smile:

Vielen Dank und Grüße,
Chris

Hallo zusammen,

und hier noch eine funktionierende Version mit korrekter Dienste Authentifzierung:

[ol]
[li]Google PHP API runterladen und im unterordner des script Verzeichnisses speichern (https://github.com/google/google-api-php-client)
[/li][li]Danach in der google Console ein neues Projekt anlegen (https://console.developers.google.com/project)
[/li][li]Nun die Calendar API in diesem Projekt aktivieren und bei Zugangsdaten neue Client ID erstellen (Typ Dienstkonto)
[/li][li]Das keyfile runterladen und im IPS Ordner entsprechend ablegen (nicht public)
[/li][li]Den Google Kalender in den Einstellungen für diesen Service-User (Generierte Email-Adresse für diese Client-ID) freigeben und berechtigen.
[/li][li]Aus dem alten OpenSSL Paket (Version 0.9.8zc, https://www.openssl.org/)die Dateien ssleay32.dll und libeay32.dll in den IPS Ordner (alte umbenennen)
[/li][li]in der PHP-ini die Extension Open ssl aktivieren (extension = php_openssl.dll)
[/li][li]script s.u. konfiguriren- fertig
[/li][/ol]

Jetzt liest das Script die kommenden Termine (heute +1 Woche) ein und gibt sie aus.
Können nat. auch in eine Variable geschrieben werden etc.



	$C["CLIENT-ID"]   = "irgendwasgeneriertes.apps.googleusercontent.com";
	$C["EMAIL"]       = "irgendwasgeneriertes@developer.gserviceaccount.com";
	$C["PRIVATEKEY"]  = "pfad zum key file, zb. ../mykey.p12";
	$C["CALENDAR"]   = "Name des Kalenders zb. irgendwas@googlemail.com";

	$C["LINESEP"]    = "<br>
";

	require_once 'google-api-php-client/autoload.php';

	$client = new Google_Client();
	// Replace this with your application name.
	$client->setApplicationName("IPS");
	$service = new Google_Service_Calendar($client);

	$key = file_get_contents($C["PRIVATEKEY"]);
	$cred = new Google_Auth_AssertionCredentials(
														  $C["EMAIL"],
														 array('https://www.googleapis.com/auth/calendar.readonly'),
														  $key
																);
	$client->setAssertionCredentials($cred);

	$cals = $service->calendarList->listCalendarList();

	// Convert recurring events to single events
	// Look for events in the next week - now to now+1week
	$params = array(
	 'singleEvents' => TRUE,
	 'timeMin' => (new DateTime())->format(DateTime::RFC3339),
	 'timeMax' => (new DateTime())->add(new DateInterval('P1W'))->format(DateTime::RFC3339),
	);
	$events = $service->events->listEvents($C["CALENDAR"], $params);

 $caltxt ="";
	foreach ($events->getItems() as $event) {
	 $eventDate = $event->getStart()->dateTime;
	 $evDate = new DateTime($eventDate);
	 $date = $evDate->getTimestamp();
	 $caltxt .= (date("H:i", $date) != "00:00")?date("d.m.Y H:i", $date)." ":date("D d.m.Y", $date )." ";
	 $caltxt .= utf8_decode($event->getSummary());
	 $caltxt .= $C["LINESEP"];
	}

// jetzt was zb. in eine variable schreiben etc.	

if($_IPS['SENDER'] == "Execute")
{
    echo "<pre>";
    echo $caltxt;
}

Hallo,
du kannst Google gerne bitten, dir zukünftig ein Fax zu senden, da dir die neuen Medien noch fremd sind.
Falls es dir Microsoft per Fax noch nicht mitgeteilt haben sollte, für Windows 95, 98 und, jetzt top aktuell, selbst für XP gibt es keine Sicherheitsupdates mehr… :eek:

Übrigens: Google Contacts API v3 wird ab 05.05.2015 Pflicht.