GoogleMaps API für erwartete Fahrzeit

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

kafetzke
Beiträge: 34
Registriert: 30.07.2018, 13:47
Hat sich bedankt: 2 Mal
Danksagung erhalten: 5 Mal

GoogleMaps API für erwartete Fahrzeit

Beitrag von kafetzke » 10.06.2019, 16:07

Moin zusammen,

ich habe mal ein Script gebaut, anhand dessen man per GoogleMaps API die erwartete Fahrzeit zwischen zwei Kartenpunkten sowie die Entfernung der Strecke ausgeben kann. Sinn der Aktion ist z.B. das Stellen des Weckers des Morgens ;-)

Wichtig: das Script benötigt einen API-Key. Hierzu ist eine Registrierung notwendig - dann gibt es kostenloses Kontinget von Google (die Kreditkarte ist tatsächlich nur zur Verifizierung notwendig). https://cloud.google.com/maps-platform/?apis=routes

Beispiel für akzeptierte Adressen:
"Flughagen+Hannover"
"Sattlerstrasse+10+30916+Isernhagen"
"Disneyland+Paris"

Achtung: es wird kein "ß" akzeptiert. Es muss also im Zweifel "Strasse" heißen...

Hinweis: "duration" und "duration_in_traffic" sind faktisch nie identisch, da Google diese unterschiedlich berechnet. "duration_in_traffic" ist die "realistischere" Angabe.

Code: Alles auswählen

! ------  Google Maps Traffic API 23.06.2019  Vers. 1.1 -----------------------------------------------------------
! by kafetzke
! 
!
! ------------------ EINRICHTUNG Anfang -------------------
!
! Anzulegen fuer das Script sind die 
! folgenden Systemvariablen
! --------------------------------------------------------------
! maps_start                   String
! maps_destination             String
! maps_duration                Zahl
! maps_duration_in_traffic     Zahl
! maps_duration_diff           Zahl
! maps_distance                Zahl
! maps_timestamp               String
! ------------------------------------------------------------------------------------------------------------
!
! -- Einbindung in ein CCU-Programm --
! WENN 
!   Zeitplan (z.B: alle 5min)
!  DANN
!   Script (dieses Framework)
!   
!
! -- Ansprechen des Frameworks --
! WENN
!   Zeitpunkt (z.B. 06:00-12:00)
! DANN
!   maps_start = Startadresse
!   maps_destination = Zieladresse
!
!
! -- Nutzung (Beispiel)
! WENN
!   maps_duration_diff > 0 (bei Änderung)
! DANN
!   tuWas
!
! ------------------------------------------------------------------------------------------------------------
! Debugging einschalten = true oder aussschalten = false
! z.B. zum Test unter "Script testen"
!
! ------------------------------------------------------------------------------------------------------------
boolean debug = true;

! --------------------------------------------------------------
! Virtuelles CUxD-Exec-Device hier angeben
! --------------------------------------------------------------
string execdevice = "CUxD.CUX2801001:1";

! --------------------------------------------------------------
! Die API verlangt nach einem Key. Hierzu ist eine Registrierung notwendig - dann gibt es kostenloses Kontinget
! https://cloud.google.com/maps-platform/?apis=routes

string apikey = "YourGoogleApiKey";

! Start und Endpunkt können wie ein Suchbegriff auf GoogleMaps angegeben werden. Wichtig: Leerzeichen sind durch "+" zu ersetzen

string startpoint = dom.GetObject("maps_start").Value();
string endpoint = dom.GetObject("maps_destination").Value();


!------------------ EINRICHTUNG ENDE -------------------

!------------------------------------------------------------------------------------------------------------
! Aufruf der Google-API
! https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins=Washington,DC&destinations=New+York+City,NY&departure_time=now&key=YOUR_API_KEY
!------------------------------------------------------------------------------------------------------------

string url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" # startpoint # "\&destinations=" # endpoint # "\&mode=driving\&language=de-DE\&departure_time=now\&key=" # apikey;

