Wecken je nach Verkehrslage z.B. durch Abfrage von google maps (o.ä.)

Begonnen von schlupp, 13 Februar 2014, 00:02:34

Vorheriges Thema - Nächstes Thema

schlupp

Hallo,

ich würde gern einen Wecker realisieren, der die Verkehrslage auf meiner Arbeitsstrecke berücksichtigt.
D.h. er soll mich früher wecken wenn Stau ist.

Die aktuelle Fahrzeit kann man ja z.B. manuell über maps.google.de ermitteln.
Google zeigt z.B. bei Aufruf mit diesem Link
https://maps.google.de/maps?saddr=hamburg&daddr=oberhausen&hl=de
so etwas an:
Vorgeschlagene Routen

    A1  368 km, 3 Stunden 19 Minuten
    Bei aktueller Verkehrslage: 3 Stunden 37 Minuten


1) Wie kann ich das (den fett formatierten Teil als 03:37:00) zunächst einmal automatisch regelmässig aus der Website parsen um ein logfile und Tagesdiagramm der Fahrzeit zu erstellen?

2) Wie kann ich daraus einen entsprechenden Wecker mit "at" bauen? Der muss hier z.B. 5 Stunden vorher schonmal anfangen zu schauen wie die Situation ist und dann den eigentlichen Wecker anlegen. Falls sich in der Zwischenzeit der Stau auflöst, soll er mich bitte länger schlafen lassen...

3) Noch besser wäre natürlich, wenn man irgendwo nicht die aktuelle Verkehrslage sondern eine Prognose der Verkehrslage abfragen könnte z.B. wann muss ich losfahren, um gegen 8:00 anzukommen? (Dann noch die Zeit Dusche, Frühstück etc. aufschlagen) - zur Not könnte man sicherlich auch in fhem versuchen, einen Trend zu ermitteln und die Zeit zu extrapolieren - aber das ist bestimmt recht kompliziert.

=> Hat schon jemand so etwas in der Art realisiert, oder kann mir Code nennen, auf den ich aufsetzen könnte?

(Auch nützlich wäre so ein add-on: Hat's neu geschneit? Eher aufstehen zum Schnee räumen!)

Grüße


justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

Mein fhem schaut morgens von 05:00 - 06:35 alle 5 Minuten auf die Bahnwebseite, ob mein Zug pünktlich (06:36) kommt und schickt mir die aktuelle Lage als Popup auf den Radiowecker :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

marvin78

Darf ich fragen, was das für ein Radiowecker ist? Ich suche gerade sowas ;)

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

netbus

Hallo *
Da mich dieses Thema auch interessiert ist mir eingefallen, dass man diese speziellen Werte mittels Google API abfragen kann.
Weder XML oder JSON Format.
In meinem konkreten Fall sieht der Query so aus
http://maps.googleapis.com/maps/api/distancematrix/json?origins=Austria|st.poelten|&destinations=Austria|Vienna|&mode=driving&language=de-DE&sensor=false
Die Ausgabe sieht dann so aus
{
   "destination_addresses" : [ "Österreich", "Wien, Österreich" ],
   "origin_addresses" : [ "Österreich", "Sankt Pölten, Österreich" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "1 m",
                  "value" : 0
               },
               "duration" : {
                  "text" : "1 Minute",
                  "value" : 0
               },
               "status" : "OK"
            },
            {
               "distance" : {
                  "text" : "219 km",
                  "value" : 219198
               },
               "duration" : {
                  "text" : "2 Stunden, 16 Minuten",
                  "value" : 8153
               },
               "status" : "OK"
            }
         ]
      },
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "241 km",
                  "value" : 240984
               },
               "duration" : {
                  "text" : "2 Stunden, 19 Minuten",
                  "value" : 8360
               },
               "status" : "OK"
            },
            {
               "distance" : {
                  "text" : "64,4 km",
                  "value" : 64375
               },
               "duration" : {
                  "text" : "49 Minuten",
                  "value" : 2964
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}

Im diesem Beispiel ist die letzte Value (2964) die kürzeste und schnellste Route.
Jetzt kommt das HTTPMOD ins Spiel.
Wie kann man den Wert ("text" : "49 Minuten") über der Value extrahieren?

Hier die Google Doku
Google API

betateilchen

perl kann json, google doch einfach mal nach "perl json decode", da findest Du Beschreibungen, wie man auf die einzelnen Werte zugreift.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

netbus

Zitat von: betateilchen am 14 Februar 2014, 10:35:34"perl json decode"
das ist ein guter Hinweis.
Aber ich wüsste nicht wie ich in das Modul HTTPMOD noch ein perl json decode integriere.
Da HTTPMOD regex verwendet wäre es leichter den wert so zu extrahieren?!


StefanStrobel

Hallo,

da die HTTP-Response im konkreten Fall mehrere mögliche Ergebnisse enthält, wird es mit HTTPMOD derzeit kaum möglich sein, die kürzeste Dauer per Regex zu extrahieren. HTTPMOD müsste dafür so erweitert werden, dass es zunächst ein Array aller möglichen Matches liest und dann mit einer definierbaren Vergleichsfunktion das "richtige" Ergebnis auswählt.
Wenn es nur ein mögliches Ergebnis gäbe, dann sollte man mit einer geeigneten Regex den Wert nach "text" im Bereich zwischen "duration" und "status" matchen können. So kann es aber leider nicht klappen.

Ich pack das mal als mögliche Erweiterung auf meine Wunschliste für HTTPMOD Erweiterungen. Zunächst möchte ich da jedoch Sessions und "set" implementieren. Die Idee mit dem dynamischen Wecker ist aber auf jefen Fall super!

Gruss
    Stefan

netbus

Zitat von: StefanStrobel am 15 Februar 2014, 12:46:25
derzeit kaum möglich sein, die kürzeste Dauer per Regex zu extrahieren.
Hallo Stefan,
Jede Value hat bei dieser Google abfrage doch einen einmaligen Wert. In meinem Beispiel
{
                  "text" : "49 Minuten",
                  "value" : 2964
               }

Mit Regex kann man doch "Lookahead" machen. Man müsste nur von "2964" irgendwie 10 Zeichen davor matchen.
Bin leider ein Dau in Regex  ;D

Paul

Wieso irgendwie 10 Zeichen davor matchen?

Die 2964 sind doch die im Text dargestellten Minuten 2964:60= 49,.....
Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

betateilchen

Ich komme mir vor, als würde ein Blinder einem Tauben die Farben erklären.

Leute,  so eine JSON-Liste ist doch nichts weiter als ein großes verschachteltes Array, in dem man einfach mit der Bezeichnung auf jeden Wert zugreifen  kann.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Paul

Die obige googlemaps abfrage ist mE auch falsch mit

http://maps.googleapis.com/maps/api/distancematrix/json?origins=st.poelten|&destinations=Vienna|&mode=driving&language=de-DE&sensor=false

Bekomme ich

{
   "destination_addresses" : [ "Wien, Österreich" ],
   "origin_addresses" : [ "Sankt Pölten, Österreich" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "64,4 km",
                  "value" : 64375
               },
               "duration" : {
                  "text" : "49 Minuten",
                  "value" : 2964
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}


Also nur einmal value bzw text
Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

Paul

@Betateilchen

Habe etwas gegooglelt ,bin aber völliger Anfänger, wäre das so richtig

for (i = 0; i < myJSONResult.results.length; i++) {
  myFahrzeit[i] = myJSONResult.results[i].duration_value;
}
Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic