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

JoWiemann

Zitat von: Thargor am 14 Januar 2015, 23:03:40

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 :-(

Hallo Lars,

hast Du libio-socket-ssl-perl installier? Mach doch mal ein:
sudo apt-get update
sudo apt-get install libio-socket-ssl-perl


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

iCure

Das obere Script kannst du so direkt in deine fhem.cfg einfügen. Ansonsten einfach in die Zeile auf der fhem Oberfläche eintragen: attr <dein modulname> reading01Regex <dein code>
attr <dein modulname> reading02Regex <dein code>
usw.

Dadurch kannst du es einfach durchnummerieren.

JoWiemann

#62
Zitat von: kimbolero am 15 Januar 2015, 21:13:51
Wie bekomme ich es nun hin, dass diese durchnummeriert werden? Wie bei Jörgs Codebeispiel?

Hallo kimbolero,

bitte berücksichtige die command.ref für HTTPMOD. Dort steht für die attr:

attr <device> reading01Name <Name für das Reading>
attr <device> reading01Regex <regexpr für die Selction>
attr <device> reading01Expr <Funktion, die über das Ergebnis von Regex ausgeführt wird>

attr <device> reading02Name <Name für das Reading>
attr <device> reading02Regex <regexpr für die Selction>
attr <device> reading02Expr <Funktion, die über das Ergebnis von Regex ausgeführt wird>
...
attr <device> reading09Name <Name für das Reading>
attr <device> reading09Regex <regexpr für die Selction>
attr <device> reading09Expr <Funktion, die über das Ergebnis von Regex ausgeführt wird>


Es können also 9 Dreiergruppen und damit 9 Readings definiert werden. Somit können aus einer Web-Adresse 9 Ergebnisse selektiert werden.

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

kimbolero

#63
Danke euch beiden für das Feedback.

Den Code hatte ich versucht direkt in die fhem.cfg zu packen, habe jedoch eine Fehlermeldung beim Speichern erhalten.

Tippe ich oben in die Eingabemaske:
attr Arbeit reading01Name Standard
so erhalte ich folgende Fehlermeldung (identisch als ich den Code direkt in die fhem.cfg gespeichert hatte, dort natürlich für jedes attr eine Fehlermeldung):
"Arbeit: unknown attribute reading01Name. Type 'attr Arbeit ?' for a detailed list. "

Edit:
Wenn ich "attr Arbeit ?" eintippe, erhalte ich folgende Meldung:
Arbeit: unknown attribute ?, choose one of verbose:0,1,2,3,4,5 room group comment alias eventMap userReadings do_not_notify:1,0 readingsName.* readingsRegex.* readingsExpr.* requestHeader.* requestData.* disable:0,1 noShutdown:0,1 timeout event-on-change-reading event-on-update-reading event-min-interval stateFormat devStateIcon devStateStyle fp_home icon sortby webCmd widgetOverride userattr 

Edit2:
Und mit "attr Arbeit ?" habe ich mir schon selbst die Antwort auf mein Problem gegeben ;-)
Ich muss die Attribute wie folgt setzen:
attr Arbeit readingsName1 Standard
attr Arbeit readingsRegex1 (id="altroute_0" altid="0" oi="alt_0" .*?Bei aktueller Verkehrslage:.{50})
attr Arbeit readingsExpr1 GoogleExpr($val, "Standard")
attr Arbeit readingsName2 Verkehrslage
attr Arbeit readingsRegex2 (id="altroute_0" altid="0" oi="alt_0" .*?Bei aktueller Verkehrslage:.{50})
attr Arbeit readingsExpr2 GoogleExpr($val, "Verkehrslage")


Komisch, aber funktioniert - die Schreibweise war paar Kommentare weiter vorn in einem anderen Codebeispiel ebenfalls.....
CUL 868, Jeelink 868 Clone, NanoCUL 868, HM-CC-RT-DN,  max! Fensterkontakte, Zigbee, GoogleAssistant, GHoma Wifi-Steckdosen, Telegram etc.....

