98_DBPlan.pm: Fahrplaninformation der DB

Begonnen von JoWiemann, 08 April 2015, 18:57:14

Vorheriges Thema - Nächstes Thema

JoWiemann

!!! Die aktuelle Version befindet sich jetzt immer in diesem Beitrag !!!

Hallo,

da ich selber auf einem DPF im Flur alles Mögliche darstelle, fehlten nur noch ein paar Fahrplaninformationen des ÖPNV. Angeregt durch Diskussionen im Forum habe ich das Modul 98_DBPlan erstellt. Das Modul holt von der Infoseite der DB <http://reiseauskunft.bahn.de/bin/query.exe/dox?S=departure&Z=destination&start=1&rt=1> aktuelle Informationen zu einer angegeben Verbindung. Von Freibeuter stammt noch dieser Link: http://www.geiervally.lechtal.at/sixcms/media.php/1405/Parametrisierte%20%DCbergabe%20Bahnauskunft(V%205.12-R4.30c,%20f%FCr.pdf

define <Name> DBPlan <Interval for refresh in seconds>

Attribute:
dbplan_station-> Abfahrtsbahnhof / Haltestelle
dbplan_destination -> Ankunftsbahnhof / Haltestelle
dbplan_via_1 -> 1. Zwischenhalt in Bahnhof / Haltestelle
dbplan_via_2 -> 2. Zwischenhalt in Bahnhof / Haltestelle
dbplan_journey_prod -> Verkehrsmittel, wie z.B.: ICE, Bus, Straßenbahn
dbplan_journey_opt -> Reiseoptionen wie z.B.: direct connection
dbplan_tariff_class -> 1. oder 2. Klasse
dbplan_board_type -> Fahrplansuche bzw. Bahnhofsanzeige für Abfahrts- oder Ankunftszeit
dbplan_delayed_Journey -> Bei off werden nur pünktliche Verbindungen angezeigt
dbplan_max_Journeys -> Anzahl der angezeigten Zugverbindungen in der Bahnhofsansicht.
dbplan_reg_train -> die Zugbezeichnung, z.B. S für alles was S- und Straßenbahnen angeht, ICE alle ICE oder ICE mit Zugnummer. Usw.
dbplan_travel_date -> Reisedatum in der Angabe: dd.mm.yy
dbplan_travel_time -> Abfahtrtszeit in der Angabe: hh.mm
dbplan_addon_options -> weitere Optionen, wie sie im API-Dokument der DB beschrieben sind

Steuernde Attribute:
dbplan-disable -> Device aktivieren / deaktivieren (s. auch FHEM-Doku)
dbplan-default-char -> Hinweis, der angezeigt wird, wenn keine Information für ein reading zur Verfügung steht.
- "none" ist der Standardhinweis.<br>
Sofern folgende spezielle Einträge gemacht werden:
- "delete" nicht genutzte readings werden auch nicht angezeigt.
- "nochar" das Reading wird mit leerem Inhalt angezeigt.
dbplan-tabel-headers -> internes Attribut um die Spaltenbezeichnungen für HTML::TableExtract
dbplan-station-file -> Pfad zur Bahnhofstabelle. Die Tabelle ist im csv Format abgelegt
dbplan-base-type -> Anzeige als Bahnhofstabelle (table) oder Verbindungsinformation (plan)

HTTPMOD Attribute, siehe entsprechende Doku
dbplan-remote-timeout
dbplan-remote-noshutdown
dbplan-remote-loglevel

Bitte die Attribute nur über die Fhem Oberfläche setzen. Es können für dbplan_journey_prod und dbplan_journey_opt mehrere Einträge aus den jeweiligen Listen kombiniert werden. Für Abfahrts- und Ankunftsort bitte vorher prüfen, ob diese Orte von www.bahn.de erkannt werden und ggf. anpassen.  Ist die Bahnhofstabelle vorhanden, kann man auch über das entsprechende get sich Bahnhöfe anzeigen oder suchen lassen. Die Bahnhofstabelle wird über das Fhem-Update mitgeladen. Es muss also nur das Attribut mit dem Pfad (/opt/fhem/FHEM/deutschland_bhf.csv)gesetzt werden. Leider funktioniert das Laden der Tabelle nicht, wenn configGB genutzt wird.

