Abfahrtszeiten der Deutschen Bahn in FHEM anzeigen

Wer oft mit den öffentlichen Verkehrsmitteln unterwegs ist, wird diese Situation kennen. Man steht morgens um 6 Uhr auf, geht zur Bahnhaltestelle um dann festzustellen, dass die Bahn 15min Verspätung hat. Diese 15min hätte man lieber noch im Warmen am Frühstückstisch verbracht. Da liegt es doch nahe, die Abfahrtszeiten mit TabletUI auf seinen Schaltzentralen-Tablet anzeigen zu lassen. In diesem Beitrag erkläre ich euch, wie ihr dafür die Grundlage in FHEM bereitstellt. Mit Hilfe des Moduls DBPlan lassen sich die Abfahrtzeiten von der Infoseite der Deutschen Bahn als Readings laden. Anschließen kann man sich diese mit einer ReadingsGroup in einer Tabelle anzeigen lassen.

Vorbereitung auf dem Raspberry Pi

Für das Modul DBPlan wird das Perl Modul HTML:Table Extract benötigt. Sollte dies noch nicht installiert sein, sollte man dies nun nachinstallieren:

DBPlan als Verbindung zur Infoseite der Deutschen Bahn

Um die Abfahrtszeiten laden zu können, benötigt man das Modul DBPlan. Da dieses Modul noch nicht zur Standardinstallation von FHEM gehört, muss dies manuell nachinstalliert werden:

Anschließend FHEM neu starten:

Nun lässt sich das Modul „DBPlan“ definieren:

Der Name Bahn_Kronenplatz und das Interval von 300 Sekunden (5 Minuten) kann natürlich angepasst haben. Das Intervall sollte natürlich nicht allzu groß gewählt werden. Ein Intervall von 30 Minuten ist eher konterproduktiv, sollten die Bahnen alle 5 Minuten fahren.

Bahn DBPlan FHEM

Das „nackte“ Modul gibt leider noch keine Infos preis. Für die Abfahrtszeiten muss man dem Modul noch den Start- und Zielbahnhof mitteilen. Dies geschieht über Attribute:

Hierbei ist darauf zu achten, dass der Name der Bahnhöfe auf der Infoseite der Bahn zu finden ist.

Bahn DBPlan FHEM

Sollten die Haltestellen existieren werden nach einigen Minuten die Abfahrtszeiten als Reading angezeigt.

Bahn DBPlan FHEM

readingsGroup für die Erstellung eines Abfahrtsmonitors 

Diese Readings sind natürlich nicht gerade sehr anschaulich und für das schnelle Rausfinden einer Verbindung nicht gerade vorteilhaft. Das Erstellen einer readingsGroup schafft da Abhilfe.

Den Eintrag „Bahn_Kronenplatz“ entsprechend anpassen. Mit dem Attribut mapping lassen sich noch die Einträge in der ersten Spalte anpassen. Der Name „Bahn_Kronenplatz“ wird durch den etwas hübscheren Eintrag „‚Hübschstraße -> Kronenplatz“ ersetzt.

Abfahrtsmonitor FHEM Bahn

Die Einträge des Abfahrtsmonitor können natürlich beliebig erweitert werden. Für jede weitere Verbindung muss jedoch ein extra DBPlan definiert werden.

Wie ihr den Abfahrtsmonitor in TabletUI einbindet erfahrt ihr hier.

