Verkehrslage
Hier wird ein Device erstellt um sich die Verkehrslage einer bestimmten Strecke anzeigen zu lassen. Das ganze beruht auf dem Modul HTTPMOD.
Zielsetzung
Ziel ist es, dass ein Dummy die aktuelle Verkehrslage für einen bestimmten Weg anzeigt und sich regelmäßig aktualisiert.
Vorraussetzungen
Benötigt wird das Modul HTTPMOD, welches standardmäßig installiert ist. Weiterhin wird ein Google Account benötigt und ein API Key um auf die Daten der Google Verkehrslage zuzugreifen.
API Key von Google beziehen
Der Google API Key ist ein Schlüssel, welcher uns berechtigt Daten von Google zu erhalten. Google hat verschiedene Programme, welche über eine API Schnittstelle zur Verfügung gestellt werden. Damit nicht jeder einfach auf diese Daten zugreifen kann, wird der Key benötigt. Um diesen zu bekommen müsst ihr als aller erstes einen Google Account erstellen auf www.google.de
Sobald ihr dies habt, müssen wir in die Developer Console. Grund ist, dass der Zugriff auf die Daten eigentlich für Entwickler ist. Dorthin gelang ihr über diesen Link.
Als nächstes müsst ihr oben Links auf "Google APIs verwenden" klicken und ein neues Projekt erstellen, wenn ihr noch keins habt.
Jetzt in der Übersicht beim Reiter "Google APIs" unter Google Maps API "Google Maps Distance Matrix API" auswählen und dort auf den blauen Button "Enable" klicken.
Unter dem Reiter "Nutzung" könnt ihr später die Häufigkeit eurer Zugriffe anzeigen lassen. Unter dem Reiter "Kontingente" seht ihr, wie viele Zugriffe ihr an diesem Tag noch tätigen könnt. Insgesamt sind 2500 Zugriffe pro Tag erlaubt. Das sind etwa 1,7 Zugriffe pro Minute. So viele sollte man eigentlich nicht brauchen.
Auf der linken Seite unter "Zugangsdaten" kann man sich nun auch seinen Key anzeigen lassen. Diesen werden wir später für die Zugriffe benötigen.
Link für das Modul erstellen
https://maps.googleapis.com/maps/api/distancematrix/json?origins=ORT,STRASSE+NR&destinations=ORT,STRASSE+NR&mode=driving&language=de-DE&departure_time=now&key=APIKEY
Den Link müssen wir mit unseren eigenen Angaben ergänzen. Starten wir zB in Frankfurt an der Friedberger Straße 291 und wollen nach Gießen in die Straße Schiffenberger Weg 115 sieht unser Link wie folgt aus:
https://maps.googleapis.com/maps/api/distancematrix/json?origins=Frankfurt,Friedberger%20Stra%C3%9Fe%20291&destinations=Gie%C3%9Fen,%20Schiffenberger%20Weg%20115&mode=driving&language=de-DE&departure_time=now&key=APIKEY
Es empfiehlt sich den Link einmal in die Browserzeile einzugeben. Dann muss auch nicht auf Leerzeichen geachtet werden und Google formatiert ihn uns automatisch, wie wir ihn brauchen. Übrigens seht ihr dann auch, wie die Seite aussieht, auf welche wir später mit dem HTTPMOD Modul zugreifen werden.
HTTPMOD Einrichtung
Definieren des Device
Wenn wir nun unseren Google API Key und den Link haben, müssen wir ein neues Device mittels des HTTPMOD Moduls anlegen. In unserem Beispiel werden wir es wie folgt nennen: Verkehr.FFM.GI Verkehr für die Übersicht, FFM, weil wir ins Frankfurt am Main starten werden und GI, weil wir in Gießen enden.
Wir geben also folgendes in unsere Kommandozeile ein:
define Verkehr.FFM.GI HTTPMOD Link 3600
in unserem Beispiel also:
define Verkehr.FFM.GI HTTPMOD https://maps.googleapis.com/maps/api/distancematrix/json?origins=Frankfurt,Friedberger%20Stra%C3%9Fe%20291&destinations=Gie%C3%9Fen,%20Schiffenberger%20Weg%20115&mode=driving&language=de-DE&departure_time=now&key=APIKEY 3600
Die Zahl am Ende bestimmt die Häufigkeit der Abfrage in Sekunden. In unserem Fall also einmal die Stunde.
Anlegen der Attribute
Die benötigten Daten werden nun über die Attribut readingXXName und readingXXRegex abgefragt.
readingXXName: Hiermit geben wir dem späteren Reading einen Namen.
readingXXRegex: Hier wird festgelegt, welcher Teil des Textes "herausgeschnitten" werden soll.
XX: Wird durch Zahlen ersetzt, damit man eine Übersicht hat.
Als aller Erstes müssen wir uns unsere eigenen Attribute vorbereiten. Dies machen wir mit dem attr userattr wie folgt:
UserReadings Attribut
Hier definieren wir die später benötigte Attribute:
attr Verkehr.FFM.GI userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex
Mehr zu den Attributen unter HTTPMOD.
Legen wir nun unsere weiteren Attribut an:
Dauer der Reise
Die Dauer der Reise greifen wir mit den Attributen:
attr Verkehr.FFM.GI reading01Name duration attr Verkehr.FFM.GI reading01Regex "duration"\s*:\s*{\s*["\w\s:,]+"value"\s*:\s*(\d+)\s*}
Unser Reading wird später "duration" heißen. Darin wird die Dauer der Reise in Sekunden angegeben.
Dauer der Reise mit aktuellem Verkehr
Die Dauer der Reise mit Verkehr greifen wir mit den Attributen:
attr Verkehr.FFM.GI reading02Name duration_in_traffic attr Verkehr.FFM.GI reading02Regex "duration_in_traffic"\s*:\s*{\s*["\w\s:,]+"value"\s*:\s*(\d+)\s*}
Unser Reading wird später "duration" heißen. Darin wird die Dauer der Reise in Sekunden angegeben.
Entfernung
Die Entfernung greifen wir mit den Attributen:
attr Verkehr.FFM.GI reading03Name distance attr Verkehr.FFM.GI reading03Regex "distance"\s*:\s*{\s*["\w\s:,]+"value"\s*:\s*(\d+)\s*}
Unser Reading wird später "distance" heißen und uns die Entfernung angeben.
Zielort
Den Zielort greifen wir mit den Attributen:
attr Verkehr.FFM.GI reading04Name destination_addresses attr Verkehr.FFM.GI reading04Regex "destination_addresses"\s*:\s*\[\s*"([\w\s.,-:üöäß(\)]+)"\s*\]
Unser Reading wird später "destination_addresses" heißen und uns den Zielort angeben.
Startort
Den Startort greifen wir mit den Attributen:
attr Verkehr.FFM.GI reading05Name origin_addresses attr Verkehr.FFM.GI reading05Regex "origin_addresses"\s*:\s*\[\s*"([\w\s.,-:üöäß(\)]+)"\s*\]
Unser Reading wird später "origin_addresses" heißen und uns den Zielort angeben.
Berechnung der Werte für die spätere Anzeige
Damit die Werte später User freundlich angezeigt werden, lassen wir sie von FHEM berechnen:
attr Verkehr.FFM.GI userReadings duration_hr {strftime "%H:%M", gmtime( int( ReadingsVal("$name","duration",0) /60+0.5)*60 );}, duration_in_traffic_hr {strftime "%H:%M", gmtime( int( ReadingsVal("$name","duration_in_traffic",0) /60+0.5)*60 );}, distance_hr:distance {int( ReadingsVal("$name","distance",0) /1000+0.5);}, duration_diff {int((ReadingsVal("$name","duration_in_traffic",0)-ReadingsVal("$name","duration",0))/60+0.5);}, duration_diff_hr {my $diff=int((ReadingsVal("$name","duration_in_traffic",0)-ReadingsVal("$name","duration",0))/60+0.5); return "+".$diff if ($diff>0); return "+0";}
State Anzeige
Uns als letztes noch, wie wir das ganze in State angezeigt bekommen möchten:
attr Verkehr.FFM.GI stateFormat duration_hr duration_diff_hr Min. (distance_hr km)
Fertig
Fertig ist das Device, welches uns nun unseren Weg anzeigt. Natürlich könnt ihr die einzelnen Berechnungen und auch die State Anzeige für euch selbst anpassen und entsprechend ändern.
Anmerkung
Zwei Dinge möchte ich anmerken:
1. Das ganze beruht auf diesem und diesem Beitrag.
2. Sobald Google die Ausgabe der Website verändert, wird es vermutlich nicht mehr funktionieren. Wie ihr dem Thema im Forum entnehmen könnt, ist dies schon vorgekommen. Daher nicht wundern, sondern im Forum schauen, ob es schon eine Veränderung gibt oder selbst die Readings anpassen.