Verkehrsinfo und Traffic – Verkehrsmeldungen in FHEM einbinden

Nach meinem Artikel über den Spritpreismonitor, wird der folgende Artikel sich ebenfalls an die Autofahrer unter euch richten. Ich werde euch zeigen, wie ihr Verkehrsmeldungen in FHEM einbindet, sie ansprechend im TabeltUI darstellt und euch jeden morgen die aktuellen Verkehrsmeldungen per Telegram oder Pushover auf euer Handy schicken lasst. 

Für die Verkehrsinfos stellt FHEM im Grunde zwei Module zur Verfügung, abgesehen von diversen Möglichkeiten über HTTPMOD. Zum Einen das Modul "Verkehrsinfo" und zum Anderen das Modul "TRAFFIC" zur Verfügung.

"Vekehrsinfo" basiert auf Verkehrsmeldungen diverser Quellen. Neben dem Beschränken auf einzelnen Autobahnen oder Bundesstraßen lassen sich auch ganze Bundesländer auswählen.

Das Modul "TRAFFIC" verfolgt einen anderen Weg. Anstatt Verkehrsmeldungen bestimmter Autobahnen anzuzeigen, berechnet das Modul "TRAFFIC" basierend auf den aktuellen Verkehr die Reisezeit einer bestimmten Strecke. So lässt sich zum Beispiel der Arbeitsweg angeben und dann die benötigte Reisezeit als Reading ausgeben.

  • Verkehrsinfo
  • Traffic

