GoogleMaps API für erwartete Fahrzeit

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

Moderator: Co-Administratoren

Antworten
kafetzke
Beiträge: 23
Registriert: 30.07.2018, 13:47

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"

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 11.06.2019  Vers. 1.01 -----------------------------------------------------------
! 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
! ------------------------------------------------------------------------------------------------------------
!
! -- Einbindung in ein CCU-Programm --
! WENN 
!   maps_start > 0 (bei Änderung) ODER
!   maps_destination > 0 (bei Änderung) 
!  DANN
!   Script (dieses Framework)
!   maps_start = 0
!   maps_destination = 0
!
!
! -- Ansprechen des Frameworks --
! WENN
!   Zeitplan
! 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 = "yourKey";

! 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/directions/json?origin=xxx&destination=xxx&waypoints=via:xxx|via:xxx|via:xxx&mode=driving&language=de-DE&departure_time=now&key=[key]
!------------------------------------------------------------------------------------------------------------

string url = "https://maps.googleapis.com/maps/api/directions/json?origin=" # startpoint # "\&destination=" # 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("value : "#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("value : "#value);}
  duration = value;
}

!-----------  Dauer mit Verkehr --------------
string keyword = "duration_in_traffic";
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_in_traffic").State(value/60);
  if(debug) {WriteLine("value : "#value);}
  duration_in_traffic = value;
}

!---------- Ergebnis schreiben und Eingabe-Variablen zurücksetzen---
duration_diff = duration_in_traffic - duration;
if(debug) {WriteLine("duration_diff : "#duration_diff);}

dom.GetObject("maps_duration_diff").State(duration_diff/60);
MfG Kafetzke


-----
@edit: 11.06.2019 - Umbau als "Framework" inkl. Einbau-Beispiel im Script-Header

Antworten

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