diff --git a/fhem/CHANGED b/fhem/CHANGED index 4b2bb1f81..d7ec67514 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - bugfix: 60_allergy: fixed invalid readings names - bugfix: 73_km200: Little Bugfix with the use around Regular Expressions - feature: 91_notify: add readLog attribute - feature: 98_ping: Add attribute for minimum fails before reporting diff --git a/fhem/FHEM/60_allergy.pm b/fhem/FHEM/60_allergy.pm index d94851ab2..50e7555c5 100755 --- a/fhem/FHEM/60_allergy.pm +++ b/fhem/FHEM/60_allergy.pm @@ -3,10 +3,12 @@ # # 60_allergy.pm # -# 2015 Markus Moises < vorname at nachname . de > +# 2016 Markus Moises < vorname at nachname . de > # # This module provides allergy forecast data # +# http://forum.fhem.de/index.php/topic,37194.0.html +# # ############################################################################## # @@ -25,7 +27,7 @@ use XML::Simple; use LWP::UserAgent; use HTTP::Request; - +use utf8; ############################################################################## @@ -133,6 +135,7 @@ sub allergy_GetUpdate($) { my $url="http://www.allergie.hexal.de/pollenflug/xml-interface-neu/pollen_de_7tage.php?plz=".$hash->{helper}{ZIPCODE}; + Log3 ($name, 4, "Getting URL $url"); HttpUtils_NonblockingGet({ @@ -167,7 +170,6 @@ sub allergy_Parse($$$) Log3 $name, 5, "Received XML data ".$data; my $xml = new XML::Simple(); - #my $xmldata = $xml->XMLin($data); my $xmldata = $xml->XMLin($data,forcearray => [qw( pollenbelastungen pollen )],keyattr => {pollen => 'name'}); my @wdays = split(',',AttrVal($hash->{NAME}, "weekdaysFormat", "Sun,Mon,Tue,Wed,Thu,Fri,Sat" )); @@ -175,13 +177,10 @@ sub allergy_Parse($$$) readingsBeginUpdate($hash); # Start update readings - my $city = Encode::encode('UTF-8',$xmldata->{'pollendaten'}->{'ort'}); - readingsBulkUpdate($hash, "city", $city); + my $city = $xmldata->{'pollendaten'}->{'ort'}; + readingsBulkUpdate($hash, "city", allergy_utf8clean($city)); Log3 $name, 4, "Received data for postcode ".$xmldata->{'pollendaten'}->{'plz'}; - my %umlaute = ( '�' => 'Ae', '�' => 'Oe', '�' => 'Ue', '�' => 'ae', '�' => 'oe', '�' => 'ue', '�' => 'ss' ); - my $umlautkeys = join ("|", keys(%umlaute)); - foreach my $day (@{$xmldata->{'pollendaten'}{'pollenbelastungen'}}) { my $daycode = $day->{'tag'}+1; @@ -189,7 +188,6 @@ sub allergy_Parse($$$) my $daymax = 0; my $pollenkey=''; my $pollenvalue=''; - my $pollenname=''; my $pollendata=0; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time+($day->{'tag'}*86400)); @@ -200,11 +198,10 @@ sub allergy_Parse($$$) { while(($pollenkey, $pollenvalue) = each(%$pollenhash)) { - # $pollenname = Encode::encode('UTF-8',$pollenkey); - $pollenkey =~ s/($umlautkeys)/$umlaute{$1}/g; + $pollenkey = allergy_utf8clean($pollenkey); $pollendata = $pollenvalue->{'belastung'}; - if (( AttrVal($hash->{NAME}, "updateEmpty", 0 ) gt 0 or $pollendata gt 0) and ( AttrVal($hash->{NAME}, "updateIgnored", 0 ) gt 0 or ( index(AttrVal($hash->{NAME}, "ignoreList", ""), $pollenname ) == -1 ))) + if (( AttrVal($hash->{NAME}, "updateEmpty", 0 ) gt 0 or $pollendata gt 0) and ( AttrVal($hash->{NAME}, "updateIgnored", 0 ) gt 0 or ( index(AttrVal($hash->{NAME}, "ignoreList", ""), $pollenkey ) == -1 ))) { readingsBulkUpdate($hash, "fc".$daycode."_".$pollenkey, $levels[$pollendata]); $daymax = $pollendata if($pollendata gt $daymax); @@ -237,7 +234,52 @@ sub allergy_Parse($$$) } +sub allergy_utf8clean($) { + my ($string) = @_; + my $log = ""; + if($string !~ m/^[A-Za-z\d_\.-]+$/) + { + $log .= $string."(standard) "; + $string =~ s/Ä/Ae/g; + $string =~ s/Ö/Oe/g; + $string =~ s/Ü/Ue/g; + $string =~ s/ä/ae/g; + $string =~ s/ö/oe/g; + $string =~ s/ü/ue/g; + $string =~ s/ß/ss/g; + } + if($string !~ m/^[A-Za-z\d_\.-]+$/) + { + $log .= $string."(single) "; + $string =~ s/Ä/Ae/g; + $string =~ s/Ö/Oe/g; + $string =~ s/Ãœ/Ue/g; + $string =~ s/ä/ae/g; + $string =~ s/ö/oe/g; + $string =~ s/ü/ue/g; + $string =~ s/ß/ss/g; + } + if($string !~ m/^[A-Za-z\d_\.-]+$/) + { + $log .= $string."(double) "; + $string =~ s/Ä/Ae/g; + $string =~ s/Ö/Oe/g; + $string =~ s/Ãœ/Ue/g; + $string =~ s/ä/ae/g; + $string =~ s/ö/oe/g; + $string =~ s/ü/ue/g; + $string =~ s/ß/ss/g; + } + if($string !~ m/^[A-Za-z\d_\.-]+$/) + { + $log .= $string."(unknown)"; + #$string =~ s/[^!-~\s]//g; + $string =~ s/[^A-Za-z\d_\.-]//g; + } + Log3 "utf8clean", 5, "Cleaned $string // $log" if($log ne ""); + return $string; +} ########################## @@ -248,13 +290,11 @@ sub allergy_Parse($$$)
define <name> allergy <zipcode>
@@ -266,7 +306,6 @@ sub allergy_Parse($$$)
German zipcode
define <name> allergy <Postleitzahl>
+ define allergydata allergy 12345
+ Postleitzahl
+ data
+ city
+ fcn_total
+ fcn_day_of_week
+ fcn_allergen
+ ignoreList
+ updateEmpty (Standard: 0|1)
+
+ 0 = nur Allergene mit Belastung.
+
+ 1 = auch Allergene die keine Belastung haben.
+
+ updateIgnored (1)
+ levelsFormat (Standard: -, low, moderate, high)
+ weekdaysFormat (Standard: Sun, Mon, Tue, Wed, Tue, Fri, Sat)
+