Folgende Readings werden gefüllt:

departure_(1..3) -> Abfahrtszeit
arrival_(1..3) -> Ankunftszeit
connection_(1..3) -> Verbindungstyp
departure_delay_(1..3) -> Verspätung in der Abfahrtszeit
arrival_delay_(1..3) -> Verspätung in der Ankunftszeit

travel_note_(1..3) -> Hinweise für die Verbindung
travel_note_link_(1..3) -> Link zu den weiteren Verbindungsinformationen
travel_note_text_(1..3) -> Verbindungshinweis
travel_note_error_(1..3) -> Fehlertext der Detailinformation

travel_duration_(1..3) -> Reisezeit
travel_departure_(1..3) -> Informationen über den Abfahtsbahnhof und das Ankunftsgleis
travel_destination_(1..3) -> Informationen über den Zielbahnhof und das Ankunftsgleis
travel_change_(1..3) -> Anzahl der Umstiege
travel_price_(1..3) -> Fahrpreis
travel_vehicle_nr_(1..3) -> Anzeige der Zug, Bus,... Bezeichnung / Nummer

Grüße Jörg

Update: 19. Januar 2016
Aktuelle Version im ersten Beitrag

Laden der aktuellen Version über Eingabe von:

update all https://raw.githubusercontent.com/jowiemann/DBPlan-for-Fhem/master/controls_dbplan.txt

in die FHEM Kommandozeile

oder mit

update add https://raw.githubusercontent.com/jowiemann/DBPlan-for-Fhem/master/controls_dbplan.txt

in der FHEM Kommandozeile in das Standardupdate einbinden.

FHEM-Wiki: http://www.fhemwiki.de/wiki/DBPlan -- Vielen Dank an uniqueck

23.02.18
- Neue Attribut: dbplan-reading-deselect: deselektieren von Readings.
- Fehler bei der Ermittlung der Travel Notes korrigiert.
- Reading travel_note_link_<n> wird jetzt ab verbose 4 als dbg_travel_note_link_<n> gebildet

15.01.2018
- Parsing-Fehler bei Verspätungszeiten bei Zeitvorgabe korrigiert

12.01.2018
- Syntax-Fehler bei Verspätungszeiten korrigiert
- +0 ist jetzt 0

09.01.2018
- Fehler bei Verspätungszeiten korrigiert
- Readings für Verspätung zeigen wieder +0, wenn keine Verspätung vorliegt

03.01.2018
- Fehler in Zeile 628 gefixed: dbplan_travel_date anstatt dbplan_travel-date
  Der Fehler verhindert, dass ein Datum, das im Attribut dbplan_travel_date angegeben wird, an die Bahn API übergeben wird.
  Damit wirkt es letztlich so, als wäre das Attribut nicht vorhanden/belegt.

12.12.2017
- Verspätungen wieder in Minuten (Dank an Hulzer aus dem Fhem Forum)
- Inkonsistenz bei inactiv(e) / activ(e). Jetzt durchgängig inactive/active

10.12.2017
- Auszuwertendende Seiten auf https umgestellt.
- kleinere Fehlerkorrektur: bei vorhandenen Travel Notes noch Verspätungsanzeigen

03.02.2017
- Modul startet nicht nach Fhem Neustart oder Änderung der Attribute.

22.01.2017
- Kleinere Fehlerkorrekturen.

19.01.2017
- gelegentlicher Fehler: PERL WARNING: Use of uninitialized value in string ne at... behoben .