JoWiemann

Zitat von: kimbolero am 15 Januar 2015, 21:36:21
Den Code hatte ich versucht direkt in die fhem.cfg zu packen, habe jedoch eine Fehlermeldung beim Speichern erhalten.

Komisch, aber funktioniert - die Schreibweise war paar Kommentare weiter vorn in einem anderen Codebeispiel ebenfalls.....

Dann hast Du lange kein Update mehr gemacht. Die von mir gewählte Notation ist die neue, Deine wird noch aus Kompatibilitätsgründen, jedenfalls beim aktuellen Modul, unterstützt.

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

kimbolero

OK - danke für den Hinweis.
Werde ich am Wochenende mal angehen - für den vorangeschrittenen Abend heute gilt: never change a running system ;-)
CUL 868, Jeelink 868 Clone, NanoCUL 868, HM-CC-RT-DN,  max! Fensterkontakte, Zigbee, GoogleAssistant, GHoma Wifi-Steckdosen, Telegram etc.....

Thargor

Zitat von: JoWiemann am 15 Januar 2015, 21:19:36

hast Du libio-socket-ssl-perl installier? Mach doch mal ein:
sudo apt-get update
sudo apt-get install libio-socket-ssl-perl


Nein, ist nicht installiert :-(
Ist leider auch nicht so einfach, da ich noch auf einem crosscompilierten Perl hänge ...

Aber vielen Dank für den Tipp. Ich denken das entprechene CPAN Modul wäre IO::Socket::SSL

Gruß Lars

JoWiemann

#67
Hallo,

und hier das Ganz für die Bahn.

#--------------------------------------------------------------------------
# Bahnauskunft:
define Bahn HTTPMOD http://mobile.bahn.de/bin/mobil/query.exe/dox?ld=9643&n=10&i=mk.03266843.1421409248&rt=1&use_realtime_filter=1&sotRequest=1&webview=&ld=9643&n=10&i=mk.03266843.1421409248&rt=1&use_realtime_filter=1&sotRequest=1&webview=&sotRequest=1&start=1 360
attr Bahn userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex
attr Bahn reading01Name Erste_S-Bahn_Start
attr Bahn reading01Regex >([\d]+:[\d]+)<br />[\d]+:[\d]+</a>
attr Bahn reading02Name Erste_S-Bahn_Ende
attr Bahn reading02Regex >[\d]+:[\d]+<br />([\d]+:[\d]+)</a>
attr Bahn reading03Name Zweite_S-Bahn_Start
attr Bahn reading03Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>([\d]+:[\d]+)<br />[\d]+:[\d]+</a>
attr Bahn reading04Name Zweite_S-Bahn_Ende
attr Bahn reading04Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />([\d]+:[\d]+)</a>
attr Bahn reading05Name Dritte_S-Bahn_Start
attr Bahn reading05Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>([\d]+:[\d]+)<br />[\d]+:[\d]+</a>
attr Bahn reading06Name Dritte_S-Bahn_Ende
attr Bahn reading06Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*>[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />([\d]+:[\d]+)</a>



Den Link bekommt man, in dem man auf http://www.bahn.de/m/view/de/index.shtml geht und dort "Liveauskunft" auswählt. Dann die Suchparameter festlegen und "Suchen". Auf der Ergebnisseite gibt es dann den Button "Aktualisieren". Auf diesem Button mit der rechten Maustaste den Link kopieren und dann als Parameter an HTTPMOD übergeben.
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

fiedel

Zitat von: JoWiemann am 14 Januar 2015, 12:41:25
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


Hi,
vielen Dank für den tollen Code Jörg! Was mich in diesen Thread "gelockt" hatte, waren die Worte "Wecken je nach Verkehrslage". Wenn man das wörtlich nimmt und mit deinem Code rechnen und automatisieren möchte, müsste man das Reading erst aufwändig zerpflücken. Ich habe also das "Übel" mal versucht an der Wurzel zu packen und rechne deine Stunden und Minuten schon in der myUtils komplett in Minuten um. Damit kann man nun direkt vergleichen, oder ein offset zu einer Weckzeit generieren:

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;
          }
           (my $val_m,my $txt_m) = split(' ',$Std_Min);
           (my $val_h,my $txt_h) = split(' ',$Std_Std);
            my $Std_Calc = ($val_h*60)+$val_m;
           Log3 undef, 3, "Normal -> $Std_Std - $Std_Min";
        # return "$Std_Std - $Std_Min";
          return "$Std_Calc";
  }
      } 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;
           }
           (my $val_m,my $txt_m) = split(' ',$VkL_Min);
           (my $val_h,my $txt_h) = split(' ',$VkL_Std);
            my $VkL_Calc = ($val_h*60)+$val_m;
           Log3 undef, 3, "Verkehr -> $VkL_Std - $VkL_Min";
        # return "$VkL_Std - $VkL_Min";
          return "$VkL_Calc";
        }
      }
    }
    return "Fehler";
}