Wie oben schon erwähnt, baut das Modul "Verkehrsinfo" auf die Stau- und Verkehrsmeldungen verschiedener Quellen auf. Aktuell werden folgende Quellen unterstützt:

  • https://verkehrsinfo.de
  • https://hessenschau.de
  • https://radiosaw.de
  • Da die Filterung der gewünschten Meldungen bei den Quellen "hessenschau.de" und "radiosaw.de" umtsändlich über Attribute erfolgt, habe ich mich für "verkehrsinfo.de" als Quelle entschieden. Hier erfolgt die Filterung über die entsprechende Wahl der URL. 

    Vorbereitung

    Damit die Abrage der Vekehrsinfos funktioniert, sind einige Vorbereitungen auf dem Raspberry notwendig. Um genau zu sein, sind die Perlmodule "HTML::TreeBuilder::XPath" und "libjson-perl" notwendig.

    sudo apt-get  libxml-treebuilder-perl libhtml-treebuilder-xpath-perl
    sudo apt-get install libjson-perl

    Vor der Definition in FHEM sollte der Raspberry neugestartet werden.

    sudo reboot

    die passende URL

    Wie schon erwähnt, definiert man das Modul über eine URL. Bevor mal also mit der Definition in FHEM beginnt, sollte man sich die passende URL raussuchen. Dazu einfach folgende URL aufrufen:

    https://www.verkehrsinfo.de/httpsmobil/

    Wählt man nun die gewünschte Straße bzw. das gewünschte Bundesland, erhält man in der Browserleiste die gewünschte URL. Für die Autobahn 5 (A5) lautet die URL wie folgt:

    https://www.verkehrsinfo.de/httpsmobil/index.php?c=staulist&street=A5&lat=&lon=

    Definition in FHEM

    Mit dieser URL lässt sich nun das Modul definieren.

    define VerkehrA5 Verkehrsinfo https://www.verkehrsinfo.de/httpsmobil/index.php?c=staulist&street=A5&lat=&lon= 3600

    Die "3600" beschreibt dabei den Aktuallisierungsintervall, in der die Verkehrsmeldungen aktualisiert werden. In diesem Fall also alle 60 Minuten.

    Nach einer kurzen Zeit erscheinen die Verkehrsmeldungen nun als Reading.

    zusätzliche Attribute

    Durch das Setzen von Attributen lassen sich die Verkehrsmeldungen etwas anpassen.

    filter_exclude / filter_include

    Mit den beiden Attributen "filter_exclude" und "filter_include" lassen sich die Verkehrsmeldungen filtern. Dabei werden die Verkehrsmeldungen nach den gesetzten Schlagwörtern durchsucht und entsprechend gefiltert.

    Beide Attribute können auch gemeinsam verwendet werden.

    attr VerkehrA5 filter_exclude Baustelle
    attr VerkehrA5 filter_include Karlsruhe

    In diesem Fall würden alle Meldungen bezüglich Baustellen rausgefiltert und des Weiteren nur Meldungen für Karlsruhe angezeigt. Beide Filter sind durch ein UND miteinander verknüpft. Ein Schlagwort, welches durch exclude rausgefiltert wurde, kann somit nicht über include wieder eingebunden werden.

    Hat man sich zum Beispiel ein Device für die Verkehrsmeldungen in Baden-Würtemberg definiert, so lassen sich mit den Filter-Attributen auch nach bestimmten Autobahnen filtern. 

    attr VerkehrBW filter_include A8

    Das oben gesetzt Attribut filtert zum Beispiel nach dem String "A8". Aber Achtung, diese neben der Autobahn "A8" wird nun auch zum Beisiel die Autobahn "A81" angezeigt, da der String "A8" ebenfalls in "A81" enthalten ist. Umgehen kann man dieses Problem durch eine kleiner Erweiterung des Attributs:

    attr VerkehrBW filter_include A8[a-zA-Z]

    Aber ich empfehle euch, lieber die entsprechende URL der gewünschten Autobahn für die Definition zu verwenden, als über die Filter-Attribute die Autobahn rauszufiltern. Die Filter-Attribute sind eher dazu da, die Meldungen zu filtern und zum Beispiel Dauerbaustellen aus den Meldungen zu entfernen.

    Eine weitere Einsatzmöglichkeit der Filter ist das Entfernen unerwünschte Straßen durch das "filter_exclude" zu entfernen.

    attr VerkehrBW filter_exclude A5 | A8

    So werden die Autobahnen A5 und A8 aus den Meldungen entfernt. Mit Hilfe dieses Attributes lassen sich somit alle unerwünschten Autobahnen, Bundesstraßen oder Kreisstraßen rausfiltern. Einfach ein paar Tage beobachten und nach und nach alle unerwünschten Meldungen in den Filter packen.

    Eine Weitere Möglichkeit ist das Filtern nach Ausfahrten. Sonderzeichen müssen dabei durch ein "" gekennzeichnet werden. Folgender Filter filtert die Ausfahrt 55:

    attr VerkehrBW filter_include (55)

    Wie ihr seht, lässt sich mit den Filter-Attributen eine Menge anstellen. Da muss jeder für sich den auf seinen Bedürfnissen angepassten Filter zusammenstellen.

    orderby

    Mit dem Attribut "orderby" lassen sich die Verkehrsmeldungen z.B anhand der Meldung sortieren.

    attr VerkehrBW orderby 

    Es werden somit erst alle Meldungen aufgelistet, welche den String "stockender Verkehr" in der Meldung haben.

    msg_format

    Mit dem Attribut "msg_format" lässt sich das Format des Readings "xx_msg" anpassen. So lassen sich die bestimmten "Textbausteine" an den Anfang der Meldung stellen.

    attr VerkehrBW msg_format [road | head | both]

    Jenachdem, wie das Attribut gesetzt wurde, wird der entsprechende Textbaustein der Meldung vorangestellt.

    stateFormat

    StateFormat ist jetzt kein Modul-spezifisches Attribut, jedoch lässt sich mit diesem Attribut das Device etwas visuell aufwerten. Wer möchte, kann nämlich alle Meldungen innerhalb des Device-Overviews auflisten. 

    attr VerkehrBW stateFormat {my $tmp=Verkehrsinfo_GetData('VerkehrBW');; $tmp=~s/\n/<br>/g;; $tmp=~s/- -//g;; return $tmp;;}

    Verkehrsmeldungen akustisch ausgeben

    Wer zusätzlich eine akustische Ausgabe der Verkehrsmeldungen möchte, kann dies über ein entsprechendes System machen, welches eine Sprachausgabe unterstützt und in FHEM eingebunden wurde. Entweder über das Modul "Text2Speech" über einen angeschlossenen Lautsprecher oder über ein eingebundenes Tablet über AMAD2. Folgende Anleitung bezieht sich auf die Sprachausgabe über ein Tablet mit dem Befehl: "set Tablet ttsMsg Dies ist eine Sprachausgabe".

    Die folgende Definition des atDevices bewirkt eine akustische Ausgabe der aktuellen Verkehrsmeldungen um 05:30 Uhr über das Tablet. Die Zeit und die Namen der Devices ("VerkehrBW und Tablet") müssen entsprechend anpasst werden. Solltet ihr ein anderes Sprachausgabegerät verwenden, dann auch entsprechend den dazu benötigten Befehl anpassen. 

    define *05:30:00 {
    my $stau_counter = ReadingsVal("VerkehrBW","count","");
    my $stau = "Es liegen " . " " . "$stau_counter" ." Staumeldungen um ". TimeNow() ." vor:";

    my $complete_message;

    ## Anhand Meldungszahl das Reading in der Schleife zusammenbauen

    my $head_pre="e_";
    my $head_suff="_head";
    my $road_pre="e_";
    my $road_suff="_road";
    my $msg_pre="e_";
    my $msg_suff="_msg";
    my $head;my $road;
    my $msg;

    ## Iterationsvariable
    my $i = 1;

    ## weitere Meldungen
    while ($stau_counter >= $i){
    $head="$head_pre"."$i"."$head_suff";
    $road="$road_pre"."$i"."$road_suff";
    $msg="$msg_pre"."$i"."$msg_suff";

    $complete_message="$complete_message"."nn"."Meldung $i: ".ReadingsVal("VerkehrBW",$road,"")." - ".ReadingsVal("VerkehrBW",$head,"").": ".ReadingsVal("VerkehrBW",$msg,"").".";
    $i++;
    }

    fhem("set Tablet ttsMsg $stau $complete_message");
    }

    (C) Kopiert aus dem FHEM-WIKI und entsprechend angepasst und erweitert

    Hinweis: Das atDevice erst als "Rohling" definieren: "define atStaumelder at *05:36:00 a" und die finale Definition über den DEF-Editor einfügen.

    Verkehrsmeldungen als Textnachricht

    Wenn man keine Möglichkeit hat akustische Sprachausgaben zu realisieren oder aufgrund von noch schlafenden Mitbewohnern eher davon absehen möchte, kann sich die Verkehrsmeldungen natürlich auch aufs Handy schicken lassen.

    Auch hier gibt es wieder mehrere Möglichkeiten. Zum einen das Versenden als Push über Pushoveroder die Benutzung von Telegramm. Aufgrund der meist etwas längeren Verkehrsmeldungen, empfehle ich die Verwendung von Telegramm. 

    Um das Senden per Telegramm zu realisieren, reicht es aus, das oben definierte atDevice um den entsprechenden Befehl zu ergänzen.

    ...
    fhem("set Telegram message $stau $complete_message");
    fhem("set Tablet ttsMsg $stau $complete_message");
    }

    Alternativ kann nun natürlich der Befehl für die akustische Meldung entfernt werden.

    Einbindung der Verkehrsmeldung in TabletUI

    Der FHEM-Nutzer "Paul79" hat für das Einbinden in TabletUI ein Widget geschrieben, welches sich die Daten direkt vom FHEM-Modul Verkehrsinfo holen kann. Aktuell (Stand März 2017) befindet sich das Widget noch nicht im TabletUI-Repository.

    Vorbereitung

    Damit das Widget verwendet werden kann, muss deswegen eine JavaSkript-Datei mit dem Namen "widget_verkehrsinfo.js" im Widget-Ordner von TabletUI angelegt werden. Bei einer Standartinstallation befindet sich dieser Ordner hier:

    /opt/fhem/www/tablet/js

    Der FHEM-Nutzer "Paul79" hat die benötigte Datei im FHEM-Forum online gestellt. Die aktuelle Version (Stand 01.03.2017) findet ihr hier:

    https://forum.fhem.de/index.php/topic,55118.msg557656.html#msg557656

    Am besten schaut ihr euch aber noch ein paar weitere Beiträge an, um eventuell eine aktuellere Version zu erhalten. Die heruntergeladene Datei schiebt ihr dann einfach in den oben genannten Ordner auf den Raspberry.

    Definition

    Die Definition erfolgt über data-type="verkehrsinfo". Die Mindestdefinition lautet dabei wie folgt:

    <div data-type="verkehrsinfo" data-device="name in FHEM" ></div>

    Es werden jedoch einige zusätzliche Attribute mitgeliefert, mit denen man die Anzeige etwas anpassen kann.

    <div data-type="verkehrsinfo" 
    data-device="name in FHEM"
    data-max="5" data-color-msg="#CEBCB7"
    data-color-head="#FD6F3F"
    data-shadow="true"
    data-shadow-head="true"
    data-icon="2" ></div>

    Eine Beschreibung der einzelnen Attribute findet ihr im FHEM-Wiki

    Ich hoffe ich konnte euch zwei ansprechende Möglichkeiten aufzeigen, mit denen ihr Verkehrsmeldungen in FHEM einbindet. Wer mehr zu diesem Thema wissen möchte, dem empfehle ich das FHEM-Forum zum Modul Verkehrsinfo und TRAFFIC.

    Verkehrsinfos in meiner FHEM Live-Demo

    Wenn ihr die beiden Devices "Verkehrsinfo" und "Traffic" in einer realen FHEM-Umgebung anschauen wollt, dann empfehle ich euch einen Besuch auf meiner FHEM Live-Demo. Dort findet ihr im Raum "Verkehr" die hier definierten Devices.

    5
    Hinterlasse einen Kommentar

    avatar
    Fotos und Bilder
     
     
     
    sonstiges Dateiformat
     
     
     
    2 Comment threads
    3 Thread replies
    2 Followers
     
    Most reacted comment
    Hottest comment thread
    3 Comment authors
    DanielPeerMax Recent comment authors
      Subscribe  
    neuste älteste beste Bewertung
    Benachrichtige mich zu:
    Max
    Gast
    Max

    Servus Daniel,

    ich habe zwei Fehler gefunden: es muss end_address und updateSchedule heissen!

    Gruß

    Max

    Peer
    Gast
    Peer

    der backslash vor dem n im regex fehlt, somit ersezt das regex alle n in den nachrichten ;P

    das gleiche für das zusammenbauen der message –> \\n

    Peer
    Gast
    Peer

    Moin Daniel!
    Ansonsten, wie immer: Super. Läuft (habe die message für den Telebot verwendet, speech ist kein Thema für mich)
    Lg Peer