diff --git a/fhem/CHANGED b/fhem/CHANGED index 994978855..fd44f14f1 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,9 @@ # 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. + - updated: 77_UWZ: New Release 2.4 + new Attribut's sort_readings_by,htmlsequence + new Readings Warn_X_Creation(_*), WarnUWZLevel, + WarnUWZLevel_Color,WarnUWZLevel_Str - feature: 44_TEK603: added usable level in percent - added: 38_netatmo: exchanged for completely new module - feature: 98_DLNARenderer: Support players which require DIDL-Lite diff --git a/fhem/FHEM/77_UWZ.pm b/fhem/FHEM/77_UWZ.pm index 69a5ccf8e..2638c9322 100644 --- a/fhem/FHEM/77_UWZ.pm +++ b/fhem/FHEM/77_UWZ.pm @@ -60,7 +60,7 @@ use vars qw($readingFnAttributes); use vars qw(%defs); my $MODUL = "UWZ"; -my $version = "1.4.2"; # ungerade Entwicklerversion Bsp.: 1.1, 1.3, 2.5 +my $version = "1.4.5"; # ungerade Entwicklerversion Bsp.: 1.1, 1.3, 2.5 my $countrycode = "DE"; my $plz = "77777"; @@ -273,7 +273,10 @@ sub UWZ_Initialize($) { "maps ". "humanreadable:0,1 ". "htmlattr ". + "htmlsequence:ascending,descending ". "lang ". + "sort_readings_by:severity,start ". + "localiconbase ". $readingFnAttributes; foreach my $d(sort keys %{$modules{UWZ}{defptr}}) { @@ -291,7 +294,7 @@ sub UWZ_Define($$) { my @a = split( "[ \t][ \t]*", $def ); return "Error: Perl moduls ".$missingModul."are missing on this system" if( $missingModul ); - return "Wrong syntax: use define UWZ " if (int(@a) != 5 and ((lc $a[2]) ne "search")); + return "Wrong syntax: use define UWZ [CountryCode] [PLZ] [Interval] " if (int(@a) != 5 and ((lc $a[2]) ne "search")); if ((lc $a[2]) ne "search") { @@ -568,7 +571,7 @@ sub UWZ_Done($) { delete( $hash->{helper}{RUNNING_PID} ); UWZ_Log $hash, 4, "Delete old Readings"; - CommandDeleteReading(undef, "$hash->{NAME} Warn_?_.*"); + #CommandDeleteReading(undef, "$hash->{NAME} Warn_?_.*"); # UnWetterdaten speichern @@ -587,6 +590,11 @@ sub UWZ_Done($) { if (keys %values > 0) { my $newState; + for my $Counter ($values{WarnCount} .. 9) { + CommandDeleteReading(undef, "$hash->{NAME} Warn_${Counter}_.*"); + } + + if (defined $values{WarnCount}) { # Message by CountryCode @@ -596,7 +604,7 @@ sub UWZ_Done($) { } else { $newState = "Error: Could not capture all data. Please check CountryCode and PLZ."; } - + readingsBulkUpdate($hash, "state", $newState); readingsBulkUpdate( $hash, "lastConnection", keys( %values )." values captured in ".$values{durationFetchReadings}." s" ); UWZ_Log $hash, 4, keys( %values )." values captured"; @@ -697,6 +705,15 @@ sub UWZ_Run($) { my $uwz_warncount = scalar(@{ $uwz_warnings->{'results'} }); UWZ_Log $hash, 4, "There are ".$uwz_warncount." warnings active"; + my $sortby = AttrVal( $name, 'sort_readings_by',"" ); + my @sorted; + if ( $sortby ne "severity" ) { + UWZ_Log $hash, 4, "Sorting by dtgStart"; + @sorted = sort { $a->{dtgStart} <=> $b->{dtgStart} } @{ $uwz_warnings->{'results'} }; + } else { + UWZ_Log $hash, 4, "Sorting by severity"; + @sorted = sort { $a->{severity} <=> $b->{severity} } @{ $uwz_warnings->{'results'} }; + } my $message; my $i=0; @@ -753,7 +770,22 @@ sub UWZ_Run($) { "11" => "rot", "12" => "violett" ); - foreach my $single_warning (@{ $uwz_warnings->{'results'} }) { + my @uwzmaxlevel; + #foreach my $single_warning (@{ $uwz_warnings->{'results'} }) { + foreach my $single_warning (@sorted) { + + push @uwzmaxlevel, UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'}); + + UWZ_Log $hash, 4, "Warn_".$i."_EventID: ".$single_warning->{'payload'}{'id'}; + $message .= "Warn_".$i."_EventID|".$single_warning->{'payload'}{'id'}."|"; + + + my $chopcreation = substr($single_warning->{'payload'}{'creation'},0,10); + $chopcreation = $chopcreation; + + UWZ_Log $hash, 4, "Warn_".$i."_Creation: ".$chopcreation; + $message .= "Warn_".$i."_Creation|".$chopcreation."|"; + UWZ_Log $hash, 4, "Warn_".$i."_Type: ".$single_warning->{'type'}; $message .= "Warn_".$i."_Type|".$single_warning->{'type'}."|"; @@ -785,6 +817,14 @@ sub UWZ_Run($) { $message .= "Warn_".$i."_End_Time|".strftime("%H:%M", localtime($single_warning->{'dtgEnd'}))."|"; + UWZ_Log $hash, 4, "Warn_".$i."_Creation_Date: ".strftime("%d.%m.%Y", localtime($chopcreation)); + $message .= "Warn_".$i."_Creation_Date|".strftime("%d.%m.%Y", localtime($chopcreation))."|"; + + UWZ_Log $hash, 4, "Warn_".$i."_Creation_Time: ".strftime("%H:%M", localtime($chopcreation)); + $message .= "Warn_".$i."_Creation_Time|".strftime("%H:%M", localtime($chopcreation))."|"; + + + # Begin Language by AttrVal if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) { UWZ_Log $hash, 4, "Warn_".$i."_Type_Str: ".$typenames_de_str{ $single_warning->{'type'} }; @@ -819,6 +859,12 @@ sub UWZ_Run($) { UWZ_Log $hash, 4, "Warn_".$i."_levelName: ".$single_warning->{'payload'}{'levelName'}; $message .= "Warn_".$i."_levelName|".$single_warning->{'payload'}{'levelName'}."|"; + UWZ_Log $hash, 4, "Warn_".$i."_AltitudeMin: ".$enc->decode($single_warning->{'payload'}{'altMin'}); + $message .= "Warn_".$i."_AltitudeMin|".$converter->convert($single_warning->{'payload'}{'altMin'})."|"; + + UWZ_Log $hash, 4, "Warn_".$i."_AltitudeMax: ".$enc->decode($single_warning->{'payload'}{'altMax'}); + $message .= "Warn_".$i."_AltitudeMax|".$converter->convert($single_warning->{'payload'}{'altMax'})."|"; + my $uclang = "EN"; if (AttrVal( $name, 'lang',undef) ) { $uclang = uc AttrVal( $name, 'lang',''); @@ -836,10 +882,16 @@ sub UWZ_Run($) { UWZ_Log $hash, 4, "Warn_".$i."_ShortText: ".$enc->decode($single_warning->{'payload'}{'translationsShortText'}{$uclang}); $message .= "Warn_".$i."_ShortText|".$converter->convert($single_warning->{'payload'}{'translationsShortText'}{$uclang})."|"; +### + if (AttrVal( $name, 'localiconbase',undef) ) { + UWZ_Log $hash, 4, "Warn_".$i."_IconURL: ".AttrVal( $name, 'localiconbase',undef).$typenames{ $single_warning->{'type'} }."-".$single_warning->{'severity'}.".png"; + $message .= "Warn_".$i."_IconURL|".AttrVal( $name, 'localiconbase',undef).$typenames{ $single_warning->{'type'} }."-".UWZ_GetSeverityColor($hash, UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'} )).".png|"; - UWZ_Log $hash, 4, "Warn_".$i."_IconURL: http://www.unwetterzentrale.de/images/icons/".$typenames{ $single_warning->{'type'} }."-".$single_warning->{'severity'}.".gif"; - $message .= "Warn_".$i."_IconURL|http://www.unwetterzentrale.de/images/icons/".$typenames{ $single_warning->{'type'} }."-".UWZ_GetSeverityColor($hash, UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'} )).".gif|"; - + } else { + UWZ_Log $hash, 4, "Warn_".$i."_IconURL: http://www.unwetterzentrale.de/images/icons/".$typenames{ $single_warning->{'type'} }."-".$single_warning->{'severity'}.".gif"; + $message .= "Warn_".$i."_IconURL|http://www.unwetterzentrale.de/images/icons/".$typenames{ $single_warning->{'type'} }."-".UWZ_GetSeverityColor($hash, UWZ_GetUWZLevel($hash,$single_warning->{'payload'}{'levelName'} )).".gif|"; + } +### ## Hagel start @@ -870,6 +922,40 @@ sub UWZ_Run($) { $i++; } + my $max; + for (@uwzmaxlevel) { + $max = $_ if !$max || $_ > $max + }; + + $message .= "WarnUWZLevel|"; + $message .= $max."|"; + + UWZ_Log $hash, 4, "WarnUWZLevel_Color: ".UWZ_GetSeverityColor($hash, $max); + $message .= "WarnUWZLevel_Color|".UWZ_GetSeverityColor($hash, $max)."|"; + + ## Begin of redundant Reading + if ( $UWZ_humanreadable eq 1 ) { + if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) { + my %uwzlevelname = ( "0" => "Stufe Grün (keine Warnung)", + "1" => "Stufe Dunkelgrün (Wetterhinweise)", + "2" => "Stufe Gelb (Vorwarnung für Unwetterwarnung)", + "3" => "Warnstufe Orange (Unwetterwarnung)", + "4" => "Warnstufe Rot (Unwetterwarnung)", + "5" => "Warnstufe Violett (Unwetterwarnung)"); + UWZ_Log $hash, 4, "WarnUWZLevel_Str: ".$uwzlevelname{ $max }; + $message .= "WarnUWZLevel_Str|".$uwzlevelname{ $max }."|"; + } else { + my %uwzlevelname = ( "0" => "level green (no warnings)", + "1" => "level dark green (weather notice)", + "2" => "level yellow (severe weather watch)", + "3" => "Alert level Orange", + "4" => "Alert level Red", + "5" => "Alert level Violet"); + UWZ_Log $hash, 4, "WarnUWZLevel_Str: ".$uwzlevelname{ $max }; + $message .= "WarnUWZLevel_Str|".$uwzlevelname{ $max }."|"; + } + } + $message .= "durationFetchReadings|"; $message .= sprintf "%.2f", time() - $readingStartTime; @@ -887,6 +973,9 @@ sub UWZAsHtml($;$) { my $ret = ''; my $hash = $defs{$name}; + my $htmlsequence = AttrVal($name, "htmlsequence", "none"); + + my $attr; if (AttrVal($name, "htmlattr", "none") ne "none") { $attr = AttrVal($name, "htmlattr", ""); @@ -899,25 +988,49 @@ sub UWZAsHtml($;$) { $ret .= ''; @@ -950,6 +1063,7 @@ sub UWZAsHtmlLite($;$) { my ($name,$items) = @_; my $ret = ''; my $hash = $defs{$name}; + my $htmlsequence = AttrVal($name, "htmlsequence", "none"); my $attr; if (AttrVal($name, "htmlattr", "none") ne "none") { $attr = AttrVal($name, "htmlattr", ""); @@ -962,24 +1076,39 @@ sub UWZAsHtmlLite($;$) { $ret .= '
'; $ret .= ''; - - for ( my $i=0; $i'; - $ret .= ''; } +### + $ret .= '
'.ReadingsVal($name, "Warn_".$i."_ShortText", "").'

