Auf Basis von einem Google Maps Widget baue ich mir für mein Dashboard eine Anzeige der aktuellen Verkehrslage zur Arbeit und weiteren Locations.

https://community.openhab.org/t/google-maps-widget-with-traffic/40285

Als erstes brauchen wir von Google ein API für den Abruf der Daten. Dazu ist natürlich ein Googlekonto erforderlich und gleich vorweg auch Kreditkartendaten, auch wenn diese nie belastet wird.

Über diesen Link kommen wir direkt zu der Google Maps API: https://cloud.google.com/maps-platform/

Über „Jetzt starten“ aktivieren wir die Google Maps Platform.

Im Popup „Maps“ anklicken, Weiter

Ein neues Projekt anlegen, Name ist egal.

Nun bin ich mir leider nicht mehr sicher, aber im nächsten Schritt wird ein API Key angelegt. Im Reiter „APIs“ habe ich das „Distance Matrix API“ ausgewählt, was anderes brauche ich nicht.

Nun ist es möglich die erste Abfrage zu starten. In der Adresszeile des Webbrowsers kann einen ersten Test machen. Nicht vergessen <APIKEY> durch euren API-Key zu ersetzten.

https://maps.googleapis.com/maps/api/distancematrix/json?origins=Taunusstraße,+86368+Gersthofen&destinations=Bürgermeister-Ulrich-Straße+100,+86199+Augsburg&language=DE&departure_time=now&traffic_model=best_guess&mode=driving&key=<APIKEY>

Das Ergebnis sieht so aus:

Sehr schön, das hat schon mal geklappt. Das wird aber höchstens ein paar mal funktionieren, bis Google einem mitteilt, man solle doch Abrechnungsinformationen eingeben. Da kommen wir leider nicht drum rum, wir müssen Google die Kreditkarteninfos mitteilen, sonst erlaubt uns Google keine Abfragen mehr. 

Ist das erledigt, können wir weiterhin Abfragen von Google tätigen. Um die Abfrage auf unsere Bedürftnisse anzupassen, sollten wir natürlich noch die Start und Zieladresse bearbeiten. Es bietet sich an, Google Maps aufzurufen, die Adresse einzugeben und sich den String aus der Adressleiste zu klauen.

  • origins –> Startadresse
  • destinations –> Zieladresse

Zurück zu Openhab auf die PaperUI. Wir benötigen das HTTP Binding (unter Add-ons/Bindings) und das JSONPath transformation (Add-ons/Transformations).

Nun noch auf der Console eine Items-Datei erstellen und schon kann man mit den Daten arbeiten.

 

String	GoogleMaps_me_distance				"Distance [%s]"		(gGoogleMaps)	{ http="<[https://maps.googleapis.com/maps/api/distancematrix/json?origins=Amsterdam&destinations=Rotterdam&language=NL&departure_time=now&traffic_model=best_guess&mode=driving&key=YOUR_API_KEY:300000:JSONPATH($.rows[0].elements[0].distance.text)]" }
String	GoogleMaps_me_duration				"Duration [%s]"		(gGoogleMaps)	{ http="<[https://maps.googleapis.com/maps/api/distancematrix/json?origins=Amsterdam&destinations=Rotterdam&language=NL&departure_time=now&traffic_model=best_guess&mode=driving&key=YOUR_API_KEY:300000:JSONPATH($.rows[0].elements[0].duration.text)]" }
String	GoogleMaps_me_duration_traffic		"Duration [%s]"		(gGoogleMaps)	{ http="<[https://maps.googleapis.com/maps/api/distancematrix/json?origins=Amsterdam&destinations=Rotterdam&language=NL&departure_time=now&traffic_model=best_guess&mode=driving&key=YOUR_API_KEY:300000:JSONPATH($.rows[0].elements[0].duration_in_traffic.text)]" }

String	GoogleMaps_wife_distance			"Distance [%s]"		(gGoogleMaps)	{ http="<[https://maps.googleapis.com/maps/api/distancematrix/json?origins=Amsterdam&destinations=Haarlem&language=NL&departure_time=now&traffic_model=best_guess&mode=driving&key=YOUR_API_KEY:300000:JSONPATH($.rows[0].elements[0].distance.text)]" }
String	GoogleMaps_wife_duration			"Duration [%s]"		(gGoogleMaps)	{ http="<[https://maps.googleapis.com/maps/api/distancematrix/json?origins=Amsterdam&destinations=Haarlem&language=NL&departure_time=now&traffic_model=best_guess&mode=driving&key=YOUR_API_KEY:300000:JSONPATH($.rows[0].elements[0].duration.text)]" }
String	GoogleMaps_wife_duration_traffic	"Duration [%s]"		(gGoogleMaps)	{ http="<[https://maps.googleapis.com/maps/api/distancematrix/json?origins=Amsterdam&destinations=Haarlem&language=NL&departure_time=now&traffic_model=best_guess&mode=driving&key=YOUR_API_KEY:300000:JSONPATH($.rows[0].elements[0].duration_in_traffic.text)]" }