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

CarstenHofmann

Moin zusammen,

auch ich habe mich schon daran versucht und bin mit dem HTTPMOD alleine gescheitert. Da ich aber auch einen Apache auf meinem RPi betreibe, auf dem fhem läuft, habe ich ein kleines php-Script gebastelt, dass mir die Daten schön aufbereitet und dann in einem gescheiten Format HTTPMOD zur Verfügung stellt. Das ist aber nur die erste Stufe - Ziel ist es ein eigenes Module für fhem zu bauen.

Für das RIS der Bahn habe ich schon ein fhem-Modul auf Basis der HttpUtils gebastelt, dass ich gerade ausgiebig teste. Das kann ich gerne auch zur Verfügung stellen, wenn es fertig ist.

Aber zurück zu google-maps...

Als URL verwende ich in dem php-script:
http://maps.google.de/maps?saddr=#START#&daddr=#ZIEL#&hl=de

also nach dem Schema (keine Leerzeichen!)
http://maps.google.de/maps?saddr=Fischmarkt,Hamburg&daddr=HamburgHbf&hl=de

da wir ja 'n' Routen von Google bekommen, nutze ich folgendes regexp mit preg_match_all in php:
|<li class="dir-altroute".*<div class="altroute-rcol altroute-info"> <span>(.*) km</span>, <span>(.*)</span>.*<span>Bei aktueller Verkehrslage: (.*)</span>  </div> <div>(.*)</div>    <div class="dir-altroute-clear">.*</li>|U

Als Ausgabe habe ich dann "routeName:'Reeperbahn'distance:'4.7'travelTime:'10'trafficTime:'14'"

Die Config in fhem schaut dabei dann so aus:

define MAPS_HH HTTPMOD http://127.0.0.1/maps.php?i=0 300
attr MAPS_HH group Verkehrslage
attr MAPS_HH readingsName1 routeName
attr MAPS_HH readingsName2 distance
attr MAPS_HH readingsName3 travelTime
attr MAPS_HH readingsName4 trafficTime
attr MAPS_HH readingsRegex1 routeName:'(.{0,50})'distance
attr MAPS_HH readingsRegex2 distance:'([\d.]+)'
attr MAPS_HH readingsRegex3 travelTime:'([\d]+)'
attr MAPS_HH readingsRegex4 trafficTime:'([\d]+)'
attr MAPS_HH room Verkehr
attr MAPS_HH stateFormat {sprintf("Route: %s - Entfernung %.0f km, Verkehr %.0f Min, Reise %.0f Min, Verzögerung %.0f Min", ReadingsVal($name,"routeName",0), ReadingsVal($name,"distance",0), ReadingsVal($name,"trafficTime",0), ReadingsVal($name,"travelTime",0), ReadingsVal($name,"delayTime",0))}
attr MAPS_HH timeout 20
attr MAPS_HH userReadings delayTime { ReadingsVal($name,"trafficTime",0) - ReadingsVal($name,"travelTime",0);; }


Mag sein, dass das besser geht, aber für mich tut das erst mal so! ;-)
Wenn auch hier Interesse besteht, dann bau ich daraus gern auch noch ein fhem-Modul bei Gelegenheit.

Gruß
Carsten

tommel

Hum, ein weiterer Apache macht das ganze nicht gerade unkomplizierter... :-) Ohne würde ich es gerne mit Google machen. Ansonsten habe ich folgende Variante nun für mich gebaut:

1. FHEM Mail tauglich machen

Zuerst muss FHEM in die Lage versetzt werden, Mails zu verschicken:
http://www.fhemwiki.de/wiki/E-Mail_senden

2. Koordinaten für die Traffic URL herausfinden

Auf http://routes.tomtom.com/#/ die entsprechende Strecke am besten ,,abstecken". Also in der Karte suchen, rechte Maustaste auf Karte
Und mir ,,Hier starten" und ,,Hier beenden" die Route abstecken. Solange bis es passt...

3. Die HTTPMOD Funktion ,,Verkehr_nach_Hause" im FHEM in die Config schreiben und dabei die Koordinaten anpassen (Start,Start:Ziel,Ziel).
Die rotmarkierte Zahl (600) gibt den ,,Refreshinterval in Sekunden" der Seite an:

define Verkehr_nach_Hause HTTPMOD http://routes.tomtom.com/lbs/services/route/1/50.94037,6.95937:50.95802,7.17439/Quickest/json/1e2099c7-eea9-476b-aac9-b20dc7100af1;;;;language=de;;;;avoidTraffic=false;;;;includeTraffic=true;;;;day=today;;;;time=now;;;;iqRoutes=2;;;;trafficModelId=1393106260406;;;;map=basic 600
attr Verkehr_nach_Hause readingsExpr1 $val / 60
attr Verkehr_nach_Hause readingsExpr2 $val / 60
attr Verkehr_nach_Hause readingsName1 Fahrzeit
attr Verkehr_nach_Hause readingsName2 Verzögerung
attr Verkehr_nach_Hause readingsRegex1 "totalTimeSeconds":([\d]+)
attr Verkehr_nach_Hause readingsRegex2 "totalDelaySeconds":([\d]+)
attr Verkehr_nach_Hause room Verkehr
attr Verkehr_nach_Hause stateFormat {sprintf("Fahrzeit: %.0f Min, Verzögerung: %.0f Min", ReadingsVal($name,"Fahrzeit",0), ReadingsVal($name,"Verzögerung",0))}


4. Einen Dummy definieren, der dafür sorgt, dass Meldungen nur verschickt werden, wenn dieser aktiv ist:

define Verkehr_nach_Hause_Warnung dummy
attr Verkehr_nach_Hause_Warnung room Verkehr
attr Verkehr_nach_Hause_Warnung webCmd on:off


5. Jetzt die Notify Funktion definieren, die auf Statusänderungen des Verkehrs ,,horcht" und entsprechend alarmiert, wenn der Dummy ,,on" ist und die Verzögerungszeit > 0 Minuten ist. (ggfs. anpassen)
Außerdem schaltet diese Funktion den Dummy aus, sobald eine Alarmierung erfolgt, damit nicht noch mehr ,,gleiche" Alarmierungen erfolgen.
Die DebianMail Zeile muss für Fritzbox User entsprechend Punkt 1 angepasst werden.

define Verkehr_nach_Hause_Mail notify Verkehr_nach_Hause.* {\
if((ReadingsVal("Verkehr_nach_Hause_Warnung", "state", 0 ) eq "on") &&(ReadingsVal("Verkehr_nach_Hause","Verzögerung","")) > 0) {\
  my $verkehrszeit = ReadingsVal("Verkehr_nach_Hause","Verzögerung","");;\
  my $verkehrstext = "Die aktuelle Verzögerung für den Heimweg beträgt: " . $verkehrszeit . " Minuten";;\
DebianMail('Empfänger@Domain.com','Verkehrswarnung',$verkehrstext);;\
  fhem('set Verkehr_nach_Hause_Warnung off');;\
}\
}
attr Verkehr_nach_Hause_Mail room Verkehr


6. Als letzten Schritt werden die Zeiten definiert in denen eine Warnung erfolgen soll. Im Beispiel hier jeden Tag ab 15 Uhr bis 17:30 Uhr.

define Warnung_nach_Hause_aktivieren at *15:00:00 set Verkehr_nach_Hause_Warnung on
attr Warnung_nach_Hause_aktivieren room Verkehr

define Warnung_nach_Hause_deaktivieren at *17:30:00 set Verkehr_nach_Hause_Warnung off
attr Warnung_nach_Hause_deaktivieren room Verkehr


Vielleicht kann es ja jemand gebrauchen.

Gruß
Thomas

frank

prima, danke.

die einstellung ist dann wohl ohne wartezeit minimieren (avoidTraffic=false)? falls ich das einstellen möchte, wahrscheinlich avoidTraffic=true. weisst du zufällig welche möglichkeiten mit iqRoutes=2 möglich sind?

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

tommel

Bei avoidTraffic=true würde die URL immer eine Wartezeit optimierte Antwort geben welche für die Alarmierung dann wenig sinnvoll wäre. Der Parameter iqRoutes sagt mir gerade nix :/

iCure

