diff --git a/fhem/CHANGED b/fhem/CHANGED index 3493614ab..3b03c6d5d 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,8 @@ # 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 + - change: 59_Weather: Improved the language initialization logic by replacing + the experimental `given/when` construct with a more + standard `if/elsif` structure. - change: 77_UWZ: Refactor language handling,perl-experimental and cleanup - bugfix: WMBus: support for frame type B with more than one block - bugfix: 76_SolarForecast: V 1.59.3, minor fix in bat graphic diff --git a/fhem/FHEM/59_Weather.pm b/fhem/FHEM/59_Weather.pm index 7ff2530d4..6a1ab4534 100755 --- a/fhem/FHEM/59_Weather.pm +++ b/fhem/FHEM/59_Weather.pm @@ -78,7 +78,6 @@ __END__ The Weather module works with various weather APIs: @@ -96,7 +95,7 @@ __END__ The parameters have the following meanings:
- +
APIname of the weather API, e.g. DarkSkyAPI
APIname of the weather API, e.g. OpenWeatherMapAPI
apioptionsindivual options for the chosen API
apikeykey for the chosen API
locationlocation for the weather forecast; @@ -108,7 +107,7 @@ __END__

A very simple definition is:

- define <name> Weather apikey=<DarkSkyAPISecretKey>

+ define <name> Weather apikey=<OpenWeatherMapAPISecretKey>

This uses the Dark Sky API with an individual key that you need to retrieve from the Dark Sky web site.

@@ -122,19 +121,6 @@ __END__ API-specific documentation follows.

-

Dark Sky

- - - - - -
APIDarkSkyAPI
apioptionscachemaxage:<cachemaxage>
duration - in seconds to retrieve the forecast from the cache instead from the API
location<latitude,longitude>
- geographic coordinates in degrees of the location for which the - weather is forecast; if missing, the values of the attributes - of the global device are taken, if these exist.
-

-

OpenWeatherMap

@@ -324,7 +310,7 @@ __END__ Die Parameter haben die folgende Bedeutung:
- +
APIName des Wetter-APIs, z.B. DarkSkyAPI
APIName des Wetter-APIs, z.B. OpenWeatherMapAPI
apioptionsIndividuelle Optionen für das gewählte API
apikeySchlüssel für das gewählte API
locationOrt, für den das Wetter vorhergesagt wird. @@ -338,7 +324,7 @@ __END__ Eine ganz einfache Definition ist:

- define <name> Weather apikey=<DarkSkyAPISecretKey>

+ define <name> Weather apikey=<OpenWeatherMapAPISecretKey>

Bei dieser Definition wird die API von Dark Sky verwendet mit einem individuellen Schlüssel, den man sich auf der Webseite von Dark Sky @@ -353,20 +339,6 @@ __END__ Es folgt die API-spezifische Dokumentation.

-

Dark Sky

- - - - - -
APIDarkSkyAPI
apioptionscachemaxage:<cachemaxage>
Zeitdauer in - Sekunden, innerhalb derer die Wettervorhersage nicht neu abgerufen - sondern aus dem Cache zurück geliefert wird.
location<latitude,longitude>
Geographische Breite - und Länge des Ortes in Grad, für den das Wetter vorhergesagt wird. - Bei fehlender Angabe werden die Werte aus den gleichnamigen Attributen - des global-Device genommen, sofern vorhanden.
-

-

OpenWeatherMap

