neues Modul: TRAFFIC - google maps directions

Begonnen von jmike, 27 Juli 2016, 10:51:23

Vorheriges Thema - Nächstes Thema

Amenophis86

Zitat von: jmike am 08 Oktober 2016, 14:51:15
btw, Wiki Eintrag ist fertig, c&c welcome: http://www.fhemwiki.de/wiki/TRAFFIC

Ich habe etliche Ideen von Euch übernommen, danke dafür :)

Sehr schön geschrieben. Vielen Dank :)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

tuppertasse

Zitat von: jmike am 08 Oktober 2016, 14:51:15
btw, Wiki Eintrag ist fertig, c&c welcome: http://www.fhemwiki.de/wiki/TRAFFIC
DICKES FETTES LOB nochmal für die super Modul und dem Wiki !!!

Zitat von: jmike am 28 September 2016, 11:47:57
Wie gesagt, ich denke über eine art Scheduler nach. von 6-9Uhr alle 5min, sonst 1 Stunde oder sowas.
Arbeitest du noch hierdran ?

raiderxxl

Super Teil!! Danke!!!

Nur ne kleine Bescheidene Frage.. wie bekomme ich aus dem Reading "eta" die Sekunden weg?

:-)

Danke
FHEM VM Ubuntu-Server auf Intel® NUC-Kit NUC6i5SYH ESXi 6.5
FHEM auf Raspberry2 OSMC Hyperion und TTS

Homematic,TradfriHub und Lampen,WIFILight,Fritzbox,FritzDECT,NanoCul433,IT Steckdosen,Diverse Nachbar-Sensoren,XiaomiZigbee,
ESP_Signalduino,ESPEasy,Amad,HarmonyHub,WLED,MQTT,Tasmota....

jmike

#93
Ich bekomm eine einfache Search/Replace Regex mit userReadings nicht ans fliegen.
Nachher noch mal mit etwas mehr Zeit schauen...

Das geht, sieht aber hässlich aus:
attr userReadings eta { my ( $eta ) = ReadingsVal($name,"eta","") =~ m/(\d+:\d+):\d+/;return $eta}

nachtrag.... so gehts auch, leider auch nicht schöner:
eta { my $eta = ReadingsVal($name,"eta",""); $eta =~ s/:\d+$//; $eta; }

jmike

Zitat von: tuppertasse am 09 Oktober 2016, 09:06:35
Arbeitest du noch hierdran ?

Hatte vergessen hierzu zu Antworten. Ja, habe es bereits umgesetzt und teste derzeit Intern.
Aktuell läuft es über ein Attribut "updateSchedule" welches Zeitangaben mit einem Interval definiert.
attr updateSchedule 6-8 300|16-18 300 

Das wäre zum Beispiel 5-minütige Updates von 6-8 und 16-18 Uhr. Ansonsten greift das DEF Interval und der Burst überschreibt alles.

Ideen/Ergänzungen?

mkriegl

Hi,

Modul Idee ist super.
Kann man das Modul um das Attribute Verkehrsmittel("mode") erweitern? Ich fahre eher Bus und Bahn.  :)
Verzögerungen werden dort zwar glaube ich nicht berücksichtigt, aber ich versuche momentan über Tasker die Heizung zu Hause z.B. eine Halbe Stunde vor Ankunft einzuschalten.
Momentan kann ich mit Tasker meine Position ermitteln und entweder direkt zu fhem übertragen oder auch als google maps link mit der Position in Koordinaten als "origin".
Der Task soll dann bei WLAN Verlust oder Außerhalb des Bereichs gestartet werden. Gleiches kann man vielleicht auch beim Einsteigen in ein Auto mit Bootooth Verbindung umsetzen, wer den "Drive" Modus verwendet wird.
Sinvoll wäre dann natürlich noch eine periodische Aktualisierung, wenn man sich bewegt, und einem minütlichen Counter, da in der UBahn kein Empfang ist.
Wie ich eine Bedingung bei meinem Fitness Studio Besuch einbaue, das auf dem Heimweg liegt und näher als 30min ist, weiß ich noch nicht, aber dort wird sich auch noch eine Lösung finden(Kalender, manuell, etc)

