Deswegen hab ich heute mal einen kleinen Basteltag eingelegt: Wie verheirate ich den Google Kalender mit meiner Homematic?
Idee: Wenn es im Google Kalender ein Event "Urlaub" gibt, wird in der Homematic die "Urlaub" Systemvariable gesetzt.
Ich verwende dazu das (leider nicht mehr kostenlos erhältliche) Google Apps, aber es funktioniert genau so auch mit einem normalen Google-Mail Account.
Schritt 1:
Man erzeuge eine "Site", also eine Webpräsenz bei Google (sites.google.com). Wir brauchen das nur für eines: Wir brauchen einen Zugang zu den App-Scripts.
Dazu klicken wir auf unserer erzeugten Site auf das "Mehr" Menu (oben rechts) und rufen "Website verwalten" auf.
Auf der linken Seite bekommen wir jetzt, was wir alles mit unserer Site anstellen können, uns interessiert "App Scripts".
Google App Scripts sind im wesentlichen Javascript API's für FAST alles, was man auch mit der Google Web Oberfläche anstellen kann, und seit kurzem gibt
es dort auch einen "Content Service", mit dem man sehr einfach Web-Services bauen kann.
Ich möchte dazu wirklich auf die App-Scripts Dokumentation verweisen:
https://developers.google.com/apps-scri ... e?hl=de-DE
Die Idee ist jetzt, einen Web Service zu bauen, der "einfach" zurückliefert, ob am aktuellen Datum ein Event "Urlaub" im Kalender steht.
Das geht jetzt relativ einfach - wir nehmen dazu folgenden Code:
Code: Alles auswählen
// Script-as-app template.
function doGet(request) {
var answer = "1.0";
if ( request.parameters.cmd == "urlaub" )
{
answer = getVacation();
}
else if (request.parameters.cmd == "events" )
{
answer = getEventsToday();
}
return ContentService.createTextOutput(answer);
}
function getVacation()
{
var today = new Date();
today.getTime();
var events = CalendarApp.getEventsForDay(today);
var result = "0";
for (var i=0; i<events.length; i++)
{
if (events[i].getTitle() == "Urlaub")
{
result="1";
break;
}
}
return (result);
}
function getEventsToday()
{
var today = new Date();
today.getTime();
var events = CalendarApp.getEventsForDay(today);
var result = "";
for (var i=0; i<events.length; i++)
{
if ( result.length > 0) {
result = result+";";
}
result = result + events[0].getTitle().toLowerCase();
}
return (result);
}
Ich lasse die Web App für alle freigegeben, die URL ist mir kompliziert genug - wenn jemand Sicherheitsbedenken hat, muss man rausfinden wie man mit curl auf dem Google Server authentisiert
So, was man in dem Dialog dann findet ist die URL unseres Webservices - sieht etwa so aus:
Code: Alles auswählen
https://script.google.com/macros/s/snvfsdsasifxxvsdfjs_siaonefoiwffeseig/exec
Wenn man das im Browser aufruft, wird man ein lapidares "1.0" zurück bekommen - die Version unseres Web services.
Mit
Code: Alles auswählen
https://script.google.com/macros/s/snvfsdsasifxxvsdfjs_siaonefoiwffeseig/exec?cmd=urlaub
Wenn das klappt, sind wir einen grossen Schritt weiter:
Schritt 2:
Curl auf der CCU installieren. Dazu gibts hier http://homematic-forum.de/forum/viewtop ... 326#p35326 die Binaries und die Anleitung.
Schritt 3:
Das Ganze verheiraten. Wir brauchen jetzt ein Programm auf der CCU, das kurz nach Mitternacht läuft - bei mir heisst das Ding "Google Apps Interface" und läuft per Zeitmodul täglich um 0:08.
Zusätzlich brauchen wir eine Systemvariable (Boolean) mit dem Namen "Urlaub".
Das Programm ruft ein Script auf:
Code: Alles auswählen
!! Holt den Urlaubsstatus von Google Apps
var url="https://script.google.com/macros/s/snvfsdsasifxxvsdfjs_siaonefoiwffeseig/exec";
var cmd = "curl -s -k -L " # url # "?cmd=urlaub";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
var v = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
var oUrlaub = dom.GetObject("Urlaub");
if ( v == "1" )
{
oUrlaub.State ( true );
}
else
{
oUrlaub.State ( false );
}
Code: Alles auswählen
var url=...
Noch ein paar Anmerkungen:
- Ich hab mich bewusst für Plain-Text Antworten entschieden, damit die CCU nicht gross "rumparsen" muss. Google Apps kann auch XML oder JSON liefern.
- Der Web Service kann auch noch die Liste der Events am aktuellen Tag liefern ... dazu mit
Code: Alles auswählen
https://script.google.com/macros/s/snvfsdsasifxxvsdfjs_siaonefoiwffeseig/exec?cmd=events
- Es ist vermutlich eine gute Idee, für die Homematic einen eigenen Google Account anzulegen - das Script läuft mit den Rechten des Account Inhabers. Mit einem eigenen Account kann durch Freigaben die Rechte sehr viel feiner steuern.
- Das ganze ist erst einmal ein "Proof of Concept", um rauszufinden ob das alles tut. Mir fallen noch viele lustige Sachen ein, was man mit dem Interface zu Google machen kann ... Heizungsabsenkung für längere Abwesenheiten, das ultimative Weckerinterface (ich überlege grade wie das mit den CuxD Timern zusammenspielt ...)