Modul 98_Departure: Bereitstellung von Abfahrtszeiten an einem Bahnhof

Begonnen von uniqueck, 01 November 2016, 22:56:37

Vorheriges Thema - Nächstes Thema

sinus61

Erstmal auf der Bahn-Seite https://reiseauskunft.bahn.de/bin/bhftafel.exe/dox? den gewünschten Bahnhof raussuchen, es sind wie gesagt aber nicht nur Bahnhöfe drin sondern auch die meisten Haltestellen der regionalen Verkehrsverbünde. Einmal Abfahrt oder Ankunft wählen und dann "Später" drücken, erst dann ist oben in der URL der Parameter "si" mit der Bahnhofs-ID zu sehen.

Eine URL für den Hauptbahnhof Hannover würde jetzt so aussehen:

https://reiseauskunft.bahn.de/bin/bhftafel.exe/dox?si=8000152&bt=dep&p=1111111111&max=5&rt=1&use_realtime_filter=1&start=yes&


in FHEM dann damit ein

define bhf_HannoverHbf HTTPMOD https://reiseauskunft.bahn.de/bin/bhftafel.exe/dox?si=8000152&bt=dep&p=1111111111&max=5&rt=1&use_realtime_filter=1&start=yes& 0


In dem angelegtem Device auf Raw-Definition gehen und alles löschen und das eintragen