18.01.2017
- Fehler bei userReadings behoben (Log-Eintrag: readingsUpdate(DBPlan,row1,none) missed to call readingsBeginUpdate first).
- Fehler bei stateFormat behoben (Automatische Aktualisierung funktionierte nicht).
- showStations als get entfernt.
- searchStation zeigt ohne Suchbegriff alle Bahnhöfe.
- commandref angepasst.
- kleinere Fehlerkorrekturen.

08.01.2017
- Hinweismeldungen für Verbindungen wieder verfügbar.
- Sonderzeichen in der Bahnhofsanzeige korrigiert.
- Neuer zweiter optionaler Parameter im Define: time offset in Minuten. Wenn gesetzt wird die Abfrage Anzahl Minuten in die Zukunft vorverlegt.
- Neues set timeOffset. Hiermit kann das definierte time offset überschrieben werden.
- Parameterstandardwert für noshutdown für nonblocking, siehe Doku HTTPMOD, von 0 auf 1 geändert.
- Kleinere Fehlerkorrekturen
- Neues Reading travel_vehicle_nr_(1..3): Anzeige der Zug, Bus,... Bezeichnung / Nummer

Update: 04.01.2017
- Veränderungen in den HTML-Seiten der DB nachgezogen.
- Log3 level überprüft
- kleine Schönheitsfehler beseitigt
- Auswahlmöglichkeit zwischen Bahnhofsanzeige und Fahrplanzeige hinzugefügt
- Bahnhofsliste Deutschland hinzugefügt
- commandref überarbeitet und deutsche Version hinzugefügt

Update: 05. Februar 2016
Hoffentlich den bei einigen auftauchenden Fehler mit TableExtract beseitigt.

Update: 11. Februar 2016
Fix für Spaltenposition in TableExtract.

Update: 12.02.2016
Fehler beseitigt, wenn Zelleninhalt mit &nbsp; belegt

Update: 20.04.2017
Modul folgt Modulvorgaben. Kein direktes Beschreiben von STATE.

02.05.2017
- Fehlerkorrektur Uhrzeitermittlung für Bahnhofsanzeige.

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

JoWiemann

Hallo,

habe noch das Attribut dbplan_disable eingebaut. Mit setzen auf 1 wird die Abfrage der DB Seite ausgesetzt. Mit löschen des Attributes oder setzen auf 0 wird die Abfrage wieder aktiviert.

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

onkel-tobi

Hi Jörg,

liest sich gut, danke. Werde das ganze dann auch mal testen, habe das bisher ja per httpmod und regexp gemacht.
Eine Möglichkeit das Abfahrt Gleis anzuzeigen gibt es nicht, oder?

Gruß,

Tobi

JoWiemann

Hallo Tobi, doch geht. Muss ich "nur" einbauen. Vielleicht am Sonntag, wenn meine Frau Lindenstraße guckt und ich "Freizeit" habe.

Grüße Jörg


Grüße Jörg

Gesendet von iPhone mit Tapatalk
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

Risiko

Hallo Jörg,

erstmal super Arbeit.
Ich würde auch gern dein Modul im laufenden System verwenden.
Du arbeitest aber blockierend "HttpUtils_BlockingGet".  Während der Abfrage und Parsen ist FHEM blockiert. Damit habe ich etwas Bauchschmerzen. ;)
Könntest du das bitte auf "HttpUtils_NonblockingGet" umbauen? Wäre echt super.
Weiß aber leider auch nicht, wie aufwendig das ist. Habe HttpUtils selbst noch nicht verwendet.

Danke.

Risiko.

JoWiemann

Hallo Risiko,

schaue ich mir an. Mit NonBlocking habe ich mich noch nicht beschäftigt. Muss dann aber jetzt wohl mal sein
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

JoWiemann

Hallo,

habe jetzt alles auf "HttpUtils_NonblockingGet" umgestellt. Weiterhin ist das neue reading:

travel_departure_(1..3) -> informations about the departure and the plattform, if available

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

JoWiemann

Hallo,

habe das Modul etwas überarbeitet und folgende Erweiterungen eingebaut:

Setting implementiert:

