Ich habe die Fahrtzeitabfrage aus diesem Thread "entkoppelt" in ein Frage- und ein Antwortprogramm, so wie hier auch vielfach empfohlen. Nun erschienen mir die von Google gemessenen Anfragen gegenüber den bei mir im Syslog protokollierten Anfragen aber zu hoch, um genau zu sein in der Regel doppelt so hoch. Nach dem Ausschließen, dass ich das Programm re-trigger oder sonstwie zwei mal aufrufe habe ich eben noch mal einen Test gemacht und das Skript direkt aus der SDV heraus laufen lassen.
Ausgangssituation: 6 Anfragen in der letzten Stunde laut Google
Nun starte ich in der SDV das Script im Programm, welches die Anfrage an die Distance API sendet (Api Key und Adressen ersetzt):
Code: Alles auswählen
!- Schickt die Abfragen für die Dauer an Google
! ------ Google Maps Traffic API 23.06.2019 Vers. 1.1 -----------------------------------------------------------
! by kafetzke
string execdevice = "CUxD.CUX2801001:7";
string apikey = "API Key";
string zuhause = "Zu Hause";
string arbeit = "Arbeit";
boolean richtung = dom.GetObject("verkehr_richtung").Value();
if (richtung){
string url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" # zuhause # "\&destinations=" # arbeit # "\&mode=driving\&language=de-DE\&departure_time=now\&key=" # apikey;
} else {
string url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" # arbeit # "\&destinations=" # zuhause # "\&mode=driving\&language=de-DE\&departure_time=now\&key=" # apikey;
}
string downloader = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl";
string cmd = downloader # " " # url;
!----------- Dauer mit Verkehr Joerg --------------
dom.GetObject(execdevice # ".CMD_SETS").State(cmd);
dom.GetObject(execdevice # ".CMD_QUERY_RET").State(1);
dom.GetObject(execdevice # ".CMD_RUNS").State(1);
dom.GetObject("verkehr_timestamp").State(system.Date("%H:%M"));
Code: Alles auswählen
! ------ Google Maps Traffic API 23.06.2019 Vers. 1.1 -----------------------------------------------------------
! by kafetzke
string execdevice = "CUxD.CUX2801001:7";
string stdout = "";
var value;
string temp_string;
!------------------------------------------------------------------------------------------------------------
! Los gehts...
!------------------------------------------------------------------------------------------------------------
!----------- Dauer mit Verkehr --------------
stdout = dom.GetObject(execdevice # ".CMD_RETS").State();
string keyword = "duration_in_traffic";
if (stdout)
{
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
value = 0 + temp_string.Substr(0,temp_string.Find("}"));
verkehr_dauer = (value/60).ToInteger();
}
}
dom.GetObject("SysLog").State(dom.GetObject("$this$").Name() #" wurde am "#system.Date("%d.%m. %H:%M:%S Uhr") #" beendet");
Danke für Eure Erklärungen, Hilfen und Tips.
Yosh