'; - $ret .= ReadingsVal($name, "Warn_".$i."_LongText", "").'

'; - - $ret .= ''; + + if ($htmlsequence eq "descending") { + for ( my $i=ReadingsVal($name, "WarnCount", "")-1; $i>=0; $i--){ - # language by AttrVal - if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) { - $ret .= ''; - } else { - $ret .= ''; + $ret .= ''; + $ret .= ''; + } + } else { +### + for ( my $i=0; $i'; + $ret .= ''; } - # end language by AttrVal - $ret .= '
Start:'.localtime(ReadingsVal($name, "Warn_".$i."_Start", "")).'Ende:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'End:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'
'.ReadingsVal($name, "Warn_".$i."_ShortText", "").'

'; + $ret .= ReadingsVal($name, "Warn_".$i."_LongText", "").'

'; + + $ret .= ''; + + # language by AttrVal + if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) { + $ret .= ''; + } else { + $ret .= ''; + } + # end language by AttrVal + $ret .= '
Start:'.localtime(ReadingsVal($name, "Warn_".$i."_Start", "")).'Ende:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'End:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'
'; + $ret .= '
'.ReadingsVal($name, "Warn_".$i."_ShortText", "").'

'; + $ret .= ReadingsVal($name, "Warn_".$i."_LongText", "").'

