Die Anzeige der Geburtstage der Kontakte in einem iPhone oder Android-Device ist mittlerweile sehr einfach: Sind die Geburtstage korrekt in den Eigenschaften der angelegten Kontakte korrekt gepflegt, lässt sich in der Kalender-Liste der Kalender-APP meist mit dem Namen „Geburtstage“ ein Kalender aktivieren, der die Geburtstage der Kontakte anzeigt. Möchte man diesen Kalender aber an anderer Stelle nutzen, z.B. in einem Kalender-Widget auf einer VIS-Oberfläche in ioBroker, benötigt man einen ical-URL für den Import der Einträge.
Schnell stellen wir fest, dass sowohl bei Apple unter icloud.com, als auch bei calendar.google.com der Geburtstagskalender keine ical-URL für den Import anbietet.
Legt man hingegen eigene Kalender bei Apple oder Google an, findet sich in den Freigabe-Funktionen die öffentliche ical-URL, die wir z.B. im ical-Adapter in ioBroker einlesen können.
Die folgende Anleitung nutzt die Script-Funktionen des Google Drives, d.h. wir müssen zunächst sicherstellen, dass alle Kontakte mit den Geburstagsinformationen auf einem Google-Konto unter contacts.google.com liegen. Besitzt man ein Apple-Produkt, lassen sich die Kontakte mit APPs sehr einfach mit dem Google-Konto synchronisieren (z.B. hier).
Wie schon beschrieben können wir sofort mit dem Standard-Geburtstags-Kalender die Geburtstage zwar anzeigen, aber nicht über eine ical-URL einbinden. Um dies zu ermöglichen legen wir zunächst einen neuen Kalender im Konto an, z.B. mit dem Namen „Geburtstagskalender“.
Nach der erfolgreichen Anlage des neuen Geburtstagskalenders ist dieser natürlich leer. Die Idee ist einfach: Wir kopieren alle Geburtstage aus dem google-eigenen Geburtstagskalender in unseren eigenen.
Dies können wir mit einem Script im Google Drive erledigen, also direkt auf drive.google.com gehen und ein neues Google APPs Script anlegen:
Zuvor sollten wir uns im Google-Kalender noch die beiden Kalender-IDs unseres eigenen Geburtstagskalenders und des google-eigenen Geburstagskalenders notieren, diese finden wir in den Einstellungen der Kalender unter dem Punkt „Kalender ID“.
Nach der Anlage eines neuen Google APPs Scripts können wir folgenden Code in das Script kopieren:
function Sync_Birth_Cal() { // Calendars adress (ID) var calendarSource = CalendarApp.getCalendarById("Kalender ID google-eigener Geburstagskalender@group.v.calendar.google.com"); var calendarDestination = CalendarApp.getCalendarById("Kalender ID eigener Geburstagskalender@group.calendar.google.com"); // Start and End Date definition var Today = new Date(); var StartDeleteDate = new Date(); var EndDeleteDate = new Date(); var StartCopyDate = new Date(); var EndCopyDate = new Date(); StartDeleteDate.setDate(Today.getDate()-400); EndDeleteDate.setDate(Today.getDate()+400); StartCopyDate.setDate(Today.getDate()-360); EndCopyDate.setDate(Today.getDate()+360); // first deletes all datas in calendar var eventToDelete = calendarDestination.getEvents(StartDeleteDate, EndDeleteDate); for (var i = 0; i < eventToDelete.length; i++) { eventToDelete[i].deleteEvent(); } // then copy everything again var eventToCopy = calendarSource.getEvents(StartCopyDate, EndCopyDate); for (var t in eventToCopy){ var newEvent = calendarDestination.createEvent(eventToCopy[t].getTitle(), eventToCopy[t].getStartTime(), eventToCopy[t].getEndTime()); } }
Das Script synchronisiert, genauer überträgt 1:1 die Einträge des google-Geburtstagskalenders in unseren Kalender, dies sollte natürlich regelmäßig passieren, also sollten wir einen Trigger anlegen, der die Übertragung der Einträge regelmäßig vornimmt:
Der Trigger kann individuell ähnlich einen Cron-Jobs konfiguriert werden, von minütlich bis täglich ist möglich, wir haben eine Synchronisierung 1x am Tag konfiguriert.
Anschließend können wir die ical-URL unseres gefüllten Geburtstagskalenders kopieren und im ical-Adapter in ioBroker einfügen:
Alle 30 Minuten werden die Kalendereinträge mit ioBroker synchronisiert und in den ioBroker-Objekten gespeichert:
Der Adapter legt die Daten bereits HTML-formatiert, in json-Objekten oder als Text-Objekt ab. Je nach Integration in VIS kann man eine der Varianten nutzen. Wir nutzen die HTML-formatierte Variante, weil in diese Fall die im Kalender-Feed angegeben Farben dargestellt werden:
Guter Ansatz! Ohne einen zusätzlichen Kalender habe ich es so umgesetzt: http://www.machs-smart.de/iobroker-google-geburstage-birthdays-ifttt/
Auch ein Weg mit IFTTT, allerdings können mit der Lösung im Datenpunkt keine Vorschauansichten, wie z.B. mit dem Kalenderelement in VIS integriert werden. Alerting/notification z.B. über pushover ist mit der Datenpunktlösung einfacher.
danke für das script – ist es möglich, dass script so zu verändern., dass man das alter bzw das geburtsjahr in den kalender zu bekommen – z.b. in der description
Gute Idee, wir nehmen uns dem Thema an, aktuell wird das Alter aus dem Google-Kontakt nicht im Google-Geburtstagskalender angezeigt, d.h. wir benötigen ein neues Script, das direkt auf den Kontakten aufsetzt.
Hi, habt ihr schon ein Script hinbekommen, welches das Geburtsjahr in die Beschreibung schreibt?
Nein, leider noch nicht geprüft, schauen wir uns bei nächster Gelegenheit an!
Hallo, vielen Dank für die grandiose Arbeit!
Hatte das Problem, dass beim einlesen mit dem iCal Adapter im ioBroker nicht der richtige Tag angezeigt wurde.
Hier ein Tipp; Wenn man im Script ganz unten in der for Schleife das „calendarDestination.createEvent“ ersetzt durch „calendarDestination.createAllDayEvent(“ wird es auch wirklich ein ganztägiger Termin und das Datum passt.
Danke, guter Tipp!
Hello zusammen,
ich hab leider noch ein kleines Problem. Ich möchte gerne für die neu erzeugten Termine die Startzeit und Endzeit auf 10:00 Uhr setzten.
Kann mir jemand verraten wie ich das Skript dementsprechend ändern muss?
Besten Dank!
Hi.
Bekomme das Script leider nicht zum laufen.
Habe exakt die Schritte befolgt, die hier stehen. Die Kalender ID des Source Kalenders ist keine eindeutige ID, wie die des Destination Kalenders. Also bei mir wird auf jeden Fall nur die Standard Adresse für den Kalender angezeigt mit der man immer auf den Kalender zugreifen kann: addressbook#contacts@group.v.calendar.google.com
Muss ich diese Adresse bei Source eintragen?
Als Fehlermeldung erhalte ich nach 6 Minuten „Exceeded maximum execution time“ und im Debugger sind keine Haltepunkte gesetzt.
Was kann ich tun, bzw. was mache ich falsch?
Freundliche Grüße
Genau das gleich Problem habe ich auch.
Viele Grüße
Servus Zusammen,
das Laufzeitproblem habe / hatte ich auch. Bei vielen Terminen ist die Laufzeit zu lang. Ich habe die Geburtstage auf das aktuelle Jahr begrenzt. Damit bin ich etwas weiter gekommen.
var Today = new Date();
var Datumstart = new Date(Today.getFullYear(),0,1);
var Datumende = new Date(Today.getFullYear(),11,31);
Viele Grüße
Hi, habt ihr schon ein Script hinbekommen, welches das Geburtsjahr in die Beschreibung schreibt?
Anleitung werden wir in Kürze veröffentlichen!
Gibts schon das neue Script ??
Hallo,
das Script würde mich auch interessieren. Hast du Neuigkeiten ?
Kommt bald, es läuft gerade im Testbetrieb…
Ganz klasse wäre auch, wenn man das Wort „hat“ entfernen könnte also nicht Vorname Nachname „hat“ Geburtstag
Sondern vl „Geburtstag Vorname Nachname“
Wäre Klasse, wenn das machbar wäre
Das Script mit Angabe des Alters haben wir in diesem Artikel beschrieben: https://www.smarthomejetzt.de/die-geburtstage-der-apple-und-android-kontakte-mit-alter-in-einem-kalender-in-der-vis-oberflaeche-auf-iobroker-anzeigen/