defmod bhf_HannoverHbf HTTPMOD https://reiseauskunft.bahn.de/bin/bhftafel.exe/dox?si=8000152&bt=dep&p=1111111111&max=5&rt=1&use_realtime_filter=1&start=yes& 0
attr bhf_HannoverHbf userattr get1Name reading01-10Name reading01-11Name reading01-12Name reading01-13Name reading01-14Name reading01-15Name reading01-16Name reading01-17Name reading01-18Name reading01-19Name reading01-1Name reading01-20Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01-6Name reading01-7Name reading01-8Name reading01-9Name reading01Name reading01OExpr reading01RegOpt reading01Regex
attr bhf_HannoverHbf get1Name Update
attr bhf_HannoverHbf reading01-10Name departure_3_destination
attr bhf_HannoverHbf reading01-11Name departure_3_time
attr bhf_HannoverHbf reading01-12Name departure_3_delay
attr bhf_HannoverHbf reading01-13Name departure_4_product
attr bhf_HannoverHbf reading01-14Name departure_4_destination
attr bhf_HannoverHbf reading01-15Name departure_4_time
attr bhf_HannoverHbf reading01-16Name departure_4_delay
attr bhf_HannoverHbf reading01-17Name departure_5_product
attr bhf_HannoverHbf reading01-18Name departure_5_destination
attr bhf_HannoverHbf reading01-19Name departure_5_time
attr bhf_HannoverHbf reading01-1Name departure_1_product
attr bhf_HannoverHbf reading01-20Name departure_5_delay
attr bhf_HannoverHbf reading01-2Name departure_1_destination
attr bhf_HannoverHbf reading01-3Name departure_1_time
attr bhf_HannoverHbf reading01-4Name departure_1_delay
attr bhf_HannoverHbf reading01-5Name departure_2_product
attr bhf_HannoverHbf reading01-6Name departure_2_destination
attr bhf_HannoverHbf reading01-7Name departure_2_time
attr bhf_HannoverHbf reading01-8Name departure_2_delay
attr bhf_HannoverHbf reading01-9Name departure_3_product
attr bhf_HannoverHbf reading01Name reading
attr bhf_HannoverHbf reading01OExpr {$val =~ s/<br\/><span class="delay.*">//g;; $val =~ s/<\/span>.*//g;; $val =~ s/.*&nbsp;;.*//g;; $val =~ s/, <span.*//g;; $val =~ s/(;/(/g;; $val =~ s/);/)/g;; $val =~ s/ü;/ü/g;; $val =~ s/ö;/ö/g;; $val =~ s/ä;/ä/g;; $val =~ s/ß;/ß/g;; $val;;}
attr bhf_HannoverHbf reading01RegOpt gm
attr bhf_HannoverHbf reading01Regex <span class="bold">(.*)<\/span>\s<\/a>[\w\W]&[gl]t;;&[gl]t;;\s(.*)\s<br \/>[\w\W]<span class="bold">(\d\d:\d\d)<\/span>(.*)<\/div>
attr bhf_HannoverHbf stateFormat departure_1_product departure_1_destination departure_1_time (departure_1_delay)


Jetzt gibt es oben den Update Button oder "get bhf_HannoverHbf  Update" in der FHEM Befehlzeile wählen, dann sollten ein paar Readings erscheinen:


READINGS:
     2019-12-22 17:15:23   departure_1_delay 17:16
     2019-12-22 17:15:23   departure_1_destination Hauptbahnhof/ZOB, Hannover
     2019-12-22 17:15:23   departure_1_product STB   10
     2019-12-22 17:15:23   departure_1_time 17:14
     2019-12-22 17:15:23   departure_2_delay 17:17
     2019-12-22 17:15:23   departure_2_destination Sarstedt (Endpunkt GVH)
     2019-12-22 17:15:23   departure_2_product STB    1
     2019-12-22 17:15:23   departure_2_time 17:14
     2019-12-22 17:15:23   departure_3_delay 17:15
     2019-12-22 17:15:23   departure_3_destination Haltenhoffstraße, Hannover
     2019-12-22 17:15:23   departure_3_product Bus  121
     2019-12-22 17:15:23   departure_3_time 17:14
     2019-12-22 17:15:23   departure_4_delay 17:15
     2019-12-22 17:15:23   departure_4_destination Ahlem, Hannover
     2019-12-22 17:15:23   departure_4_product STB   10
     2019-12-22 17:15:23   departure_4_time 17:15
     2019-12-22 17:15:23   departure_5_delay
     2019-12-22 17:15:23   departure_5_destination Hauptbahnhof/ZOB, Hannover
     2019-12-22 17:15:23   departure_5_product Bussprin
     2019-12-22 17:15:23   departure_5_time 17:15


Man kann in der Bahnabfrage auch eine Linie auswählen, die Info muss dann im URL Parameter "tn" stehen. Wenn man eine bestimmte Richtung ausfiltern will geht das auch im Atrribut reading01Regex, da könnte man z.B. dort wo das jeweils zweite Reading erzeugt wird ....t;;\s(Leipzig.*)\s<br..... schreiben.

Läuft bei jetzt seit ein paar Tagen ganz gut. Allerdings scheint nicht bei allen Verkehrsverbünden die Verspätungsanzeige schon zu funktionieren, da bleibt dann das Reading delay leer, bei mir im VBN geht es aber auch für lokale Bushaltestellen.

Falls es nicht für alle Abfahrten Echtzeiten gibt kann man mit einem Userreading noch definieren, dass dann ein Planzeit angezeigt wird, z.B. so:

departure_1_delay_time { ReadingsVal($NAME,"departure_1_delay",0) eq "" ? ReadingsVal($NAME,"departure_1_time",0) : ReadingsVal($NAME,"departure_1_delay",0);}

oder wenn man z.B. eine Farbsteuerung bei Verspätungen benötigt ein Userreading was zwischen 0 und 1 umschaltet.

departure_1_is_delay { ReadingsVal($NAME,"departure_1_delay",0) eq ReadingsVal($NAME,"departure_1_time",0) ? 0 : 1;}

sinus61

Kleine Ergänzung noch dazu, um die Zeit in Minuten wieder zu bekommen eine kleine Funktion in der 99_myUtils.pm:


sub diff2mins($){
my ($t) = @_;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
my $atime = $hour * 3600 + $min * 60;
my $stime = substr($t,0,2) * 3600 + substr($t,3,2) * 60 + substr($t,6,2);
if ($stime < $atime ) {$stime = $stime + 86400 };
return ($stime - $atime)/60;
}


und ein Userreading


departure_1_time_min { diff2mins(ReadingsVal($NAME,"departure_1_time",0)) }


Und wenn man im HTTPMOD enableControlSet einschaltet hat man auch start, stop und interval als Befehle. Das hat im Modul eh gefehlt, damit ist das insgesamt flexibler als das Departure Modul.

ext23

Nabend,

funktioniert echt gut, OK die timediff in min Funktion müsste noch etwas angepasst werden, manchmal kommen Werte aller 1436 wegen Verspätung etc.

Apropos Verspätung, da wäre auch eine Funktion gut, die die Verspätung in Min anzeigt. Aber das kann man ja alles basteln wenn man es braucht.

Ich bin ja mal gespannt wie lange die Bahn die API so lässt...

/Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

andies

Ja, diese ständige Änderungen halten einen auf Trab. Ich habe für mich jetzt eine etwas umständlichere Lösung, weil ich einen Fußweg berücksichtigen will. Vielleicht kann es ja jemand verwenden. Nachdem ich das obige device angelegt habe, lasse ich mir die Zeilen mit dem Bus, der mich interessiert, ausgeben (ich zeige mal nur an, was wichtig ist):
Internals:
   NAME       BVG
   TYPE       HTTPMOD
Attributes:
   get01AlwaysNum 1
   get01Name  X10
   get01Name-01 X10-1
   get01Name-02 X10-2
   get01Name-03 X10-3
   get01RegOpt gm
   get01Regex Hertzallee, Berlin[\n]{1}<br \/>[\n]{1}<span class=\"bold\">(\d\d:\d\d<\/span>.*?)<\/div>
   get01URL   https://reiseauskunft.bahn.de/bin/bhftafel.exe/dox?si=731545&bt=dep&p=1111111111&max=15&rt=1&use_realtime_filter=1&start=yes&
   stateFormat {BVGDatenHolen();}
   timeout    30
   userattr   get01AlwaysNum get01Name get01Name-01 get01Name-02 get01Name-03 get01RegOpt get01Regex get01URL reading01RegOpt
   webCmd     holen
 
Die URL enthält den Abfahrtsbahnhof, der Regex sagt "nur Busse mit Ziel Hertzallee erfassen". Es werden die nächsten drei Abfahrtszeiten geholt.

Dann beginnt die eigentliche Arbeit, denn ich will wissen, ob die Abfahrtszeiten für mich erreichbar sein. Ich habe einen Fußweg von 14 Minuten und will mir nur anzeigen lassen, wenn (der eventuell verspätete) Bus in 14 bis ca 44 Minuten fährt. Das habe ich in einer Perl-sub gemacht, die in myUtils liegt:
sub ReineZeitHolen($) {
  my $s = $_[0];
  # wenn Verspätung angegeben, zweite Zeitangabe holen (kann delayOnTime oder delay sein)
  if ($s =~ m/delayOnTime"/i) {
return substr $s, 43, 5;
  } elsif ($s =~ m/delay"/i) {
return substr $s, 37, 5;
  } else {
    #keine Verspätung, erste Zeitangabe holen
    return substr $s, 0, 5; 
  }
}


sub BVGDatenHolen() {
  my $Zeit;
 
  my $Zeit1 = ReineZeitHolen(ReadingsVal("BVG", "X10-1", "00:00</span>"));
  my $Zeit2 = ReineZeitHolen(ReadingsVal("BVG", "X10-2", "00:00</span>"));
  my $Zeit3 = ReineZeitHolen(ReadingsVal("BVG", "X10-3", "00:00</span>"));

  my $Rueckmeldung = ""; # debug: $Zeit1.$Zeit2.$Zeit3;
  my $Abstand = 14; # früheste Ankunft
  until($Abstand == 44) {
      $Zeit = POSIX::strftime("%H:%M",localtime(time+$Abstand*60));
      if (($Zeit1 eq $Zeit) or ($Zeit2 eq $Zeit) or ($Zeit3 eq $Zeit) ){
      $Rueckmeldung .= $Abstand." / ";  
  }
  $Abstand ++;
      }
  $/ = " / ";
  chomp($Rueckmeldung);
  return $Rueckmeldung;
}

Wenn man das eingibt und speichert und wieder aufruft, wird statt des / allerdings ein Zeilenvorschub in die Datei eingefügt, das muss man jedes mal händisch ändert. Aber es klappt bei mir. Vielleicht kann ein Profi das mal schicker programmieren, ich habe den brut-force-Weg gewählt.

Die neuen Zeiten werden geholt, indem man auf den Text "holen" klickt.
FHEM 6.1 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

MCh76

Das Departure Modul läuft wieder. Zumindest für den von mir benötigten Provider VVS

australien

Danke für die Info, bei oebb funktioniert es auch wieder.

Danke auch den Entwicklern für die Lösung des Problems!
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

namor

@Sbiermann

Danke für die schnelle Reaktion.


Hatte ihn angeschrieben, er macht den Backroundservice und hat nach Updates den Server rebootet.

Nun läuft alles wieder.



Paul

Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

balli1187

Hallo,

ich bin vor ein paar Tagen auf das Modul aufmerksam geworden und wollte mir damit den Weg über das httpmod ersparen.
Readings werden soweit auch (immer mal wieder) gefüllt, allerdings wird auch mein Log mit INVALID_STATION-Meldungen geflutet....

Gibt es dazu eine Lösung?
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

ext23

Zitat von: Paul am 06 Januar 2020, 15:35:27
BVG scheint weiterhin nicht zu funktionieren.

Nehm die Bahn, BVG geht schon seit Jahren nicht mehr glaube ich. Ich hab das über die bahn als Provider gemacht, geht auch. Und jetzt per HTTPMOD weil ich das doch besser finde. Das andere ist mir zu oft ausgefallen, mal schauen wie es jetzt läuft.

/Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

Paul

Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

MCh76

das Problem bei der DB Fahrtplanauskunft ist, dass es in meinen Gebiet (VVS rund um Esslingen) die Verspätungen der Busse nicht anzeigt. Und das ist für mich ein k.O. Kriterium.

Peter aus Calw

hallo,
konnte bis heute nachmittag mit :

https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=7203080&provider=Nvbw

im Browser die Abfahrtszeiten an meiner Haltestelle exakt lesen, seit ca 19:00 Uhr ohne Fehlermeldung keine Ausgabe mehr. Liegt das an S.Biermann ?
Gruß Peter

Peter aus Calw

Hallo MCH76,
versuche es mal mit :

https://www.efa-bw.de/nvbw/XSLT_DM_REQUEST?language=de&itdLPxx_frames=false&dmMacro=nvbwLink&name_dm=7203080&type_dm=any&line=cw:01630:%20:H:s20&line=cw:01630:%20:R:s20&line=cw:01633:%20:H:s20&line=cw:01641:%20:H:s20&itdLPxx_dateTime=20200210:1557&itdDate=20200210&itdTime=1557

die Ausgabe ist super, bekomme das aber in Fhem leider nicht gebacken, habe das mit Biermann versucht (siehe letzten Eintrag), oder hast Du eine Idee ?
Gruß Peter

MCh76

hallo Peter,

das Departure modul von sbiermann funktioniert wieder 1a bei mir. probleme hatte ich nur mit der Alternative DB Fahrtplanauskunft, weil da die Busse in meinem Öffi Gebiet keine Verspätung anzeigten, was aber ein Problem des Providers ist (sehe ich in der online Auskunft per App auch nicht).

Das Departure modul zeigt bei mir mit dem provider VVS noch alles wie gewünscht an wie gehabt, meine mich aber an einem post zu erinnern, dass sbiermann hier änderungen angekündigt hatte.
Ggf. wird schrittweise für die Provider was umgestellt?