31 Kommentare zu “Abfahrtszeiten der Deutschen Bahn in FHEM anzeigen

    • Hallo rabe,
      danke für den Hinweis, habe es entsprechend angepasst.
      Der Tipp, die Daten direkt beim örtlichen Verkehrsunternehmen abzurufen ist sehr nützlich, nur leider bietet die KVV (Karlsruher Verkehrsbetriebe) sowas hier nicht an.
      Gruß Daniel

    • Jede Lösung hat ihre Vorteile.
      Im direkten Vergleich zeigt mir rnv Verspätungen an und die Bahn meint die Straßenbahn ist pünktlich.
      Ich werde das mal für den Hauptbahnhof von Heidelberg prüfen.

  1. Ich nehme morgens immer zu einer bestimmten Zeit den RB (6:08) vom HBF xxx. Nun wäre es cool, wenn ich mittels pushover eine Message erhalten könnte, wenn dieser Zug entweder ausfällt oder zu spät kommt. Könnte mir da jemand ein Beispiel geben ?

    Danke und Gruss, Sven

    • Hallo Sven,

      ich würde es mit einem DOIF-Modul machen. Das DBPlan-Device heißt in meinem Fall „Bahn_Kronenplatz“ und das Device für den Push heißt „Push“ –> siehe Blog-Beitrag für Pushover.

      Das DOIF-Device lässt sich dann wie folgt definieren. Eine eventuelle Verspätung wird ja im Reading „plan_departure_delay_1“ festgehalten.

      define BahnZuSpaet DOIF ([Bahn_Kronenplatz:plan_departure_delay_1] ne "none") (set Push msg 'Verspätungsalarm' 'Die Bahn kommt [Bahn_Kronenplatz:plan_departure_delay_1] Minuten zu spät')

      Sobald sich das Reading „plan_departure_delay_1“ ändert, wird durch das DOIF überprüft ob eine Verspätung vorliegt –> ne „none“. Das „ne“ ist dabei das Gegenteil zu „eq“ und steht für „not equal“, also ungleich „none“.
      Ist dies der Fall, dann wird die Pushnachricht abgesetzt.

      Hoffe ich konnte dir mit dem Beispiel bisschen helfen, ansonsten einfach melden 😉

      Gruß Daniel

    • Danke für das Beispiel . Werde es mal testen. Allerdings möchte ich nicht zu jeder Verspätungeine Info erhalten ssonder nur für eine bbestimmte Verbindung. Zum Beispiel der RE nach Düsseldorf um 6:08. Informiert möchte ich dann aber schon um 5:30.
      Könntest Du mir da noch etwas zu basteln?
      Danke

    • Hallo,
      habe mir mal paar Gedanken gemacht. Hier ist das Problem, dass ja dann um 05:30 die Verbindung um 06:08 schon im DBPlan-Device geladen sein muss. Ich kann das nun für deinen Fall schlecht überprüfen, aber wenn man davon ausgeht, dass die Verbindung um 06:08 morgens um 05:30 am dritten Platz im DBPlan steht, dann könnte das in etwa wie folgt klappen:

      Für zeitabhängige Aktionen nimmt man am besten ein at-Device. Zuerst erstelle ich dann ein paar Variablen. Zum Einen den Bahn-Typ („Zug“) um später den gewünschten RE rauszufiltern. Um dies noch genauer zu machen, lade ich mir noch die Abfahrtszeit in die Variable „Abfahrt“. Die Verspätung landet dann noch in der Variable „Verspaetung“.

      Im at-Device erstelle ich dann ein if-Abfrage, die nach der Verbindung des RE um 06:08 abfragt und ob eine Verspätung vorliegt. Ist dies der Fall wird die Push-Nachricht gesendet.

      define BahnZuSpaut at *05:30:00 {my $Zug=(ReadingsVal("Bahn_Kronenplatz","plan_connection_3",0));; my $Abfahrt=(ReadingsVal("Bahn_Kronenplatz","plan_departure_3",0));; my $Verspaetung=(ReadingsVal("Bahn_Kronenplatz","plan_departure_delay_3",0));; if(($Zug eq "RE") && ($Abfahrt eq "06:30") && ($Verspaetung ne "none")){fhem("set Push msg 'Verspätungsalarm' 'Die Bahn kommt $Verspaetung Minuten zu spät'")}}

      Wie du sicher merkst, verwende ich jeweils den dritten Eintrag –> plan_connection_3 etc. Voraussetzung ist also, dass um 05:30 die gewünschte Verbindung im dritten Eintrag geladen wurde. Ansonsten halt anpassen. Sollten es ab und zu mal wechseln, dann am besten jeden Platz in Variablen abspeichern und alle dann abfragen –>

      my $Zug1=(ReadingsVal("Bahn_Kronenplatz","plan_connection_1",0));;
      my $Zug2=(ReadingsVal("Bahn_Kronenplatz","plan_connection_2",0));;
      my $Zug2=(ReadingsVal("Bahn_Kronenplatz","plan_connection_3",0));;

      und dann die if-Abfrage entsprechend anpassen –>

      if((($Zug1 eq "RB") || ($Zug2 eq "RB") || ($Zug3 eq "RB")) && ...

      Hab es mal kurz getestet bei mir. Hat alles soweit geklappt. Wichtig ist halt, dass um 05:30 der RE um 06:08 bereits geladen wurde.

      Gruß Daniel

    • Damit sollte ich doch jede Möglichkeit die um 5:00 auftreten könnte, abgearbeitet haben, oder ?

      define BahnZuSpaet at *05:00:00 {my $Zug1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_1",0));; my $Zug2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_2",0));; my $Zug3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_3",0));; my $Abfahrt1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_1",0));; my $Abfahrt2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_2",0));; my $Abfahrt3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_3",0));; my $Verspaetung1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_1",0));; my $Verspaetung2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_2",0));; my $Verspaetung3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_3",0));; if((($Zug1 eq "RB") || ($Zug2 eq "RE") || ($Zug3 eq "ERB")) && (($Abfahrt1 in ("05:43","6:08")) || ($Abfahrt2 in ("05:43","6:08")) || ($Abfahrt2 in ("05:43","6:08"))) && (($Verspaetung1 ne "none") || ($Verspaetung2 ne "none") || ($Verspaetung3 ne "none"))){fhem("set PushMessenger msg 'Zugverspätung' 'Die Bahn kommt $Verspaetung1 Minuten zu spät.'")}}

      Gruss, Sven

    • Hallo,

      sieht ganz gut aus. Denke das sollte so klappen. Was man noch optimieren könnte ist, dass man für jede Verbindung (1,2 und 3) eine extra if-Abfrage macht mit dem entsprechenden push-Befehl. So könnte man in der Push-Nachricht mehr Infos reinbringen welcher Zug Verspätung hat. In deinem Fall ist es nun nämlich so, dass zum Beispiel Zug 3 Verspätung hat, aber in der Push steht die Verspätungszeit ($Verspätung1) der ersten Verbindung.

      ...
      if(($Zug1 eq "RB") && ($Abfahrt1 in ("05:43","6:08")) && ($Verspaetung1 ne "none")){fhem("set PushMessenger msg 'Zugverspätung vom $Zug1 um $Abfahrt1' 'Die Bahn kommt $Verspaetung1 Minuten zu spät.'")};; if(($Zug2 eq "RB") && ($Abfahrt2 in ("05:43","6:08")) && ($Verspaetung2 ne "none")){fhem("set PushMessenger msg 'Zugverspätung vom $Zug2 um $Abfahrt2' 'Die Bahn kommt $Verspaetung2 Minuten zu spät.'")};;
      ...

      Ich weiß jetzt nicht wie den DB-Plan morgens um 5 Uhr aussieht. Aber laut deiner IF-Abfrage, klappt diese ja nun nur, wenn Zug1 ein „RB“, Zug1 ein „RE“ oder Zug3 ein „ERB“ ist. Da nochmal nachschauen, ob dies der Fall ist. Trifft nämlich keiner dieser Punkte zu, dann kommt keine Push, obwohl eine Verspätung vorliegt. Sollten auf deiner Verbindung, die du im DBPlan eingerichtet hast nur RB,RE und ERB unterwegs sein, dann kannst du ja auch diese ganze Abfrage des Zugtyps rausnehmen. Oder solltest du morgens immer nur den RB nehmen, dann einfach Abfragen ob Zug1, Zug2 oder Zug3 ein RB ist. Morgens um 5 Uhr sollte ja dann auf irgendeiner dieser drei Plätze dein benutzter RB vorhanden sein.

      Gruß Daniel

  2. So sollte ich alle Möglichkeiten, die um 5:00 im Plan stehen könnten, abarbeiten können um den RB beispielsweise abzuklären.

    define BahnZuSpaet at *05:00:00 {my $Zug1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_1",0));; my $Zug2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_2",0));; my $Zug3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_3",0));; my $Abfahrt1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_1",0));; my $Abfahrt2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_2",0));; my $Abfahrt3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_3",0));; my $Verspaetung1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_1",0));; my $Verspaetung2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_2",0));; my $Verspaetung3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_3",0));; if(($Zug1 eq "RB") && ($Abfahrt1 in ("5:33","05:43","6:08")) && ($Verspaetung1 ne "none")){fhem("set PushMessenger msg 'Zugverspätung vom $Zug1 um $Abfahrt1' 'Die Bahn kommt $Verspaetung1 Minuten zu spät.'")};; if(($Zug2 eq "RB") && ($Abfahrt2 in ("5:33","05:43","6:08")) && ($Verspaetung2 ne "none")){fhem("set PushMessenger msg 'Zugverspätung vom $Zug2 um $Abfahrt2' 'Die Bahn kommt $Verspaetung2 Minuten zu spät.'")};; if(($Zug3 eq "RB") && ($Abfahrt3 in ("5:33","05:43","6:08")) && ($Verspaetung3 ne "none")){fhem("set PushMessenger msg 'Zugverspätung vom $Zug3 um $Abfahrt3' 'Die Bahn kommt $Verspaetung3 Minuten zu spät.'")}}

    Sollte ich doch nur die Verspätungen mir anzeigen lassen, die um 5:00 im Plan stehen, brächte ich doch dann nur auf Verspaetung1,2 oder 3 abfragen und Abfahrt und Zug außen vor lassen, richtig ?

    Gruss, Sven

    • Hallo,
      damit sollten alle RBs abgefangen werden. Aber wie du schon erwähnst. Theoretisch reicht es ja die Verspätungen abzufragen. Sollten dann welche auftreten, dann kann man ja z.B. in der Bahn-App genauer nachschauen.

      Gruß Daniel

  3. noch eine Anfängerfrage… wenn ich das Ganze rund um die uhr beobachten möchte, brauch ich doch nur define BahnZuSpaet at *05:00:00 {my $Zug1=(Rea... ohne at Angabe schreiben ?

     

    • Hallo Sven,

      so leicht geht es dann doch nicht. Ein at-Befehl ist immer mit einer Zeitangabe verbunden. Wenn man eine „dauerhafte“ Überwachung will, dann würde ich ein Notify-Device erstellen. Das könnte dann in etwa so aussehen:

      define BahnZuSpaut notify Bahn_Kronenplatz {my $Zug=(ReadingsVal("Bahn_Kronenplatz","plan_connection_3",0));; my $Abfahrt=(ReadingsVal("Bahn_Kronenplatz","plan_departure_3",0));; my $Verspaetung=(ReadingsVal("Bahn_Kronenplatz","plan_departure_delay_3",0));; if(($Zug eq "RB") && ($Abfahrt eq "06:30") && ($Verspaetung ne "none")){fhem("set Push msg 'Verspätungsalarm' 'Die Bahn kommt $Verspaetung Minuten zu spät'")}}

      Das Notify reagiert nun auf eine Änderung vom Device „Bahn_Kronenplatz“ –> also deinem DBPlan-Device. Sobald nun neue Readings im DBPlan-Device erscheinen, werden die Befehle in der Klammer ausgeführt. In den geschweiften Klammern kann dann der der gleich Ausdruck wie beim at-Device stehen.

      Gruß Daniel

  4. Bekomme keine pushinfo, obwohl um 11:00 im delay Verspätungen +5 bzw. +0 gewesen sind.

    define BahnZuSpaet at *11:05:00 {\
     my $Zug1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_1",0));;\
     my $Zug2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_2",0));;\
     my $Zug3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_3",0));;\
     my $Abfahrt1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_1",0));;\
     my $Abfahrt2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_2",0));;\
     my $Abfahrt3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_3",0));;\
     my $Verspaetung1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_1",0));;\
     my $Verspaetung2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_2",0));;\
     my $Verspaetung3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_3",0));;\
     if !($we) {\
      if(($Abfahrt1 in ("05:33","05:43","6:08")) && ($Verspaetung1 ne "none")){\
       fhem("set PushMessenger msg 'Zugverspätung vom $Zug1 um $Abfahrt1' 'Die Bahn kommt $Verspaetung1 Minuten zu spät.'");;\
      }\
      elseif(($Abfahrt2 in ("05:33","05:43","6:08")) && ($Verspaetung2 ne "none")){\
       fhem("set PushMessenger msg 'Zugverspätung vom $Zug2 um $Abfahrt2' 'Die Bahn kommt $Verspaetung2 Minuten zu spät.'");;\
      }\
      elseif(($Abfahrt3 in ("05:33","05:43","6:08")) && ($Verspaetung3 ne "none")){\
       fhem("set PushMessenger msg 'Zugverspätung vom $Zug3 um $Abfahrt3' 'Die Bahn kommt $Verspaetung3 Minuten zu spät.'");;\
      }\ 
     }\
    }
    attr BahnZuSpaet room Auskunft

    • Hallo Sven,

      so auf dem ersten Blick ist es logisch, dass du um 11 Uhr keine Push bekommst. In der IF-Abfrage fragst du ja nach einer Verbindung um „05:33″,“05:43“ oder um „6:08“. Um 11 Uhr wird aber keine Verbindung zu dieser Zeit im DBPlan gelistet sein. Und dann fängst du ja noch mit „!($we)“ ab, ob Wochenende ist. Deswegen wirst du gestern (Samstag) ja keine Push bekommen.

      Des Weiteren habe ich deine at-Definition mal auf meinem Daten angepasst –> überprüft ob Wochenende ist, statt auf „none“ auf „one“ getestet, damit es zutrifft und die Abfahrzeiten entsprechend angepasst. Hat leide auch nicht geklappt. Hab dann bisschen rum probiert. Wenn ich statt „elseif“ ein einfaches „if“ verwende und statt ...if(($Abfahrt1 in ("05:33","05:43","6:08"))... es auf drei ODER-Abfragen aufteile –>

      ...if((($Abfahrt1 eq "13:13") || ($Abfahrt1 eq "13:33") || ($Abfahrt1 eq "13:53")) && ($Verspaetung1 ne "one"))...

      dann klappt es. Hier die gesamte Definition:

      define BahnZuspaet at *13:10:00 {my $Zug1=(ReadingsVal("Bahn_Kronenplatz","plan_connection_1",0));;my $Zug2=(ReadingsVal("Bahn_Kronenplatz","plan_connection_2",0));;my $Zug3=(ReadingsVal("Bahn_Kronenplatz","plan_connection_3",0));;my $Abfahrt1=(ReadingsVal("Bahn_Kronenplatz","plan_departure_1",0));;my $Abfahrt2=(ReadingsVal("Bahn_Kronenplatz","plan_departure_2",0));;my $Abfahrt3=(ReadingsVal("Bahn_Kronenplatz","plan_departure_3",0));;my $Verspaetung1=(ReadingsVal("Bahn_Kronenplatz","plan_departure_delay_1",0));;my $Verspaetung2=(ReadingsVal("Bahn_Kronenplatz","plan_departure_delay_2",0));;my $Verspaetung3=(ReadingsVal("Bahn_Kronenplatz","plan_departure_delay_3",0));;if($we){if((($Abfahrt1 eq "13:13") || ($Abfahrt1 eq "13:33") || ($Abfahrt1 eq "13:53")) && ($Verspaetung1 ne "one")){fhem("set Push msg 'Zugverspätung vom $Zug1 um $Abfahrt1' 'Die Bahn kommt $Verspaetung1 Minuten zu spät.'");;}if((($Abfahrt2 eq "13:13") || ($Abfahrt2 eq "13:33") || ($Abfahrt2 eq "13:53")) && ($Verspaetung2 ne "one")){fhem("set Push msg 'Zugverspätung vom $Zug2 um $Abfahrt2' 'Die Bahn kommt $Verspaetung2 Minuten zu spät.'");;}if((($Abfahrt3 eq "13:13") || ($Abfahrt3 eq "13:33") || ($Abfahrt3 eq "13:53")) && ($Verspaetung3 ne "one")){fhem("set Push msg 'Zugverspätung vom $Zug3 um $Abfahrt3' 'Die Bahn kommt $Verspaetung3 Minuten zu spät.'");;}}}

      Gruß Daniel

  5. Die Sache mit den Zeiten hatte ich für den Test auch angepasst. Dein notify Beispiel ging aber auch nicht, selbst wenn ich bei beiden Varianten nur auf Verspätung abfrage.

    Die Frage die sich mir nun aber stellt ist, warum eine Abfrage auf $Verspaetung3 ne "one" funktioniert, wo in den Readings none steht.

    • Hallo Sven,

      also das Notify klappt bei mir definitiv. Habe es gerade nochmal getestet. Auch die diversen at-Befehle klappen ohne Probleme. Das mit den „one“ habe ich immer gemacht, damit ich die Abfrage testen kann. ne „one“ trifft nämlich immer zu.
      Vielleicht ist bei dir etwas falsch kopiert worden. Den manchmal kann es vorkommen, dass Zeichen, wie zum Beispiel " oder ' beim Kopieren verändert werden. Am besten so „komplexe“ Abfragen immer im einfachen Text-Editor erstellen und dann daraus kopieren. Verwendet man Word oder so, werden diese Zeichen verändert. Oder auch, wenn man hier aus den Kommentaren rauskopiert, kann es zu Problemen führen, wenn der Code nicht als „Code“ gekennzeichnet wird.

      Und dann könnten noch Fehlern bei den Zeilenumbrüchen sein. Ich mache es deswegen so, dass ich mir die Definition im Texteditor zusammen stelle und dann alles ohne Zeilenumbrüche nach FHEM kopieren.

      Gruß Daniel

  6. So, jetzt bin ich einen Schritt weiter.

    define HBF_Duesseldorf_Oberhausen_ToLate_W notify HBF_Duesseldorf_Oberhausen {\
     my $Zug1=(ReadingsVal("HBF_Duesseldorf_Oberhausen","plan_connection_1",0));;\
     my $Zug2=(ReadingsVal("HBF_Duesseldorf_Oberhausen","plan_connection_2",0));;\
     my $Zug3=(ReadingsVal("HBF_Duesseldorf_Oberhausen","plan_connection_3",0));;\
     my $Abfahrt1=(ReadingsVal("HBF_Duesseldorf_Oberhausen","plan_departure_1",0));;\
     my $Abfahrt2=(ReadingsVal("HBF_Duesseldorf_Oberhausen","plan_departure_2",0));;\
     my $Abfahrt3=(ReadingsVal("HBF_Duesseldorf_Oberhausen","plan_departure_3",0));;\
     my $Verspaetung1=(ReadingsVal("HBF_Duesseldorf_Oberhausen","plan_departure_delay_1",0));;\
     my $Verspaetung2=(ReadingsVal("HBF_Duesseldorf_Oberhausen","plan_departure_delay_2",0));;\
     my $Verspaetung3=(ReadingsVal("HBF_Duesseldorf_Oberhausen","plan_departure_delay_3",0));;\
     #if !($we) {\
      if(($Verspaetung1 ne "none") || ($Verspaetung1 ne "+0")){\
       fhem("set PushMessenger msg 'Zugverspätung vom $Zug1 um $Abfahrt1' 'Die Bahn kommt $Verspaetung1 Minuten zu spät.'");;\
      }\
      if(($Verspaetung2 ne "none") || ($Verspaetung2 ne "+0")){\
       fhem("set PushMessenger msg 'Zugverspätung vom $Zug2 um $Abfahrt2' 'Die Bahn kommt $Verspaetung2 Minuten zu spät.'");;\
      }\
      if(($Verspaetung3 ne "none") || ($Verspaetung3 ne "+0")){\
       fhem("set PushMessenger msg 'Zugverspätung vom $Zug3 um $Abfahrt3' 'Die Bahn kommt $Verspaetung3 Minuten zu spät.'");;\
      }\
     #}\
    }
    attr HBF_Duesseldorf_Oberhausen_ToLate_W room Auskunft

    #define HBF_Duesseldorf_Oberhausen_ToLate_W_notify_ein at *13:30:00 attr HBF_Duesseldorf_Oberhausen_ToLate_W disable 0
    #define HBF_Duesseldorf_Oberhausen_ToLate_W_notify_aus at *15:30:00 attr HBF_Duesseldorf_Oberhausen_ToLate_W disable 1

    Über das define erhalte ich nun die Pushnachrichten, allerdings auch die none und +0. Kurioser Weise sogar Nachrichten mit dem Wortlaut „Zugverspätung vom none um none‚ ‚Die Bahn kommt none Minuten zu spät.“

    Dieser part klappt aber irgendwie gar nicht.

    define HBF_Duesseldorf_Oberhausen_ToLate_W_notify_ein at *13:30:00 attr HBF_Duesseldorf_Oberhausen_ToLate_W disable 0
    define HBF_Duesseldorf_Oberhausen_ToLate_W_notify_aus at *15:30:00 attr HBF_Duesseldorf_Oberhausen_ToLate_W disable 1

    Gruss, Sven

    • Hallo Sven,

      das Notify sieht doch schonmal gut aus. Dass du auch eine Nachricht bei „none“ und „+0“ bekommst ist laut deiner Definition korrekt. Schau die mal diesen Part an:

      ...if(($Verspaetung1 ne "none") || ($Verspaetung1 ne "+0")){\...

      Dort fragst du ab, ob die Verspätung nicht „none“ ODER nicht „+0“ ist. Sobald eines davon zutrifft, wird die Push gesendet. Ist die Verspätung also „none“, dann trifft der zweite Part (ne „+0“) zu und die Push wird gesendet. Andersrum genau so, ist die Verspätung „+0“, dann trifft der erste Part zu (ne „none“) und die Push wird gesendet. Also einfach das ODER-Zeichen (||) in ein UND-Zeichen ändern (&&). Die Push wird dann nur gesendet, wenn nicht „none“ und nicht „+0“ ist.

      Die Nachrichten mit den ganzen „nones“ ist jedoch sehr verwirrend. Kann mir nicht herleiten warum diese auftreten.

      Zu deinem letzten Part mit den at-Devices um das Notify aktivieren bzw. deaktivieren: Habe es bei mir mal getestet, hat soweit geklappt. Kann es sein, dass du die Devices direkt in der Config-Datei erstellst??
      Mich irritieren nämlich die #-Zeichen vor der Definition. In der FHEM-Config deutet dies dann nämlich auf ein Kommentar hin:

      #define HBF_Duesseldorf_Oberhausen_ToLate_W_notify_ein at *13:30:00 attr HBF_Duesseldorf_Oberhausen_ToLate_W disable 0
      #define HBF_Duesseldorf_Oberhausen_ToLate_W_notify_aus at *15:30:00 attr HBF_Duesseldorf_Oberhausen_ToLate_W disable 1

      Ich habe es direkt über die FHEM-Kommandozeile definiert und es klappt:

      define BahnspaetAN at *19:22:00 attr BahnZuSpaet disable 0

      Bahn PUSH AN

      Gruß Daniel

    • Moin Daniel,

      mit dem && hätte ich bei negativ Abfrage auch selbst drauf kommen können. Das war wohl auch der Grund warum ich Text mit None bekommen habe. Das define mit disable habe ich nochmal über die Kommandozeile eingefügt (wofür stehen dort die Optionen wie periodic, timespec oder so ähnlich ?) und der Push klappt jetzt. ABER… ich bekomme zu einer Verbindung mal 8, mal 11 oder sogar 14 Pushnachrichten. Auch wenn fhem es gut mit mir meint, aber eine Info sollte doch reichen ;o) Hast Du eventuell noch eine Idee, warum ich zu einer notify selbiger Uhrzeit x Mal eine Message erhalte ?

    • Hallo Sven,
      mit den Optionen (periodic, relativ, timespec) lässt sich das at-Device regeln:
      relativ: Die angegebene Zeit unter timespec wird als „reine Zeit-Angabe“ gesehen, also 00:01:00 bedeutet 1 Minute und nicht 0:01 Uhr. Unter DEF erkennt man das dann durch ein +
      periodic: Die Befehl wird periodisch widerholt. Entweder jede Minute (wenn relativ) oder halt jeden Tag um 0:01 Uhr. Erkennbar unter DEF durch ein *.

      at Erklärung

      Zu deinem Problem mit den wiederholten Push-Nachrichten. Das Problem hatte ich auch, dachte das wäre irgendein Fehler bei mir. Aber scheint ja auch bei dir so zu sein.
      Habe nun das notify bisschen angepasst bzw. erweitert.

      Und zwar sobald nun eine Push abgesendet wird, wird das Notify deaktiviert und temporär ein at-Device definiert, welches das notify nach einer Minute wieder aktiviert. So kommt bei mir nur eine Push-Nachricht an.
      Vllt kann das at-Device noch runter auf paar Sekunden gestellt werden, habe es nicht genauer getestet.

      Hier meine Definition:

      define BahnZuSpaet notify Bahn_Kronenplatz {my $Zug=(ReadingsVal("Bahn_Kronenplatz","plan_connection_3",0));; my $Abfahrt=(ReadingsVal("Bahn_Kronenplatz","plan_departure_3",0));; my $Verspaetung=(ReadingsVal("Bahn_Kronenplatz","plan_departure_delay_3",0));; if(($Zug eq "STR") && ($Abfahrt eq "13:33") && ($Verspaetung ne "none")){fhem("set Push msg 'Verspätungsalarm' 'Die Bahn kommt $Verspaetung Minuten zu spät';; define NotifyAUS at +00:01:00 attr BahnZuSpaet disable 0;; attr BahnZuSpaet disable 1")}}

      Achte jedoch darauf, dass das Setzen des Attributs „disable 1“ am Ende des Notifys geschieht, kann sein, dass das Notify direkt abbricht, wenn es mitten in den if-Abfragen gesetzt wird. In deinem Fall würde ich es dann einfach ans Ende setzen:

      ...if(($Verspaetung2 ne "none") || ($Verspaetung2 ne "+0")){fhem("set PushMessenger msg 'Zugverspätung vom $Zug2 um $Abfahrt2' 'Die Bahn kommt $Verspaetung2 Minuten zu spät.'");;} if(($Verspaetung3 ne "none") || ($Verspaetung3 ne "+0")){fhem("set PushMessenger msg 'Zugverspätung vom $Zug3 um $Abfahrt3' 'Die Bahn kommt $Verspaetung3 Minuten zu spät.'");;} define NotifyAUS at +00:01:00 attr HBF_Duesseldorf_Oberhausen_ToLate_W_notify_ein disable 0;; attr HBF_Duesseldorf_Oberhausen_ToLate_W_notify_ein disable 1")}}

      Gruß Daniel

  7. Irgendwie passen die Klammern am Ende nicht, oder ?!

    define NotifyAUS at +00:01:00 attr HBF_Duesseldorf_Oberhausen_ToLate_W_notify_ein disable 0;; attr HBF_Duesseldorf_Oberhausen_ToLate_W_notify_ein disable 1")}} oder soll das in den Fhem-Befehl?

    Ich rufe das define mit einer Zeitspanne auf.

    define HBF_Duesseldorf_Oberhausen_ToLate_W_notify_ein at *14:00:00 attr HBF_Duesseldorf_Oberhausen_ToLate_W disable 0
    define HBF_Duesseldorf_Oberhausen_ToLate_W_notify_aus at *15:00:00 attr HBF_Duesseldorf_Oberhausen_ToLate_W disable 1

    Kolidiert Deine 1 Minutenspanne damit nicht ?

     

     

    • Hallo,

      die Klammern stimmen schon. Es soll alles in den FHEM-Befehl. Sind ja alles Befehle, die man so in die FHEM-Kommandozeile eingeben könnte.

      Glaube nicht das es kollidiert. Mit deiner Zeitspanne ist das Notify ja nur zwischen 14 und 15 Uhr aktiv. Außerhalb dieses Fensters macht das Notify ja dann schonmal nichts –> disable 1.
      Innerhalb dieses Zeitfensters ist dann disable 0. Sollte nun das Notify anspringen wegen einer Verspätung, dann werden die ganzen Variablen erstellt und die if-Abfragen abgefragt.

      Treffen diese if-Abfragen zu, dann wird ja die Push versendet und das Notify auf disable 1 gesetzt, nach 1 Minute dann wieder auf disable 0 –> also genau so wie in deinem Zeitfenster gewünscht.

      Um 15 Uhr wird ja dann das Notify wieder auf disable 1 gesetzt und das Notify löst dann gar nicht erst aus, erst wieder um 14 Uhr. Also logischer Weise müsste das ja alles klappen. Habe es aber nicht getestet.

      Gruß Daniel

  8. Hier mal der komplette Code.

    define HBF_Oberhausen_Duesseldorf_ToLate_W notify HBF_Oberhausen_Duesseldorf {\
     my $Zug1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_1",0));;\
     my $Zug2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_2",0));;\
     my $Zug3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_3",0));;\
     my $Abfahrt1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_1",0));;\
     my $Abfahrt2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_2",0));;\
     my $Abfahrt3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_3",0));;\
     my $Verspaetung1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_1",0));;\
     my $Verspaetung2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_2",0));;\
     my $Verspaetung3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_3",0));;\
      if(($Verspaetung1 ne "none") && ($Verspaetung1 ne "+0")){\
       fhem("set PushMessenger msg 'Zugverspätung vom $Zug1 um $Abfahrt1' 'Die Bahn kommt $Verspaetung1 Minuten zu spät.';; define NotifyAUS_4 at +00:01:00 attr HBF_Oberhausen_Duesseldorf_ToLate_W_notify_ein disable 0;; attr HBF_Oberhausen_Duesseldorf_ToLate_W_notify_ein disable 1");;\
      }\
      if(($Verspaetung2 ne "none") && ($Verspaetung2 ne "+0")){\
       fhem("set PushMessenger msg 'Zugverspätung vom $Zug2 um $Abfahrt2' 'Die Bahn kommt $Verspaetung2 Minuten zu spät.';; define NotifyAUS_5 at +00:01:00 attr HBF_Oberhausen_Duesseldorf_ToLate_W_notify_ein disable 0;; attr HBF_Oberhausen_Duesseldorf_ToLate_W_notify_ein disable 1");;\
      }\
      if(($Verspaetung3 ne "none") && ($Verspaetung3 ne "+0")){\
       fhem("set PushMessenger msg 'Zugverspätung vom $Zug3 um $Abfahrt3' 'Die Bahn kommt $Verspaetung3 Minuten zu spät.';; define NotifyAUS_6 at +00:01:00 attr HBF_Oberhausen_Duesseldorf_ToLate_W_notify_ein disable 0;; attr HBF_Oberhausen_Duesseldorf_ToLate_W_notify_ein disable 1");;\
      }\
    }
    attr HBF_Oberhausen_Duesseldorf_ToLate_W disable 1
    attr HBF_Oberhausen_Duesseldorf_ToLate_W room Auskunft

    define HBF_Oberhausen_Duesseldorf_ToLate_W_notify_ein_2 at *05:00:00 attr HBF_Oberhausen_Duesseldorf_ToLate_W disable 0
    define HBF_Oberhausen_Duesseldorf_ToLate_W_notify_aus_2 at *06:00:00 attr HBF_Oberhausen_Duesseldorf_ToLate_W disable 1

    Schreibweise richtig ?

    • Hallo,
      habe dein Code nochmal bei mir eingesetzt (entsprechend angepasst). Mir ist dann aufgefallen, dass bei dir noch ein kleiner Fehler war, habe ich vorhin übersehen.

      Mit dem at-Device innerhalb der if-Abfragen muss für 1 Minute das notify selbst disable gesetzt werden –> HBF_Oberhausen_Duesseldorf_ToLate_W notify.
      In deinem Code wurde die notify auf disable gesetzt, die für das Zeitfenster nötig waren –> ...at +00:01:00 attr HBF_Oberhausen_Duesseldorf_ToLate_W_notify_ein disable 0

      Dann klappte es bei mir auch erstmal alles ganz gut. Hatte dann aber das Problem, dass ab und zu wieder Nachrichten kamen mit ganz viel „none“. Hab dann das DBPlan-Device mal bisschen beobachtet. Wenn es aktuallisiert wird, dann erscheint manchmal ganz kurz bei allen Readings „none“, dies wird dann auch in die ganzen Variablen geladen und deswegen die ganzen „none“s in der Push. Nach langem testen und ausprobieren kam ich dann auf eine Lösung.

      Ein weiteres notify (notifyVerspaetung), welches bei einer Änderung vom DBPlan ein at-Device (DELAY) definiert. Dieses setzt dann nach 10 Sekunden ein dummy-Device (Verspaetung) auf „on“ auf das dann das eigentliche Verspätungs-Push-Notify reagiert. Ergebnis: Die Variablen (Zug1,Zug2 etc) werden erst nach 10 Sekunden beschrieben, genug Zeit, dass die Readings ordentlich geladen wurden.

      Habe hier deinen Code angepasst. Ich würde den nun mal über das Eingabefeld eingeben. Ich empfehle dir allgemein nur mit dem Eingabefeld zu arbeiten. Direkt im config-File zu arbeiten führt oft zu Fehlern etc. Sei es ein ; zu wenig oder vergessen den Zeilenumbruch richtig zu deklarieren. Ich arbeite ausschließlich über das Eingabefeld, man bekommt so auch direkt ein Feedback wenn etwas bezüglich der Syntax falsch ist. Im config-File selber kann ein Fehler dann komplett FHEM zerstören bzw. nicht mehr aufrufbar machen. Bei so komplexen Devices kannst du dann auch einfach durch ein Klick auf „DEF“ ganz einfach die Definition bearbeiten, ohne es in der Config-File direkt machen zu müssen –> siehe Bild

      Hilfs-Notify:

      define notifyVerspaetung notify HBF_Oberhausen_Duesseldorf {fhem("define DELAY at +00:00:10 set Verspaetung on")}

      Dummy:

      define Verspaetung dummy

      eigentliches Verspätungs-Push-Notify:

      define HBF_Oberhausen_Duesseldorf_ToLate_W notify Verspaetung {fhem("set Verspaetung off");; my $Zug1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_1",0));; my $Zug2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_2",0));; my $Zug3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_connection_3",0));; my $Abfahrt1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_1",0));; my $Abfahrt2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_2",0));; my $Abfahrt3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_3",0));; my $Verspaetung1=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_1",0));;my $Verspaetung2=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_2",0));;my $Verspaetung3=(ReadingsVal("HBF_Oberhausen_Duesseldorf","plan_departure_delay_3",0));;if(($Verspaetung1 ne "none") && ($Verspaetung1 ne "+0")){fhem("set PushMessenger msg 'Zugverspätung vom $Zug1 um $Abfahrt1' 'Die Bahn kommt $Verspaetung1 Minuten zu spät.';; define NotifyAUS_4 at +00:01:00 attr HBF_Oberhausen_Duesseldorf_ToLate_W notify disable 0;; attr HBF_Oberhausen_Duesseldorf_ToLate_W notify disable 1");;}if(($Verspaetung2 ne "none") && ($Verspaetung2 ne "+0")){fhem("set PushMessenger msg 'Zugverspätung vom $Zug2 um $Abfahrt2' 'Die Bahn kommt $Verspaetung2 Minuten zu spät.';; define NotifyAUS_5 at +00:01:00 attr HBF_Oberhausen_Duesseldorf_ToLate_W notify disable 0;; attr HBF_Oberhausen_Duesseldorf_ToLate_W notify disable 1");;}if(($Verspaetung3 ne "none") && ($Verspaetung3 ne "+0")){fhem("set PushMessenger msg 'Zugverspätung vom $Zug3 um $Abfahrt3' 'Die Bahn kommt $Verspaetung3 Minuten zu spät.';; define NotifyAUS_6 at +00:01:00 attr HBF_Oberhausen_Duesseldorf_ToLate_W notify disable 0;; attr HBF_Oberhausen_Duesseldorf_ToLate_W notify disable 1");;}}

      attr HBF_Oberhausen_Duesseldorf_ToLate_W room Auskunft

      Zeitfenster at-Devices:

      define HBF_Oberhausen_Duesseldorf_ToLate_W_notify_ein_2 at *05:00:00 attr HBF_Oberhausen_Duesseldorf_ToLate_W disable 0

      define HBF_Oberhausen_Duesseldorf_ToLate_W_notify_aus_2 at *06:00:00 attr HBF_Oberhausen_Duesseldorf_ToLate_W disable 1

      Vielleicht geht es auch eleganter, aber momentan fällt mir nichts besseres ein, um die „none“s abzufangen. Sieht bis jetzt bei mir aber ganz gut aus. Hoffen wir mal, dass es diesmal auch den Langzeittest besteht 🙂

      Gruß Daniel

  9. Ich habe es so eingebeben.
    Vorher natürlic noch…

    define HBF_Oberhausen_Duesseldorf DBPlan 300
    attr HBF_Oberhausen_Duesseldorf alias Oberhausen (HBF) nach Düsseldorf (HBF)
    attr HBF_Oberhausen_Duesseldorf dbplan_departure Hauptbahnhof, Oberhausen (Rheinland)
    attr HBF_Oberhausen_Duesseldorf dbplan_destination Düsseldorf Hbf
    attr HBF_Oberhausen_Duesseldorf room Auskunft

    Fhem strört sich aber an…

    define notifyVerspaetung HBF_Oberhausen_Duesseldorf {fhem("define DELAY at +00:00:10 set Verspaetung on")}

    Unknown module HBF_Oberhausen_Duesseldorf

    • ups, da hat ein notify gefehlt:

      define notifyVerspaetung notify HBF_Oberhausen_Duesseldorf {fhem("define DELAY at +00:00:10 set Verspaetung on")}

  10. Hi Daniel,

    klappt !!! Keine Wiederholungen.

    Das Einzigste was ggf. vom Urheber des dbplan Modules eingebaut werden könnte, wäre die Tatsache, dass öfters bei den Verspätungen Hinweis steht. Schaut man dann in die Reiseauskunft der DB steht dort ein Icon mit der Info Fahrt fällt aus. Wenn man das auslesen könnte, wäre es toll und würde (so wie heute) den Weg zum Bahnhof um jene Uhrzeit ersparen.

    Gruss, Sven

    • Hallo,

      super, gut Ding will Weile haben 😉
      Mit dem Hinweis auslesen wäre echt eine gute Idee, vllt liest der Urheber ja mit 🙂

      Gruß Daniel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*