Gruß .. Maxl

mkriegl

#96
Zusatz:
Ich bekomme beim Modul einen REQUEST_DENIED, obwohl der gleiche Key mit HTTPMOD funktioniert. Ich habe aber festgestellt, dass die Links sich unterscheiden:

TRAFFIC:
https://maps.googleapis.com/maps/api/directions/json?origin=Stadt,Straße+HN&destination=Stadt,Straße+HN&mode=driving&language=de&departure_time=now&key=KEY_xxxx
HTTPMOD:
https://maps.googleapis.com/maps/api/distancematrix/json?origins=Stadt,Straße+HN&destinations=Stadt,Straße+HN&mode=driving&language=de-DE&departure_time=now&key=KEY_xxxx

Durch manuelles bearbeiten des http Link in der 98_TRAFFIC.pm sehe ich, dass man wohl doch noch mehr ändern müsste
Fehler:
2016.12.08 21:22:36 1: PERL WARNING: Use of uninitialized value $duration_in_traffic_sec in addition (+) at ./FHEM/98_TRAFFIC.pm line 316.
2016.12.08 21:22:36 1: TRAFFIC: (Fahrzeit) did not receive duration_in_traffic, not able to calculate delay
2016.12.08 21:22:36 5: TRAFFIC: (Fahrzeit) returning from TRAFFIC_DoUpdate: {"eta":"21:22:36","distance":null,"status":"OK","duration_in_traffic":null,"duration":null,"state":"OK"}
2016.12.08 21:22:36 3: TRAFFIC: (Fahrzeit) TRAFFIC_DoUpdate done
2016.12.08 21:22:36 3: TRAFFIC: (Fahrzeit) TRAFFIC_FinishUpdate start
2016.12.08 21:22:36 3: TRAFFIC: (Fahrzeit) ReadingsUpdate: eta - 21:22:36
2016.12.08 21:22:36 3: TRAFFIC: (Fahrzeit) ReadingsUpdate: distance -
2016.12.08 21:22:36 3: TRAFFIC: (Fahrzeit) ReadingsUpdate: status - OK
2016.12.08 21:22:36 3: TRAFFIC: (Fahrzeit) ReadingsUpdate: duration -
2016.12.08 21:22:36 3: TRAFFIC: (Fahrzeit) ReadingsUpdate: duration_in_traffic -
2016.12.08 21:22:36 3: TRAFFIC: (Fahrzeit) ReadingsUpdate: state - OK
2016.12.08 21:22:36 5: TRAFFIC: (Fahrzeit) set Fahrzeit ?
2016.12.08 21:22:36 3: TRAFFIC: (Fahrzeit) TRAFFIC_FinishUpdate done


JSON Output von mode="transit":
{
   "destination_addresses" : [ "Street NR, PLZ City, Deutschland" ],
   "origin_addresses" : [ "Street NR, PLZ City, Deutschland" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "11,3 km",
                  "value" : 11282
               },
               "duration" : {
                  "text" : "32 Minuten",
                  "value" : 1927
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}


JSON Output von mode="driving":
{
   "destination_addresses" : [ "Street NR, PLZ City, Deutschland" ],
   "origin_addresses" : [ "Street NR, PLZ City, Deutschland" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "8,7 km",
                  "value" : 8710
               },
               "duration" : {
                  "text" : "22 Minuten",
                  "value" : 1313
               },
               "duration_in_traffic" : {
                  "text" : "20 Minuten",
                  "value" : 1201
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}


Mir ist auch aufgefallen, das in das attr start/end_adress ein "+" zwischen Strasse und Hausnummer muss. Ansonsten wird der Link mit einem Leerzeichen generiert. Fehlt noch in der Beschreibung  ;)

jmike

Hi Max.

Zuerst zum REQUEST_DENIED.
"directions" und "distancematrix" haben unterschiedliche API Keys. Einfach im API Manager für directions einen Key anfordern.


Die directions-API unterstützt ja verschiedene Travelmodes (driving (Standard), walking, bicycling und transit).
Dazu werde ich gerne im nächsten Release ein Attribut einbauen.

Der ist eh schon lange überfällig damit tuppertasse endlich seinen flexiblen update-schedule bekommt :)