'; + + $ret .= ''; + + # language by AttrVal + if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) { + $ret .= ''; + } else { + $ret .= ''; + } + # end language by AttrVal + $ret .= '
Start:'.localtime(ReadingsVal($name, "Warn_".$i."_Start", "")).'Ende:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'End:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'
'; + $ret .= '
'; - $ret .= '
'; $ret .= '
'; $ret .= '
'; $ret .= ''; - for ( my $i=0; $i'; - $ret .= ''; - - } - + } else { + for ( my $i=0; $i'; + $ret .= ''; + } + } $ret .= '
'.ReadingsVal($name, "Warn_".$i."_ShortText", "").'

'; - $ret .= ''; - # language by AttrVal - - if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) { - $ret .= ''; - } else { - $ret .= ''; + if ($htmlsequence eq "descending") { + for ( my $i=ReadingsVal($name, "WarnCount", "")-1; $i>=0; $i--){ + $ret .= ''; + $ret .= ''; } - # end language by AttrVal - $ret .= '
Start:'.localtime(ReadingsVal($name, "Warn_".$i."_Start", "")).'Ende:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'End:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'
'.ReadingsVal($name, "Warn_".$i."_ShortText", "").'

'; + $ret .= ''; + # language by AttrVal + + if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) { + $ret .= ''; + } else { + $ret .= ''; + } + # end language by AttrVal + $ret .= '
Start:'.localtime(ReadingsVal($name, "Warn_".$i."_Start", "")).'Ende:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'End:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'
'; + $ret .= '
'; - $ret .= '
'.ReadingsVal($name, "Warn_".$i."_ShortText", "").'

'; + $ret .= ''; + # language by AttrVal + + if ( $hash->{CountryCode} ~~ [ 'DE', 'AT', 'CH' ] ) { + $ret .= ''; + } else { + $ret .= ''; + } + # end language by AttrVal + $ret .= '
Start:'.localtime(ReadingsVal($name, "Warn_".$i."_Start", "")).'Ende:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'End:'.localtime(ReadingsVal($name, "Warn_".$i."_End", "")).'
'; + $ret .= '
'; $ret .= '
'; @@ -1010,15 +1139,21 @@ sub UWZAsHtmlFP($;$) { my ($name,$items) = @_; my $tablewidth = ReadingsVal($name, "WarnCount", "") * 80; + my $htmlsequence = AttrVal($name, "htmlsequence", "none"); my $ret = ''; $ret .= ''; $ret .= ""; - for ( my $i=0; $i'; - } - + if ($htmlsequence eq "descending") { + for ( my $i=ReadingsVal($name, "WarnCount", "")-1; $i>=0; $i--){ + $ret .= ''; + } + } else { + for ( my $i=0; $i'; + } + } $ret .= ""; $ret .= '
'; @@ -1441,6 +1576,22 @@ sub UWZSearchAreaID($$) { Overwrite requested language for short and long warn text. (de|en|it|fr|es|..).
+
  • sort_readings_by +
    + define how readings will be sortet (start|severity). +
    +
  • +
  • htmlsequence +
    + define warn order of html output (ascending|descending). +
    +
  • +
  • localiconbase +
    + define baseurl to host your own thunderstorm warn pics (filetype is png). +
    +
  • +
    @@ -1454,6 +1605,15 @@ sub UWZSearchAreaID($$) {
  • Warn_0|1|2|3...|9_... - active warnings
  • WarnCount - warnings count
  • +
  • WarnUWZLevel - total warn level
  • +
  • WarnUWZLevel_Color - total warn level color
  • +
  • WarnUWZLevel_Str - total warn level string
  • +
  • Warn_0_AltitudeMin - minimum altitude for warning
  • +
  • Warn_0_AltitudeMax - maximum altitude for warning
  • +
  • Warn_0_EventID - warning EventID
  • +
  • Warn_0_Creation - warning creation
  • +
  • Warn_0_Creation_Date - warning creation datum
  • +
  • Warn_0_Creation_Time - warning creation time
  • Warn_0_Start - begin of warnperiod
  • Warn_0_Start_Date - start date of warnperiod
  • Warn_0_Start_Time - start time of warnperiod
  • @@ -1793,6 +1953,21 @@ sub UWZSearchAreaID($$) { Umschalten der angeforderten Sprache für kurz und lange warn text. (de|en|it|fr|es|..).
    +
  • sort_readings_by +
    + Sortierreihenfolge der Warnmeldungen. (start|severity). +
    +
  • +
  • htmlsequence +
    + Anzeigereihenfolge der html warnungen. (ascending|descending). +
    +
  • +
  • localiconbase +
    + BaseURL angeben um Warn Icons lokal zu hosten. (Dateityp ist png). +
    +

  • @@ -1805,6 +1980,15 @@ sub UWZSearchAreaID($$) {
  • Warn_0|1|2|3...|9_... - aktive Warnmeldungen
  • WarnCount - Anzahl der aktiven Warnmeldungen
  • +
  • WarnUWZLevel - Gesamt Warn Level
  • +
  • WarnUWZLevel_Color - Gesamt Warn Level Farbe
  • +
  • WarnUWZLevel_Str - Gesamt Warn Level Text
  • +
  • Warn_0_AltitudeMin - minimum Höhe für Warnung
  • +
  • Warn_0_AltitudeMax - maximum Höhe für Warnung
  • +
  • Warn_0_EventID - EventID der Warnung
  • +
  • Warn_0_Creation - Warnungs Erzeugung
  • +
  • Warn_0_Creation_Date - Warnungs Erzeugungs Datum
  • +
  • Warn_0_Creation_Time - Warnungs Erzeugungs Zeit
  • Warn_0_Start - Begin der Warnung
  • Warn_0_Start_Date - Startdatum der Warnung
  • Warn_0_Start_Time - Startzeit der Warnung