Guten Tag zusammen,

versuche mich hierbei jetzt schon länger, bekomme allerdings keine Werte zurück von der tomtom Seite.

Als Fehler im Log erhalte ich:

HTTPMOD got error in callback: connect: Ein nicht blockierender Socketvorgang konnte nicht sofort ausgeführt werden.

ollir

Schade TomTom hat die Abfrage seit zwei Tagen gesperrt :(
Oder funktioniert es bei jemanden noch?

VG
Olaf

frank

ZitatSchade TomTom hat die Abfrage seit zwei Tagen gesperrt
bei mir auch.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

TeeVau

FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen

Markus

Raspberry Pi2 als FHEM-Plattform
HM, FS20, 1-Wire, PanStamp,LW12,Intertechno,ESPEasy,Alexa

TeeVau

Ich glaube TomTom hat komplett etwas am Service geändert.
Habe mal versucht, wie hier im Thread geschrieben, die Google Maps Website mit HTTPMOD auszuwerten. Dabei bin ich nur auf ein Problem gestoßen:
Aufgrund meiner Route und dem aufkommenden Stau greift nicht immer die RegEx, weil die Route mal "45 Minuten" dauern kann, aber eben auch mal "1 Stunde 23 Minuten". Und das bekomme ich einfach nicht abgefangen.
Frage ich Stunde und Minuten in getrennten ReGEx ab und Multipliziere die Werte, funktioniert das nur so lange die Strecke auch wirklich mehr als eine Stunde dauert.
Bei weniger als einer Stunde greift wieder das Regex für die Stunde nicht und der alte Wert (also z:B. 1) bleibt im Reading stehen. Somit hat die Route also immer eine Stunde Offset.

Kann man das mit HTTPMOD überhaupt so abfangen?
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen

iCure

Im Buffer müsste doch auch  etwas von Value stehen, spweit ich weiss. Dort ist die Zeit in sekunden angegeben, die welche du später durch 60 dividierst.

Gruß

JoWiemann

Hallo,

ich habe das ganze für mich und Google jetzt so gelöst:

In die 99_myUtils.pm kommt folgende Funktion
sub
GoogleExpr($$)
{
    my($traffic,$source) = @_;
    if($traffic =~ /(id="altroute_0" altid="0" oi="alt_0" .*?Bei aktueller Verkehrslage:.{50})/) {
      $traffic = $1;
      if($source eq "Standard") {
        if($traffic =~ /(.{20}<span>.*? Minuten?)/) {
          my $Standard = $1;
          Log3 undef, 5, "$Standard";
          $Standard =~ /([\d]+ Minuten?)/;
          my $Std_Min = $1;
          my $Std_Std = "0 Stunden";
          if($Standard =~ /([\d]+ Stunden?)/) {
            $Std_Std = $1;
          }
          Log3 undef, 3, "Normal -> $Std_Std - $Std_Min";
          return "$Std_Std - $Std_Min";
        }
      } else {
        if($traffic =~ /(Bei aktueller Verkehrslage:.{50})/) {
          my $VerkehrsLage = $1;
          Log3 undef, 5, "$VerkehrsLage";
          $VerkehrsLage =~ /([\d]+ Minuten?)/;
          my $VkL_Min = $1;
          my $VkL_Std = "0 Stunden";
          if($VerkehrsLage =~ /([\d]+ Stunden?)/) {
            $VkL_Std = $1;
          }
          Log3 undef, 3, "Verkehr -> $VkL_Std - $VkL_Min";
          return "$VkL_Std - $VkL_Min";
        }
      }
    }
    return "Fehler";
}



In der fhem.cfg habe ich dann:
#--------------------------------------------------------------------------
# Fahrzeit Ford:
define Ford HTTPMOD https://maps.google.de/maps?saddr=Von-Werth-Strasse+266,+Pulheim&daddr=Geestemuender+Strasse,+50735+Koeln&hl=de&output=classic&dg=brw 360
attr Ford reading01Name Standard
attr Ford reading01Regex (id="altroute_0" altid="0" oi="alt_0" .*?Bei aktueller Verkehrslage:.{50})
attr Ford reading01Expr GoogleExpr($val, "Standard")
attr Ford reading02Name Verkehrslage
attr Ford reading02Regex (id="altroute_0" altid="0" oi="alt_0" .*?Bei aktueller Verkehrslage:.{50})
attr Ford reading02Expr GoogleExpr($val, "Verkehrslage")

#--------------------------------------------------------------------------
# Fahrzeit Muehlheim:
define Muehlheim HTTPMOD https://maps.google.de/maps?saddr=Von-Werth-Strasse+266,+Pulheim&daddr=Am+Schloss+Broich,+45479+Muehlheim+an+der+Ruhr&hl=de&output=classic&dg=brw 360
attr Muehlheim reading01Name Standard
attr Muehlheim reading01Regex (id="altroute_0" altid="0" oi="alt_0" .*?Bei aktueller Verkehrslage:.{50})
attr Muehlheim reading01Expr GoogleExpr($val, "Standard")
attr Muehlheim reading02Name Verkehrslage
attr Muehlheim reading02Regex (id="altroute_0" altid="0" oi="alt_0" .*?Bei aktueller Verkehrslage:.{50})
attr Muehlheim reading02Expr GoogleExpr($val, "Verkehrslage")


Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Thargor

Zitat von: JoWiemann am 14 Januar 2015, 12:41:25
ich habe das ganze für mich und Google jetzt so gelöst:

Ich bekomme bei exakt deine Information folgende Logmeldung:

read callback: request type was Update,
header: HTTP/1.0 302 Found
Location: https://maps.google.de/maps?saddr=Von-Werth-Strasse+266,+Pulheim&daddr=Geestemuender+Strasse,+50735+Koeln&hl=de&output=classic&dg=brw
Cache-Control: private
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=291f6c2453144d7b:TM=1421272678:LM=1421272678:S=0D46n1dUiWs4SXvb; expires=Fri, 13-Jan-2017 21:57:58 GMT; path=/; domain=.google.de
X-Content-Type-Options: nosniff
Date: Wed, 14 Jan 2015 21:57:58 GMT
Server: GFE/2.0
Alternate-Protocol: 80:quic,p=0.02, buffer empty,
Error https://maps.google.de/maps?saddr=Von-Werth-Strasse+266,+Pulheim&daddr=Geestemuender+Strasse,+50735+Koeln&hl=de&output=classic&dg=brw: empty answer received

Hat jemand eine Idee woran das liegen kann? Vom Browser aus klappts wunderbar, auch vom Terminal mit wget kann ich die Antwort abholen, nur in FHEM bekomme ich eine "empty answer". Ich habe hier auch noch die Spritpreise problemlos mit HTTPMOD laufen (allerdings nur über http und nicht https), nur bei google maps streikt irgendwas :-(

Für sachdienliche Hinweise wäre ich sehr dankbar.

Vielen Dank!
Gruß Lars




iCure


kimbolero

#59
Ich versuche nun seit gestern abend, das von Jörg genannte Beispiel einzubinden. Leider bleibe ich bei der Anlage der Readings hängen - folgende Auswahl habe ich bei der Definition:
readingsExpr.*
readingsName.*
readingsRegex.*

Wie bekomme ich es nun hin, dass diese durchnummeriert werden? Wie bei Jörgs Codebeispiel?

In meiner fhem.cfg stehen diese nach Anlage wie folgt:

attr Arbeit readingsExpr.* GoogleExpr($val, "Standard")
attr Arbeit readingsName.* Standard
attr Arbeit readingsRegex.* (id="altroute_0" altid="0" oi="alt_0" .*?Bei aktueller Verkehrslage:.{50})


Muss man die jeweiligen Werte mit irgendeinem Zeichen separiert auf einmal eintragen?

Sorry, wahrscheinliche eine recht simple Angelegenheit, aber im Wiki, der CommandRef und der AnfängerPDF habe ich leider nichts gefunden.
Kann mir jemand behilflich sein?
Danke.

CUL 868, Jeelink 868 Clone, NanoCUL 868, HM-CC-RT-DN,  max! Fensterkontakte, Zigbee, GoogleAssistant, GHoma Wifi-Steckdosen, Telegram etc.....