mkriegl

Danke für die Info. Das JSON liefert scheinbar genau die gleichen Informationen, nur anders aufgebaut. Dann ändere ich das heute Abend gleich mal.
Was mir im Code auch gefehlt hat oder ich übersehen habe war distance als value. Vielleicht kannst den dann auch gleich mit rein nehmen.
Danke dir auf alle fälle. Was mir bisher Angezeigt wurde hat mir schon sehr gefallen.

jmike

Zitat von: mkriegl am 09 Dezember 2016, 15:11:32
Was mir im Code auch gefehlt hat oder ich übersehen habe war distance als value.

Distance wird nur als string angegeben, wenn du die Meter als Zahl haben willst geht das derzeit nur über das Attribut "raw_data".
Dann bekommst du bei allen Werten auch "value" als Reading.

lg
mike

mkriegl

Ah, okay, der "raw_data" ist mir neu und die distance value Rückgabe hatte ich dann im Code nicht gesehen.

awex102

Hallo,

vielen Dank für das Modul!

Eine Frage: Zwecks Einbindung in tablet UI:

Wie kann ich ein Reading im Format "hh:min" bereitstellen?

Danke und Gruß

Amenophis86

Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Brause

Guten Morgen

Ich habe gerade das Traffic-Modul bei mir eingerichtet, habe aber ein kleines Problem.

Wenn ich stateReading = delay_min setze bekomme ich im state = OK und im Log die Meldung "stateReading delay_min not found"
obwohl er es mir in den Readings auch aktualisiert.
stateReading = delay funktioniert. Ich wollte es aber ohne die Minuten.

Hier mal das list und das Log bei verbose = 5

Internals:
   APIKEY     xxxxxxxx
   CFGFN
   DEF        xxxxxxxx
   Interval   3600
   NAME       xx.Verkehr.Conti
   NR         781187
   STATE      OK
   TRIGGERTIME 1481525969.60648
   TRIGGERTIME_FMT 2016-12-12 07:59:29
   TYPE       TRAFFIC
   VERSION    1.0
   Readings:
     2016-12-12 06:59:30   delay           0 min
     2016-12-12 06:59:30   delay_min       0
     2016-12-12 06:59:30   distance        4,5 km
     2016-12-12 06:59:30   duration        7 Minuten
     2016-12-12 06:59:30   duration_in_traffic 7 Minuten
     2016-12-12 06:59:30   duration_in_traffic_min 7
     2016-12-12 06:59:30   duration_min    7
     2016-12-12 06:59:30   eta             07:06:50
     2016-12-12 06:59:30   return_delay    0 min
     2016-12-12 06:59:30   return_delay_min 0
     2016-12-12 06:59:30   return_distance 4,5 km
     2016-12-12 06:59:30   return_duration 7 Minuten
     2016-12-12 06:59:30   return_duration_in_traffic 7 Minuten
     2016-12-12 06:59:30   return_duration_in_traffic_min 7
     2016-12-12 06:59:30   return_duration_min 7
     2016-12-12 06:59:30   return_eta      07:06:26
     2016-12-12 06:59:30   return_state    OK
     2016-12-12 06:59:30   return_status   OK
     2016-12-12 06:59:30   state           OK
     2016-12-12 06:59:30   status          OK
Attributes:
   alias      Fahrzeit auf Arbeit
   end_address xxxxxxx
   includeReturn 1
   language   de
   outputReadings min text
   raw_data   0
   room       hidden
   start_address xxxxxxx
   stateReading delay_min
   userattr   end_address includeReturn language outputReadings raw_data start_address stateFormat stateReading verbose
   verbose    5