Gruß

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

onkel-tobi

#69
Zitat von: JoWiemann am 16 Januar 2015, 14:37:00
Hallo,

und hier das Ganz für die Bahn.

#--------------------------------------------------------------------------
# Bahnauskunft:
define Bahn HTTPMOD http://mobile.bahn.de/bin/mobil/query.exe/dox?ld=9643&n=10&i=mk.03266843.1421409248&rt=1&use_realtime_filter=1&sotRequest=1&webview=&ld=9643&n=10&i=mk.03266843.1421409248&rt=1&use_realtime_filter=1&sotRequest=1&webview=&sotRequest=1&start=1 360
attr Bahn userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex
attr Bahn reading01Name Erste_S-Bahn_Start
attr Bahn reading01Regex >([\d]+:[\d]+)<br />[\d]+:[\d]+</a>
attr Bahn reading02Name Erste_S-Bahn_Ende
attr Bahn reading02Regex >[\d]+:[\d]+<br />([\d]+:[\d]+)</a>
attr Bahn reading03Name Zweite_S-Bahn_Start
attr Bahn reading03Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>([\d]+:[\d]+)<br />[\d]+:[\d]+</a>
attr Bahn reading04Name Zweite_S-Bahn_Ende
attr Bahn reading04Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />([\d]+:[\d]+)</a>
attr Bahn reading05Name Dritte_S-Bahn_Start
attr Bahn reading05Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>([\d]+:[\d]+)<br />[\d]+:[\d]+</a>
attr Bahn reading06Name Dritte_S-Bahn_Ende
attr Bahn reading06Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*>[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />([\d]+:[\d]+)</a>



Den Link bekommt man, in dem man auf http://www.bahn.de/m/view/de/index.shtml geht und dort "Liveauskunft" auswählt. Dann die Suchparameter festlegen und "Suchen". Auf der Ergebnisseite gibt es dann den Button "Aktualisieren". Auf diesem Button mit der rechten Maustaste den Link kopieren und dann als Parameter an HTTPMOD übergeben.

Danke Jo, dass ist definitiv schöner als die Abfrage via iframe einzubinden. Was dann allerdings nicht mehr geht ist, dass sich die Infos aktualisieren, wenn man auf den Link für den Raum klickt in dem die RG ist, oder geht das irgendwie?

Außerdem ist für meine Frau wichtig, die aktuellen Verspätungen zu sehen, daher habe ich das mal mit reingenommen:
attr Bahn reading01Name Erste_S-Bahn_Start
attr Bahn reading01Regex >([\d]+:[\d]+)<br />[\d]+:[\d]+</a>
attr Bahn reading02Name Erste_S-Bahn_Ende
attr Bahn reading02Regex >[\d]+:[\d]+<br />([\d]+:[\d]+)</a>
attr Bahn reading03Name Erste_Verspätung
attr Bahn reading03Regex >([+][\d]+)
attr Bahn reading04Name Zweite_S-Bahn_Start
attr Bahn reading04Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>([\d]+:[\d]+)<br />[\d]+:[\d]+</a>
attr Bahn reading05Name Zweite_S-Bahn_Ende
attr Bahn reading05Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />([\d]+:[\d]+)</a>
attr Bahn reading06Name Zweite_Verspätung
attr Bahn reading06Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>.*?>.*?>([+][\d]+)
attr Bahn reading07Name Dritte_S-Bahn_Start
attr Bahn reading07Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>([\d]+:[\d]+)<br />[\d]+:[\d]+</a>
attr Bahn reading08Name Dritte_S-Bahn_Ende
attr Bahn reading08Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*>[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />([\d]+:[\d]+)</a>
attr Bahn reading09Name Dritte_Verspätung
attr Bahn reading09Regex >[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>[\d]+:[\d]+<br />[\d]+:[\d]+</a>.*?>*g">([+][\d]+)

Funktioniert zumindest für mich erst mal wie es soll, auch wenn die Expressions vermutlich noch zu optimieren sind...

Gruß,
Tobi

chris0478

Hi,

das ist exakt das, wonach ich gesucht habe. Danke für den Code. Leider bin ich noch nicht wirklich im FHEM Konzept angekommen und bräuchte für den eigentlichen Sinn dieser Anwendung nochmal Eure Hilfe:

Unter dem Reading "Verkehrslage" erhalte ich nun die Minuten, die ich z.B nach Hause oder zur Arbeit benötige. Ich würde nun gerne abends eine Email /Pushover o.ä. erhalten, wenn sich ein Stau auf meinem Heimweg bildet und meine Ankunft verzögert. Wie frage ich immer von Mo-Fr abends zwischen 16:00 und 17:30 ab, ob die voraussichtliche Ankunft (also now + Minuten aus der Verkehrslage) größer als meine definierte Ankunftszeit ist? Wenn ja, soll mir FHEM eine Mail oder andere Nachricht schicken. Richtig cool wäre es noch, vorher zu checken, ob mein Status aus dem GEOFANCY Modul (ist bereits erfolgreich eingerichtet) auch auf "work" steht.

Könnt ihr mir helfen?

VG

Christian

AxelSchweiss

Hi
Ich habe die Zugverspätungsanzeige in mein FHEM eingebaut.
Das funktioniert soweit auch sehr gut ..... bis .... nach ein paar Stunden der Request dann abgelehnt wird.

In der Response von mobile.bahn.de steht dann:
" leider konnten Ihre Suchergebnisse zwischenzeitlich nicht mehr gespeichert werden. Wir bitten Sie daher, eine neue Anfrage zu starten,"

Was mache ich denn da falsch ?

Die Zugverspätungsanzeige ist genau das was ich morgens brauche ... dann ist öfter mal noch Zeit für einen Kaffee :-)
Daher finde ich die Lösung super gut . Danke dafür.


ulli

Ich habe das gleiche Problem wie Axel. Hat wer eine Lösung gefunden?
Ich denke das liegt daran das die SessionID abgelaufen ist?

onkel-tobi

Hi,

auch ich habe das Problem nun.
"Früher" hatte ich das Problem nur, wenn ich fhem zu oft restartet habe, dann wurde die Abfrage scheinbar automatisch gesperrt, nun taucht das Problem bei mir leider auch so, nach ein paar Std. auf.
Vermutlich gibt es keine andere Möglichkeit als sich eine andere Lösung zu suchen.
Die hier vorgestellte Lösung aus AUT ist mMn keine Alternative, da die Verspätungen häufig nicht angezeigt werden.

Gruß,
Tobi

AxelSchweiss

Hi

Was auch noch sein kann ist das sich nach einem 24h Reconnect bei DSL sich ja die  IP ändert.
Dann passt das ganze nicht mehr zusammen und der Request wird abgelehnt.