From 37e698d9668097ffca3e061e59c4574476cee46c Mon Sep 17 00:00:00 2001 From: martins Date: Mon, 16 Jan 2017 19:18:49 +0000 Subject: [PATCH] 98_Verkehrsinfo.pm:added support for radiosaw git-svn-id: https://svn.fhem.de/fhem/trunk@13112 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_Verkehrsinfo.pm | 126 +++++++++++++++++++++++++++++++++-- 1 file changed, 122 insertions(+), 4 deletions(-) diff --git a/fhem/FHEM/98_Verkehrsinfo.pm b/fhem/FHEM/98_Verkehrsinfo.pm index cbe164b28..9d0738a4e 100644 --- a/fhem/FHEM/98_Verkehrsinfo.pm +++ b/fhem/FHEM/98_Verkehrsinfo.pm @@ -25,8 +25,12 @@ ############################################################################ # # Changelog: +# 2017-01-16, v2.2 +# Feature: Quelle http://www.radiosaw.de/verkehrsmeldungen added +# # 2016-12-26, v2.1 # Bugfix: update state with readings update +# CHANGE: remove requirement perl-module json # CHANGE: update commandref with link to readingFn-Attributen # # Changelog: @@ -139,7 +143,8 @@ sub Verkehrsinfo_Define($$) { # check if the url is ok if ($hash->{url} !~ /verkehrsinfo\.de\/httpsmobil\/index\.php/ && - $hash->{url} !~ /hessenschau\.de\/verkehr\/index\.html/){ + $hash->{url} !~ /hessenschau\.de\/verkehr\/index\.html/ && + $hash->{url} !~ /radiosaw/){ my $returnmsg = "Diese URL wird nicht unterstützt. Bitte schauen Sie in die Modulbeschreibung."; Log3 $hash->{name}, 1, $returnmsg; return $returnmsg; @@ -158,6 +163,10 @@ sub Verkehrsinfo_Define($$) { elsif ($hash->{url} =~ /hessenschau.de/i) { readingsSingleUpdate( $hash, "zone", "Hessen", 1 ); } + elsif ($hash->{url} =~ /radiosaw/i) { + readingsSingleUpdate( $hash, "zone", "SAW", 1 ); + $hash->{url} = 'http://www.radiosaw.de/verkehrsmeldungen'; + } InternalTimer(gettimeofday()+4, "Verkehrsinfo_GetUpdate", $hash, 0); @@ -244,7 +253,8 @@ sub Verkehrsinfo_Set($@) { if ($opt eq "update"){ Verkehrsinfo_GetUpdate($hash); - return "Update is runing"; + #return "Update is runing"; + return undef; } } @@ -281,6 +291,7 @@ sub Verkehrsinfo_HttpNbUpdateData ($) { my $headline; my @toc; + my @toc2; my $message = ''; my $message_zone = ''; my $message_head = ''; @@ -386,6 +397,107 @@ sub Verkehrsinfo_HttpNbUpdateData ($) { } } + + ################## + # radiosaw.de + ################## + elsif ($hash->{url} =~ /radiosaw.de/i) { + + $message_zone = ' für SAW'; + + # part one meldungen + $tree->parse_content($content); + @toc = $tree->findnodes('//div[contains(@id, "block-system-main")]/div/div[2]/div[2]/div/div/div'); + # part two baustellen + @toc2 = $tree->findnodes('//div[contains(@id, "block-system-main")]/div/div[3]/div[1]/div/div[1]/div/div[2]/div/div/div/ul/li'); + push (@toc, @toc2); + for my $el ( Verkehrsinfo_hf_orderby($orderby, @toc) ) { + if (grep(!/$filterexclude/i, $el->as_trimmed_text) && grep(/$filterinclude/i, $el->as_trimmed_text)){ + + if ($el->as_trimmed_text =~ /^Aktuelle Baustelle/){ + + my $tmp = $el->as_HTML; + $tmp =~ s/
-+
/\|/g; + $tmp =~ s/
/###/g; + + my $subtree = HTML::TreeBuilder->new; + $subtree->parse_content($tmp); + + my @tmp2 = split(/\|/, $subtree->as_trimmed_text); + shift @tmp2; + + for my $sel ( @tmp2 ){ + + $dataarray->{"e_".$i."_road"} = ((split(/\s/, $sel))[0] =~ /^.[0-9]+/) ? (split(/\s/, $sel))[0] : '-'; + $dataarray->{"e_".$i."_head"} = (split(/\###/, $sel))[0]; + + $dataarray->{"e_".$i."_msg"} = $sel; + $dataarray->{"e_".$i."_msg"} =~ s/^.*?###//; + $dataarray->{"e_".$i."_msg"} =~ s/###/ /g; + + $message .= (AttrVal($name,"msg_format","") =~ "road|both") ? $dataarray->{"e_".$i."_road"} .', ' : ''; + $message .= (AttrVal($name,"msg_format","") =~ "head|both") ? $dataarray->{"e_".$i."_head"} .', ' : ''; + $message .= $dataarray->{"e_".$i."_msg"}; + $message .= ($dataarray->{"e_".$i."_msg"} =~ /\.$/) ? ' ' : '. ' ; + + $i++; + } + $i--; + } + elsif ($el->findnodes('../li')->[0]){ + if (exists $el->findnodes('strong')->[0]){ + $dataarray->{"e_".$i."_road"} = ((split(/\s/, $el->findnodes('strong')->[0]->as_trimmed_text .' -'))[1] =~ /^[0-9]+/) ? (split(/\s/, $el->findnodes('strong')->[0]->as_trimmed_text))[0] . ' ' . (split(/\s/, $el->findnodes('strong')->[0]->as_trimmed_text))[1] : '-'; + $dataarray->{"e_".$i."_head"} = $el->findnodes('strong')->[0]->as_trimmed_text; + $dataarray->{"e_".$i."_msg"} = $el->as_trimmed_text; + $dataarray->{"e_".$i."_msg"} =~ s/\(/_ko_/g; + $dataarray->{"e_".$i."_msg"} =~ s/\)/_kc_/g; + my $tmp = $el->findnodes('strong')->[0]->as_trimmed_text; + $tmp =~ s/\(/_ko_/g; + $tmp =~ s/\)/_kc_/g; + $dataarray->{"e_".$i."_msg"} =~ s/$tmp//; + } + else{ + $dataarray->{"e_".$i."_road"} = '-'; + $dataarray->{"e_".$i."_head"} = '-'; + $dataarray->{"e_".$i."_msg"} = $el->as_trimmed_text; + } + $dataarray->{"e_".$i."_msg"} =~ s/_ko_/\(/g; + $dataarray->{"e_".$i."_msg"} =~ s/_kc_/\)/g; + + $message .= (AttrVal($name,"msg_format","") =~ "road|both") ? $dataarray->{"e_".$i."_road"} .', ' : ''; + $message .= (AttrVal($name,"msg_format","") =~ "head|both") ? $dataarray->{"e_".$i."_head"} .', ' : ''; + $message .= $dataarray->{"e_".$i."_msg"}; + $message .= ($dataarray->{"e_".$i."_msg"} =~ /\.$/) ? ' ' : '. ' ; + + $i++; + } + else { + my $tmp = $el->as_HTML; + $tmp =~ s/
/###/g; + + my $subtree = HTML::TreeBuilder->new; + $subtree->parse_content($tmp); + + my $anz = scalar(split(/\###/, $subtree->as_trimmed_text)); + $dataarray->{"e_".$i."_road"} = ((split(/\s/, $subtree->as_trimmed_text))[0] =~ /^.[0-9]+/) ? (split(/\s/, $subtree->as_trimmed_text))[0] : '-'; + $dataarray->{"e_".$i."_head"} = ($anz == 2) ? (split(/\###/, $subtree->as_trimmed_text))[0] : '-'; + $dataarray->{"e_".$i."_msg"} = ($anz == 2) ? (split(/\###/, $subtree->as_trimmed_text))[1] : $subtree->as_trimmed_text; + + $message .= (AttrVal($name,"msg_format","") =~ "road|both") ? $dataarray->{"e_".$i."_road"} .', ' : ''; + $message .= (AttrVal($name,"msg_format","") =~ "head|both") ? $dataarray->{"e_".$i."_head"} .', ' : ''; + $message .= $dataarray->{"e_".$i."_msg"}; + $message .= ($dataarray->{"e_".$i."_msg"} =~ /\.$/) ? ' ' : '. ' ; + + $i++; + } + + # else{ + # Log3 $hash, 3, "Verkehrsinfo: ($name) Verkehrsinfo_HttpNbUpdateData DataNodeElements not found"; + # } + } + } + } + if ($i - 1 == 0){ $message_head = "Es liegen um " . strftime('%H:%M', localtime) . $message_zone . " keine Staumeldungen vor."; @@ -510,6 +622,9 @@ sub Verkehrsinfo_hf_orderby ($@) {

  • Hessenschau.de
  • Here is no configuration necessary, the URL http://hessenschau.de/verkehr/index.html will be used as a parameter. +

    +
  • RadioSAW.de
  • + Here is no configuration necessary, the keyword radiosaw will be used as a parameter.

    @@ -586,7 +701,7 @@ sub Verkehrsinfo_hf_orderby ($@) { Messages will be sorted by relevance by reference to the string.
    The sort supports regular expressions.
    Multiple searching keywords can be seperated with the pipe "|".

    -
  • msg_format [ road | head | both ] (Nur Verkehrsinfo.de)
    +
  • msg_format [ road | head | both ] (only Verkehrsinfo.de and RadioSAW.de)
    Using this parameter you can format the output, regarding streets, direction or both.

  • readingFnAttributes

  • @@ -633,6 +748,9 @@ sub Verkehrsinfo_hf_orderby ($@) {

  • Hessenschau.de
  • Hier ist keine Konfiguration notwendig, man verwendet die URL http://hessenschau.de/verkehr/index.html als Parameter. +

    +
  • RadioSAW.de
  • + Hier ist keine Konfiguration notwendig, man verwendet als Parameter radiosaw.

    @@ -712,7 +830,7 @@ sub Verkehrsinfo_hf_orderby ($@) { Anhand von Zeichefolgen wird eine Sortierung der Meldungen nach Relevanz vorgenommen.
    Die Sortierung unterstützt Regulärer Ausdrücke.
    Mehrer Suchbegriffe können mit einer Pipe "|" getrennt werden.

    -
  • msg_format [ road | head | both ] (Nur Verkehrsinfo.de)
    +
  • msg_format [ road | head | both ] (Nur Verkehrsinfo.de und RadioSAW.de)
    Über diesen Parameter kann die Meldung formatiert werden nach Strasse, Richtung oder beides

  • readingFnAttributes