interval -> set new interval time in seconds for parsing the DB time table
reread -> reread and parse the DB time table. Only active, if not state: disabled
stop -> stop interval timer, only active if state: active
start -> restart interval timer, only active if state: stopped

Über die Settings kann nun mit set <mein_DBPlan> DBPlan <Setting> das verhalten beeinflusst werden. Eine Anwendung wäre, die Aktuallisierung über entsprechende 'at' für die Nacht auszuschalten, oder zu bestimmten Zeiten das Interval zu verändern.

Weiteres Attribut:

dbplan-remote-loglevel -> Define the loglevel for all http get. Default is loglevel 4.

siehe auch die command.ref zu HtppUitils.

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

JoWiemann

Hallo,

sorry, leider noch eine neue Version. Hatte noch einen Fehler in der Produktauswahl. Ab Schiffe war die Bit-Kodierung falsch.

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

JoWiemann

#9
Hallo,

habe für STATE noch ein 'initialized' eingebaut.

Neu STATE:


  • initialized -> das Device ist definiert, es wurde bisher allerdings noch kein Request auf das HTTP Interface durchgeführt
  • active ->  der Timer ist aktiv
  • stopped -> der Timer wurde angehalten
  • disabled -> das Attribut 'disabled' wurde gesetzt

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

Wernieman

#10
Dein Modul hört sich gut an nur .... könntest Du eventuell eine Minimalkonfigbeispiel geben?

Sind die beiden folgenden Parameter optional?
dbplan_journey_prod -> DB travel products like: ICE
dbplan_journey_opt -> DB travel options like: direct connection
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

AxelSchweiss

Hallo Jörg

Worin besteht den der Unterschied bei "dbplan_disable " und start/stop?
Ich habe bisher mit einem "at" und "dbplan_disable" die Abfrage nur dann laufen wenn ich sie benötige.

Denke ich da falsch oder zieht  das irgendwelche Probleme mit sich wenn man dbplan_disable verwendet?

Ansonsten bleibt mir noch zu sagen .... chapo  .... funktioniert prima  ... das Modul

JoWiemann

Hallo Axel,

funktional nur dahingehen, dass ein attr ... immer in der fhem.cfg landet, während ein set ... für mich ein Laufzeitparameter ist. Bei disable gehe davon aus, dass das Device da ist, aber nicht genutzt wird. Somit funktioniert dann auch das reread, dass ich eingebaut habe nicht. Bei stopped wird halt der interne Timer angehalten und reread funktioniert weiterhin.

Grüße Jörg

PS. Ist halt eher "Glaubensfrage"
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

JoWiemann

Zitat von: Wernieman am 14 April 2015, 14:50:25
Dein Modul hört sich gut an nur .... könntest Du eventuell eine Minimalkonfigbeispiel geben?

Sind die beiden folgenden Parameter optional?
dbplan_journey_prod -> DB travel products like: ICE
dbplan_journey_opt -> DB travel options like: direct connection

Die beiden Parameter sind optional. Es werden dann einfach alle Produkte (ICE, IC, Bus, Strassenbahn,...) in der Suche berücksichtigt. Bei Optionen kann noch angegeben werden, ob z.B. nur Direktverbindungen, also ohne Umsteigen und/oder Fahrradmitnahme berücksichtigt wird.

Produkte und Optionen entsprechen auch den Kriterien/Filtern, wie sie auf der DB Fahrplansuche zu finden sind.

Schau Dir doch einfach mal alle Attribute dbplan_* an. Einfach zunächst ein: define MeinPlan DBPlan 300 eingeben und unter attr ein dbplan_* Attribut auswählen. Bei dbplan_journey_prod / dbplan_journey_opt  erscheint dann eine Liste, in der mehrere Kriterien ausgewählt werden können.

Für departure und Destination bitte gültige Daten eingeben. Am Besten erst einmal auf der DB Fahrplan Seite testen, ob die Orte / Haltestellen funktionieren.

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

Risiko

Hallo Jörg,

super. Vielen vielen Dank für das Modul.

Risiko.