if(debug){WriteLine("url: " #url);}

string downloader = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl";
string stdout = "";
string cmd = downloader # " " # url;
var ret;

!------------------------------------------------------------------------------------------------------------
! Los gehts...
!------------------------------------------------------------------------------------------------------------
var duration = 0;
var duration_in_traffic = 0;
var duration_diff = 0;

WriteLine("cmd : "#cmd);

ret= dom.GetObject(execdevice # ".CMD_SETS").State(cmd);
if(debug){WriteLine("ret cmd_sets : "#ret);}
ret = dom.GetObject(execdevice # ".CMD_QUERY_RET").State(1);
if(debug){WriteLine("ret cmd_query_ret: "#ret);}
stdout = dom.GetObject(execdevice # ".CMD_RETS").State();


!-----------  Entfernung --------------
string keyword = "distance";
if (stdout)
{
  string temp_string = stdout.Substr(stdout.Find(keyword));
  temp_string = temp_string.Substr(temp_string.Find("value")+8);
  
  ! Diese schreibweise sorgt für einen double-Wert
  var value = 0.0 + temp_string.Substr(0,temp_string.Find("}"));
  
  dom.GetObject("maps_distance").State(value/1000);
  if(debug) {WriteLine("distance : "#value);}
  
}

!-----------  Dauer --------------
string keyword = "duration";
if (stdout)
{
  string temp_string = stdout.Substr(stdout.Find(keyword));
  temp_string = temp_string.Substr(temp_string.Find("value")+8);
  
  ! Diese schreibweise sorgt für einen Integer-Wert
  var value = 0 + temp_string.Substr(0,temp_string.Find("}"));
  
    dom.GetObject("maps_duration").State(value/60);
  if(debug) {WriteLine("duration : "#value);}
  duration = value;
}

!-----------  Dauer mit Verkehr --------------
string keyword = "duration_in_traffic";
if (stdout)
{
  string temp_string = stdout.Substr(stdout.Find(keyword));
  
  if (temp_string <> "")
  {
    temp_string = temp_string.Substr(temp_string.Find("value")+8);

    ! Diese schreibweise sorgt für einen Integer-Wert
    var value = 0 + temp_string.Substr(0,temp_string.Find("}"));
    dom.GetObject("maps_duration_in_traffic").State(value/60);
    
    if(debug) {WriteLine("duration_in_traffic: "#value);}
    duration_in_traffic = value;
    }
  else
  {
    duration_in_traffic = duration;
  }
}

!---------- Ergebnis schreiben und Eingabe-Variablen zurücksetzen---
if (duration_in_traffic > duration)
{
  duration_diff = duration_in_traffic - duration;
  if(debug) 
  {
    WriteLine("Verzögerung gefunden! "#duration_diff#"min");
  }
}
else
{
  duration_diff = 0;
}
if(debug) 
{
  WriteLine("duration_diff : "#duration_diff);
}

dom.GetObject("maps_duration_diff").State(duration_diff/60);
dom.GetObject("maps_timestamp").State(system.Date("%Y-%m-%d %H:%M:%S").ToTime());
MfG Kafetzke


-----
@edit 11.06.2019: Umbau als "Framework" inkl. Einbau-Beispiel im Script-Header
@edit 17.06.2019: Hinweis bzgl. "ß" ergänzt
@edit 18.06.2019: v1.01: Prüfung auf duration_in_traffic; timestamp zurückschreiben
@edit 23.06.2019: v.1.1: Umbau von directions-API auf distancematrix-API (bessere Gesamtperformance)

kafetzke
Beiträge: 34
Registriert: 30.07.2018, 13:47
Hat sich bedankt: 2 Mal
Danksagung erhalten: 5 Mal

Re: GoogleMaps API für erwartete Fahrzeit

Beitrag von kafetzke » 29.08.2019, 10:22

Zur besseren Pflege ist das Script nun auf GitHub zu finden:

Code: Alles auswählen

https://github.com/kafetzke/homatic-script-googleMaps

smages
Beiträge: 3
Registriert: 18.04.2020, 22:28
Hat sich bedankt: 3 Mal

Re: GoogleMaps API für erwartete Fahrzeit

Beitrag von smages » 19.12.2020, 11:07

Hallo Kafetzke,

danke vielmals für dein Script.
Ich habe da ein kleines Problem, denke da stimmt was nicht mit den Daten/Berechnungen. Ein Tipp zur Fehlerbehebung wäre klasse!
Bildschirmfoto 2020-12-19 um 11.05.11.png
Viele Grüße, Stefan

Stieger
Beiträge: 264
Registriert: 01.05.2014, 18:26
Danksagung erhalten: 1 Mal

Re: GoogleMaps API für erwartete Fahrzeit

Beitrag von Stieger » 29.01.2021, 06:55

Hallo Kafetzke

Ich habe eine kleine Frage zu deinem Script. Jeden Morgen schaue ich in Google Maps welcher Arbeitsweg der schnellste ist. Je nach Verkehr ist dies die Autobahn oder halt Überland. Wäre es möglich mit diesem Script dies automatisch abzufragen und dann jeden Morgen eine Push zukommen zu lassen?

Also z.B: "Heute ist der Weg über die Autobahn schneller".

Die Push würde ich über Pocketcontrol realisieren.

Vielen Dank für deine Hilfe.

Mit freundlichen Grüssen
Thomas

Accuracy
Beiträge: 746
Registriert: 22.05.2013, 16:37
Hat sich bedankt: 1 Mal

Re: GoogleMaps API für erwartete Fahrzeit

Beitrag von Accuracy » 31.01.2022, 13:55

hi,
ich glaube auch mit dem Skript stimmt was nicht. Bei mir werden die Variablen auch sehr seltsam gefüllt
Wenn ich hingegen den
Bildschirmfoto 2022-01-31 um 13.39.50.png
Google - API aufruf (aus dem skript) dirket im browser mache, dann stimmen die rückgabewerte im json. Allerdings werden die nicht so in meine variablen eingetragen, seltsamerweise.

MichaelN
Beiträge: 9534
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 692 Mal
Danksagung erhalten: 1604 Mal

Re: GoogleMaps API für erwartete Fahrzeit

Beitrag von MichaelN » 31.01.2022, 14:00

Die im Skript verwendete Methode basiert auf Suchbegriffe und feste Positionen. Wenn sich irgendwas an der API Ausgabe ändert kommt schnell Müll raus. Musst Du mal die Ausgabe mit dem vergleichen, was das Skript tut. Der TO ist hier wohl nicht mehr aktiv.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Accuracy
Beiträge: 746
Registriert: 22.05.2013, 16:37
Hat sich bedankt: 1 Mal

Re: GoogleMaps API für erwartete Fahrzeit

Beitrag von Accuracy » 31.01.2022, 16:20

ja das habe ich ja eigentlich gemacht.
ich habe den API call mal direkt im browser gemacht:

https://maps.googleapis.com/maps/api/di ... Pz-bhhCMvY
(api und Adresse geändert)

und das funktioniert tadellos. Trage ich aber genau die gleiche Adresse beim Start und Endpunkt ein: string endpoint = dom.GetObject("Leipzig").Value(); dann kommt nur mist in den Variablen an. Hast du noch einen Rat?


"rows" : [
{
"elements" : [
{
"distance" : {
"text" : "52,2 km",
"value" : 52233
},
"duration" : {
"text" : "42 Minuten",
"value" : 2515
},
"duration_in_traffic" : {
"text" : "44 Minuten",
"value" : 2624
},
"status" : "OK"
}
]
}
],
"status" : "OK"
}

MichaelN
Beiträge: 9534
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 692 Mal
Danksagung erhalten: 1604 Mal

Re: GoogleMaps API für erwartete Fahrzeit

Beitrag von MichaelN » 31.01.2022, 16:26

Accuracy hat geschrieben:
31.01.2022, 16:20
string endpoint = dom.GetObject("Leipzig").Value();
Und deine Systemvariable für den Endpunkt heißt auch Leipzig?
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Accuracy
Beiträge: 746
Registriert: 22.05.2013, 16:37
Hat sich bedankt: 1 Mal

Re: GoogleMaps API für erwartete Fahrzeit

Beitrag von Accuracy » 31.01.2022, 16:55

habe es hinbekommen nur die maps_duration_diff zeigt leider weiterhin 0 an.

MichaelN
Beiträge: 9534
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 692 Mal
Danksagung erhalten: 1604 Mal

Re: GoogleMaps API für erwartete Fahrzeit

Beitrag von MichaelN » 31.01.2022, 17:28

Dann schau dir doch das ganze mal unter "Skript testen' an. Das Skript hat doch debug Ausgaben.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“