@@ -539,13 +511,12 @@ __END__ "fhem-mod-device", "fhem-core", "Weather", - "DarkSky", "OpenWeatherMap", "Underground" ], "release_status": "stable", "license": "GPL_2", - "version": "v2.2.35", + "version": "v2.3.0", "author": [ "Marko Oldenburg " ], @@ -574,4 +545,3 @@ __END__ =end :application/json;q=META.json =cut - diff --git a/fhem/lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm b/fhem/lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm index 0bef32753..33eaf6022 100644 --- a/fhem/lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm +++ b/fhem/lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm @@ -41,7 +41,8 @@ use FHEM::Meta; use POSIX; use HttpUtils; -use experimental qw /switch/; + +#use experimental qw /switch/; my $META = {}; my $ret = FHEM::Meta::getMetadata( __FILE__, $META ); @@ -466,67 +467,59 @@ sub _FillSelfHashWithWeatherResponse { $self->{cached}->{city} = encode_utf8( $data->{name} ); $self->{cached}->{license}{text} = 'none'; - given ( $self->{endpoint} ) { - when ('onecall') { - ## löschen des alten current Datensatzes - delete $self->{cached}->{current}; + if ( $self->{endpoint} eq 'onecall' ) { + ## löschen des alten current Datensatzes + delete $self->{cached}->{current}; - ## löschen des alten forecast Datensatzes - delete $self->{cached}->{forecast}; + ## löschen des alten forecast Datensatzes + delete $self->{cached}->{forecast}; - ## löschen des alten Alerts Datensatzes - delete $self->{cached}->{alerts}; + ## löschen des alten Alerts Datensatzes + delete $self->{cached}->{alerts}; + $self = + _FillSelfHashWithWeatherResponseForOnecallCurrent( $self, $data ); + + if ( ref( $data->{hourly} ) eq "ARRAY" + && scalar( @{ $data->{hourly} } ) > 0 ) + { $self = - _FillSelfHashWithWeatherResponseForOnecallCurrent( $self, $data ); - - if ( ref( $data->{hourly} ) eq "ARRAY" - && scalar( @{ $data->{hourly} } ) > 0 ) - { - $self = - _FillSelfHashWithWeatherResponseForOnecallHourly( $self, - $data ); - } - - if ( ref( $data->{daily} ) eq "ARRAY" - && scalar( @{ $data->{daily} } ) > 0 ) - { - $self = - _FillSelfHashWithWeatherResponseForOnecallDaily( $self, - $data ); - } - - if ( ref( $data->{alerts} ) eq "ARRAY" - && scalar( @{ $data->{alerts} } ) > 0 ) - { - $self = - _FillSelfHashWithWeatherResponseForOnecallAlerts( $self, - $data ); - } + _FillSelfHashWithWeatherResponseForOnecallHourly( $self, $data ); } - when ('weather') { - ## löschen des alten current Datensatzes - delete $self->{cached}->{current}; - - ## löschen des alten Alerts Datensatzes - delete $self->{cached}->{alerts}; - + if ( ref( $data->{daily} ) eq "ARRAY" + && scalar( @{ $data->{daily} } ) > 0 ) + { $self = - _FillSelfHashWithWeatherResponseForWeatherCurrent( $self, $data ); + _FillSelfHashWithWeatherResponseForOnecallDaily( $self, $data ); } - when ('forecast') { - ## löschen des alten forecast Datensatzes - delete $self->{cached}->{forecast}; + if ( ref( $data->{alerts} ) eq "ARRAY" + && scalar( @{ $data->{alerts} } ) > 0 ) + { + $self = + _FillSelfHashWithWeatherResponseForOnecallAlerts( $self, $data ); + } + } + elsif ( $self->{endpoint} eq 'weather' ) { + ## löschen des alten current Datensatzes + delete $self->{cached}->{current}; - if ( ref( $data->{list} ) eq "ARRAY" - and scalar( @{ $data->{list} } ) > 0 ) - { - $self = - _FillSelfHashWithWeatherResponseForForecastHourly( $self, - $data ); - } + ## löschen des alten Alerts Datensatzes + delete $self->{cached}->{alerts}; + + $self = + _FillSelfHashWithWeatherResponseForWeatherCurrent( $self, $data ); + } + elsif ( $self->{endpoint} eq 'forecast' ) { + ## löschen des alten forecast Datensatzes + delete $self->{cached}->{forecast}; + + if ( ref( $data->{list} ) eq "ARRAY" + and scalar( @{ $data->{list} } ) > 0 ) + { + $self = + _FillSelfHashWithWeatherResponseForForecastHourly( $self, $data ); } } @@ -1036,7 +1029,7 @@ sub _strftimeWrapper { ], "release_status": "stable", "license": "GPL_2", - "version": "v3.2.7", + "version": "v3.2.8", "author": [ "Marko Oldenburg " ], diff --git a/fhem/lib/FHEM/APIs/Weather/wundergroundAPI.pm b/fhem/lib/FHEM/APIs/Weather/wundergroundAPI.pm index f358ed25b..1a12bfbc7 100644 --- a/fhem/lib/FHEM/APIs/Weather/wundergroundAPI.pm +++ b/fhem/lib/FHEM/APIs/Weather/wundergroundAPI.pm @@ -6,7 +6,6 @@ use FHEM::Meta; use POSIX; use HttpUtils; -use experimental qw /switch/; use Encode; my $META = {}; diff --git a/fhem/lib/FHEM/Core/Weather.pm b/fhem/lib/FHEM/Core/Weather.pm index 4b786c909..8c09d2b5d 100644 --- a/fhem/lib/FHEM/Core/Weather.pm +++ b/fhem/lib/FHEM/Core/Weather.pm @@ -41,10 +41,7 @@ eval { use Time::HiRes qw /gettimeofday/; 1 } eval { use Readonly; 1 } or $missingModul .= "libreadonly-perl "; -#use Time::HiRes qw(gettimeofday); -use experimental qw /switch/; - -#use Readonly; +#use experimental qw /switch/; use FHEM::Meta; @@ -224,48 +221,48 @@ sub _LanguageInitialize { my $lang = shift; - given ($lang) { - when ('de') { - %wdays_txt_i18n = %wdays_txt_de; - @directions_txt_i18n = @directions_txt_de; - %pressure_trend_txt_i18n = %pressure_trend_txt_de; - %status_items_txt_i18n = %status_items_txt_de; - } + if ( $lang eq 'de' ) { + %wdays_txt_i18n = %wdays_txt_de; + @directions_txt_i18n = @directions_txt_de; + %pressure_trend_txt_i18n = %pressure_trend_txt_de; + %status_items_txt_i18n = %status_items_txt_de; + } + elsif ( $lang eq 'nl' ) { + %wdays_txt_i18n = %wdays_txt_nl; + @directions_txt_i18n = @directions_txt_nl; + %pressure_trend_txt_i18n = %pressure_trend_txt_nl; + %status_items_txt_i18n = %status_items_txt_nl; + } + elsif ( $lang eq 'fr' ) { - when ('nl') { - %wdays_txt_i18n = %wdays_txt_nl; - @directions_txt_i18n = @directions_txt_nl; - %pressure_trend_txt_i18n = %pressure_trend_txt_nl; - %status_items_txt_i18n = %status_items_txt_nl; - } + } + elsif ( $lang eq 'fr' ) { + %wdays_txt_i18n = %wdays_txt_fr; + @directions_txt_i18n = @directions_txt_fr; + %pressure_trend_txt_i18n = %pressure_trend_txt_fr; + %status_items_txt_i18n = %status_items_txt_fr; - when ('fr') { - %wdays_txt_i18n = %wdays_txt_fr; - @directions_txt_i18n = @directions_txt_fr; - %pressure_trend_txt_i18n = %pressure_trend_txt_fr; - %status_items_txt_i18n = %status_items_txt_fr; - } + } + elsif ( $lang eq 'pl' ) { + %wdays_txt_i18n = %wdays_txt_pl; + @directions_txt_i18n = @directions_txt_pl; + %pressure_trend_txt_i18n = %pressure_trend_txt_pl; + %status_items_txt_i18n = %status_items_txt_pl; - when ('pl') { - %wdays_txt_i18n = %wdays_txt_pl; - @directions_txt_i18n = @directions_txt_pl; - %pressure_trend_txt_i18n = %pressure_trend_txt_pl; - %status_items_txt_i18n = %status_items_txt_pl; - } + } + elsif ( $lang eq 'it' ) { + %wdays_txt_i18n = %wdays_txt_it; + @directions_txt_i18n = @directions_txt_it; + %pressure_trend_txt_i18n = %pressure_trend_txt_it; + %status_items_txt_i18n = %status_items_txt_it; - when ('it') { - %wdays_txt_i18n = %wdays_txt_it; - @directions_txt_i18n = @directions_txt_it; - %pressure_trend_txt_i18n = %pressure_trend_txt_it; - %status_items_txt_i18n = %status_items_txt_it; - } + } + else { + %wdays_txt_i18n = %wdays_txt_en; + @directions_txt_i18n = @directions_txt_en; + %pressure_trend_txt_i18n = %pressure_trend_txt_en; + %status_items_txt_i18n = %status_items_txt_en; - default { - %wdays_txt_i18n = %wdays_txt_en; - @directions_txt_i18n = @directions_txt_en; - %pressure_trend_txt_i18n = %pressure_trend_txt_en; - %status_items_txt_i18n = %status_items_txt_en; - } } return; @@ -862,35 +859,31 @@ sub Attr { my ( $cmd, $name, $attrName, $AttrVal ) = @_; my $hash = $::defs{$name}; - given ($attrName) { - when ('forecast') { - if ( $cmd eq 'set' ) { - $hash->{fhem}->{api}->setForecast($AttrVal); - } - elsif ( $cmd eq 'del' ) { - $hash->{fhem}->{api}->setForecast(); - } - - ::InternalTimer( gettimeofday() + 0.5, - \&FHEM::Core::Weather::DeleteForecastreadings, $hash ); + if ( $attrName eq 'forecast' ) { + if ( $cmd eq 'set' ) { + $hash->{fhem}->{api}->setForecast($AttrVal); + } + elsif ( $cmd eq 'del' ) { + $hash->{fhem}->{api}->setForecast(); } - when ('forecastLimit') { - ::InternalTimer( gettimeofday() + 0.5, - \&FHEM::Core::Weather::DeleteForecastreadings, $hash ); + ::InternalTimer( gettimeofday() + 0.5, + \&FHEM::Core::Weather::DeleteForecastreadings, $hash ); + } + elsif ('forecastLimit') { + ::InternalTimer( gettimeofday() + 0.5, + \&FHEM::Core::Weather::DeleteForecastreadings, $hash ); + } + elsif ('alerts') { + if ( $cmd eq 'set' ) { + $hash->{fhem}->{api}->setAlerts($AttrVal); + } + elsif ( $cmd eq 'del' ) { + $hash->{fhem}->{api}->setAlerts(); } - when ('alerts') { - if ( $cmd eq 'set' ) { - $hash->{fhem}->{api}->setAlerts($AttrVal); - } - elsif ( $cmd eq 'del' ) { - $hash->{fhem}->{api}->setAlerts(); - } - - ::InternalTimer( gettimeofday() + 0.5, - \&FHEM::Core::Weather::DeleteAlertsreadings, $hash ); - } + ::InternalTimer( gettimeofday() + 0.5, + \&FHEM::Core::Weather::DeleteAlertsreadings, $hash ); } return;