2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti update
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) update command recieved
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) no update burst set
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:28 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:29 3: TRAFFIC: (xx.Verkehr.Conti) internal interval timer set to call StartUpdate again in 3600 seconds
2016.12.12 06:59:29 3: TRAFFIC: (xx.Verkehr.Conti) TRAFFIC_DoUpdate start
2016.12.12 06:59:29 3: TRAFFIC: (xx.Verkehr.Conti) internal interval timer set to call GetUpdate again in 3600 seconds
2016.12.12 06:59:29 5: TRAFFIC: (xx.Verkehr.Conti) no waypoints specified
2016.12.12 06:59:29 2: TRAFFIC: (xx.Verkehr.Conti) using https://maps.googleapis.com/maps/api/directions/json?origin=xxxxxxx&destination=xxxxxxx&mode=driving&language=de&departure_time=now&key=xxxxxxxx
2016.12.12 06:59:29 3: TRAFFIC: (xx.Verkehr.Conti) TRAFFIC_DoUpdate start
2016.12.12 06:59:29 3: TRAFFIC: (xx.Verkehr.Conti) internal interval timer set to call GetUpdate again in 3600 seconds
2016.12.12 06:59:29 5: TRAFFIC: (xx.Verkehr.Conti) no waypoints specified
2016.12.12 06:59:29 2: TRAFFIC: (xx.Verkehr.Conti) using https://maps.googleapis.com/maps/api/directions/json?origin=xxxxxx&destination=xxxxxx&mode=driving&language=de&departure_time=now&key=xxxxxxxxx
2016.12.12 06:59:29 3: TRAFFIC: (xx.Verkehr.Conti) delay in seconds = 441 - 443
2016.12.12 06:59:29 5: TRAFFIC: (xx.Verkehr.Conti) delay_min was negative or less than 1min (-2), set to 0
2016.12.12 06:59:29 5: TRAFFIC: (xx.Verkehr.Conti) returning from TRAFFIC_DoUpdate: {"eta":"07:06:50","delay_min":0,"duration_min":7,"distance":"4,5 km","status":"OK","duration_in_traffic_min":7,"state":"OK","delay":"0 min","duration_in_traffic":"7 Minuten","duration":"7 Minuten"}
2016.12.12 06:59:29 3: TRAFFIC: (xx.Verkehr.Conti) TRAFFIC_DoUpdate done
2016.12.12 06:59:29 3: TRAFFIC: (xx.Verkehr.Conti) delay in seconds = 417 - 419
2016.12.12 06:59:29 5: TRAFFIC: (xx.Verkehr.Conti) delay_min was negative or less than 1min (-2), set to 0
2016.12.12 06:59:29 5: TRAFFIC: (xx.Verkehr.Conti) returning from TRAFFIC_DoUpdate: {"duration_in_traffic":"7 Minuten","delay":"0 min","duration":"7 Minuten","duration_min":7,"delay_min":0,"eta":"07:06:26","duration_in_traffic_min":7,"state":"OK","status":"OK","distance":"4,5 km"}
2016.12.12 06:59:29 3: TRAFFIC: (xx.Verkehr.Conti) TRAFFIC_DoUpdate done
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) TRAFFIC_FinishUpdate start
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: duration - 7 Minuten
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: duration_in_traffic - 7 Minuten
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: delay - 0 min
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: status - OK
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: duration_in_traffic_min - 7
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: state - OK
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: distance - 4,5 km
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: duration_min - 7
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: delay_min - 0
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: eta - 07:06:50
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) stateReading defined, override state
2016.12.12 06:59:30 1: TRAFFIC: (xx.Verkehr.Conti) stateReading delay_min not found
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) TRAFFIC_FinishUpdate done
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) TRAFFIC_FinishUpdate start
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: delay - 0 min
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: duration_in_traffic - 7 Minuten
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: duration - 7 Minuten
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: delay_min - 0
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: eta - 07:06:26
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: duration_min - 7
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: distance - 4,5 km
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: duration_in_traffic_min - 7
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: status - OK
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) ReadingsUpdate: state - OK
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) stateReading defined, override state
2016.12.12 06:59:30 1: TRAFFIC: (xx.Verkehr.Conti) stateReading delay_min not found
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 5: TRAFFIC: (xx.Verkehr.Conti) set xx.Verkehr.Conti ?
2016.12.12 06:59:30 3: TRAFFIC: (xx.Verkehr.Conti) TRAFFIC_FinishUpdate done


Gruss Brause

jmike

Hi Brause.

Kann ich so reproduzieren, liegt offensichtlich an meiner Prüfung und dem Wert 0.

Fix kommt mit in den nächsten Release (eta ~Ende der Woche).