59_Weather: Improved the language initialization logic by replacing the experimental given/when construct with a more standard if/elsif structure

git-svn-id: https://svn.fhem.de/fhem/trunk@30388 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
CoolTux
2025-10-14 05:58:49 +00:00
parent 1392ffe1f2
commit 92f0f4ea8b
5 changed files with 113 additions and 155 deletions

View File

@@ -1,5 +1,8 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # 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 # 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 - change: 77_UWZ: Refactor language handling,perl-experimental and cleanup
- bugfix: WMBus: support for frame type B with more than one block - bugfix: WMBus: support for frame type B with more than one block
- bugfix: 76_SolarForecast: V 1.59.3, minor fix in bat graphic - bugfix: 76_SolarForecast: V 1.59.3, minor fix in bat graphic

View File

@@ -78,7 +78,6 @@ __END__
The Weather module works with various weather APIs: The Weather module works with various weather APIs:
<ul> <ul>
<li>DarkSky (<a href="https://darksky.net">web site</a>, standard)</li>
<li>OpenWeatherMap (<a href="https://openweathermap.org/">web site)</a></li> <li>OpenWeatherMap (<a href="https://openweathermap.org/">web site)</a></li>
<li>Wunderground (<a href="https://www.wunderground.com/member/api-keys">web site)</a></li> <li>Wunderground (<a href="https://www.wunderground.com/member/api-keys">web site)</a></li>
</ul> </ul>
@@ -96,7 +95,7 @@ __END__
The parameters have the following meanings:<br> The parameters have the following meanings:<br>
<table> <table>
<tr><td><code>API</code></td><td>name of the weather API, e.g. <code>DarkSkyAPI</code></td></tr> <tr><td><code>API</code></td><td>name of the weather API, e.g. <code>OpenWeatherMapAPI</code></td></tr>
<tr><td><code>apioptions</code></td><td>indivual options for the chosen API</td></tr> <tr><td><code>apioptions</code></td><td>indivual options for the chosen API</td></tr>
<tr><td><code>apikey</code></td><td>key for the chosen API</td></tr> <tr><td><code>apikey</code></td><td>key for the chosen API</td></tr>
<tr><td><code>location</code></td><td>location for the weather forecast; <tr><td><code>location</code></td><td>location for the weather forecast;
@@ -108,7 +107,7 @@ __END__
<p></p> <p></p>
A very simple definition is:<br><br> A very simple definition is:<br><br>
<code>define &lt;name&gt; Weather apikey=&lt;DarkSkyAPISecretKey&gt;</code><br><br> <code>define &lt;name&gt; Weather apikey=&lt;OpenWeatherMapAPISecretKey&gt;</code><br><br>
This uses the Dark Sky API with an individual key that you need to This uses the Dark Sky API with an individual key that you need to
retrieve from the Dark Sky web site.<p></p> retrieve from the Dark Sky web site.<p></p>
@@ -122,19 +121,6 @@ __END__
API-specific documentation follows.<p></p> API-specific documentation follows.<p></p>
<h4>Dark Sky</h4><p></p>
<table>
<tr><td>API</td><td><code>DarkSkyAPI</code></td></tr>
<tr><td>apioptions</td><td><code>cachemaxage:&lt;cachemaxage&gt;</code><br>duration
in seconds to retrieve the forecast from the cache instead from the API</td></tr>
<tr><td>location</td><td><code>&lt;latitude,longitude&gt;</code><br>
geographic coordinates in degrees of the location for which the
weather is forecast; if missing, the values of the attributes
of the <code>global</code> device are taken, if these exist.</td></tr>
</table>
<p></p>
<h4>OpenWeatherMap</h4><p></p> <h4>OpenWeatherMap</h4><p></p>
<table> <table>
@@ -324,7 +310,7 @@ __END__
Die Parameter haben die folgende Bedeutung:<br> Die Parameter haben die folgende Bedeutung:<br>
<table> <table>
<tr><td><code>API</code></td><td>Name des Wetter-APIs, z.B. <code>DarkSkyAPI</code></td></tr> <tr><td><code>API</code></td><td>Name des Wetter-APIs, z.B. <code>OpenWeatherMapAPI</code></td></tr>
<tr><td><code>apioptions</code></td><td>Individuelle Optionen f&uuml;r das gew&auml;hlte API</td></tr> <tr><td><code>apioptions</code></td><td>Individuelle Optionen f&uuml;r das gew&auml;hlte API</td></tr>
<tr><td><code>apikey</code></td><td>Schl&uuml;ssel f&uuml;r das gew&auml;hlte API</td></tr> <tr><td><code>apikey</code></td><td>Schl&uuml;ssel f&uuml;r das gew&auml;hlte API</td></tr>
<tr><td><code>location</code></td><td>Ort, f&uuml;r den das Wetter vorhergesagt wird. <tr><td><code>location</code></td><td>Ort, f&uuml;r den das Wetter vorhergesagt wird.
@@ -338,7 +324,7 @@ __END__
Eine ganz einfache Definition ist:<br><br> Eine ganz einfache Definition ist:<br><br>
<code>define &lt;name&gt; Weather apikey=&lt;DarkSkyAPISecretKey&gt;</code><br><br> <code>define &lt;name&gt; Weather apikey=&lt;OpenWeatherMapAPISecretKey&gt;</code><br><br>
Bei dieser Definition wird die API von Dark Sky verwendet mit einem Bei dieser Definition wird die API von Dark Sky verwendet mit einem
individuellen Schl&uuml;ssel, den man sich auf der Webseite von Dark Sky individuellen Schl&uuml;ssel, den man sich auf der Webseite von Dark Sky
@@ -353,20 +339,6 @@ __END__
Es folgt die API-spezifische Dokumentation.<p></p> Es folgt die API-spezifische Dokumentation.<p></p>
<h4>Dark Sky</h4><p></p>
<table>
<tr><td>API</td><td><code>DarkSkyAPI</code></td></tr>
<tr><td>apioptions</td><td><code>cachemaxage:&lt;cachemaxage&gt;</code><br>Zeitdauer in
Sekunden, innerhalb derer die Wettervorhersage nicht neu abgerufen
sondern aus dem Cache zur&uuml;ck geliefert wird.</td></tr>
<tr><td>location</td><td><code>&lt;latitude,longitude&gt;</code><br> Geographische Breite
und L&auml;nge des Ortes in Grad, f&uuml;r den das Wetter vorhergesagt wird.
Bei fehlender Angabe werden die Werte aus den gleichnamigen Attributen
des <code>global</code>-Device genommen, sofern vorhanden.</td></tr>
</table>
<p></p>
<h4>OpenWeatherMap</h4><p></p> <h4>OpenWeatherMap</h4><p></p>
<table> <table>
@@ -539,13 +511,12 @@ __END__
"fhem-mod-device", "fhem-mod-device",
"fhem-core", "fhem-core",
"Weather", "Weather",
"DarkSky",
"OpenWeatherMap", "OpenWeatherMap",
"Underground" "Underground"
], ],
"release_status": "stable", "release_status": "stable",
"license": "GPL_2", "license": "GPL_2",
"version": "v2.2.35", "version": "v2.3.0",
"author": [ "author": [
"Marko Oldenburg <fhemdevelopment@cooltux.net>" "Marko Oldenburg <fhemdevelopment@cooltux.net>"
], ],
@@ -574,4 +545,3 @@ __END__
=end :application/json;q=META.json =end :application/json;q=META.json
=cut =cut

View File

@@ -41,7 +41,8 @@ use FHEM::Meta;
use POSIX; use POSIX;
use HttpUtils; use HttpUtils;
use experimental qw /switch/;
#use experimental qw /switch/;
my $META = {}; my $META = {};
my $ret = FHEM::Meta::getMetadata( __FILE__, $META ); my $ret = FHEM::Meta::getMetadata( __FILE__, $META );
@@ -466,8 +467,7 @@ sub _FillSelfHashWithWeatherResponse {
$self->{cached}->{city} = encode_utf8( $data->{name} ); $self->{cached}->{city} = encode_utf8( $data->{name} );
$self->{cached}->{license}{text} = 'none'; $self->{cached}->{license}{text} = 'none';
given ( $self->{endpoint} ) { if ( $self->{endpoint} eq 'onecall' ) {
when ('onecall') {
## löschen des alten current Datensatzes ## löschen des alten current Datensatzes
delete $self->{cached}->{current}; delete $self->{cached}->{current};
@@ -484,28 +484,24 @@ sub _FillSelfHashWithWeatherResponse {
&& scalar( @{ $data->{hourly} } ) > 0 ) && scalar( @{ $data->{hourly} } ) > 0 )
{ {
$self = $self =
_FillSelfHashWithWeatherResponseForOnecallHourly( $self, _FillSelfHashWithWeatherResponseForOnecallHourly( $self, $data );
$data );
} }
if ( ref( $data->{daily} ) eq "ARRAY" if ( ref( $data->{daily} ) eq "ARRAY"
&& scalar( @{ $data->{daily} } ) > 0 ) && scalar( @{ $data->{daily} } ) > 0 )
{ {
$self = $self =
_FillSelfHashWithWeatherResponseForOnecallDaily( $self, _FillSelfHashWithWeatherResponseForOnecallDaily( $self, $data );
$data );
} }
if ( ref( $data->{alerts} ) eq "ARRAY" if ( ref( $data->{alerts} ) eq "ARRAY"
&& scalar( @{ $data->{alerts} } ) > 0 ) && scalar( @{ $data->{alerts} } ) > 0 )
{ {
$self = $self =
_FillSelfHashWithWeatherResponseForOnecallAlerts( $self, _FillSelfHashWithWeatherResponseForOnecallAlerts( $self, $data );
$data );
} }
} }
elsif ( $self->{endpoint} eq 'weather' ) {
when ('weather') {
## löschen des alten current Datensatzes ## löschen des alten current Datensatzes
delete $self->{cached}->{current}; delete $self->{cached}->{current};
@@ -515,8 +511,7 @@ sub _FillSelfHashWithWeatherResponse {
$self = $self =
_FillSelfHashWithWeatherResponseForWeatherCurrent( $self, $data ); _FillSelfHashWithWeatherResponseForWeatherCurrent( $self, $data );
} }
elsif ( $self->{endpoint} eq 'forecast' ) {
when ('forecast') {
## löschen des alten forecast Datensatzes ## löschen des alten forecast Datensatzes
delete $self->{cached}->{forecast}; delete $self->{cached}->{forecast};
@@ -524,9 +519,7 @@ sub _FillSelfHashWithWeatherResponse {
and scalar( @{ $data->{list} } ) > 0 ) and scalar( @{ $data->{list} } ) > 0 )
{ {
$self = $self =
_FillSelfHashWithWeatherResponseForForecastHourly( $self, _FillSelfHashWithWeatherResponseForForecastHourly( $self, $data );
$data );
}
} }
} }
@@ -1036,7 +1029,7 @@ sub _strftimeWrapper {
], ],
"release_status": "stable", "release_status": "stable",
"license": "GPL_2", "license": "GPL_2",
"version": "v3.2.7", "version": "v3.2.8",
"author": [ "author": [
"Marko Oldenburg <fhemdevelopment@cooltux.net>" "Marko Oldenburg <fhemdevelopment@cooltux.net>"
], ],

View File

@@ -6,7 +6,6 @@ use FHEM::Meta;
use POSIX; use POSIX;
use HttpUtils; use HttpUtils;
use experimental qw /switch/;
use Encode; use Encode;
my $META = {}; my $META = {};

View File

@@ -41,10 +41,7 @@ eval { use Time::HiRes qw /gettimeofday/; 1 }
eval { use Readonly; 1 } eval { use Readonly; 1 }
or $missingModul .= "libreadonly-perl "; or $missingModul .= "libreadonly-perl ";
#use Time::HiRes qw(gettimeofday); #use experimental qw /switch/;
use experimental qw /switch/;
#use Readonly;
use FHEM::Meta; use FHEM::Meta;
@@ -224,48 +221,48 @@ sub _LanguageInitialize {
my $lang = shift; my $lang = shift;
given ($lang) { if ( $lang eq 'de' ) {
when ('de') {
%wdays_txt_i18n = %wdays_txt_de; %wdays_txt_i18n = %wdays_txt_de;
@directions_txt_i18n = @directions_txt_de; @directions_txt_i18n = @directions_txt_de;
%pressure_trend_txt_i18n = %pressure_trend_txt_de; %pressure_trend_txt_i18n = %pressure_trend_txt_de;
%status_items_txt_i18n = %status_items_txt_de; %status_items_txt_i18n = %status_items_txt_de;
} }
elsif ( $lang eq 'nl' ) {
when ('nl') {
%wdays_txt_i18n = %wdays_txt_nl; %wdays_txt_i18n = %wdays_txt_nl;
@directions_txt_i18n = @directions_txt_nl; @directions_txt_i18n = @directions_txt_nl;
%pressure_trend_txt_i18n = %pressure_trend_txt_nl; %pressure_trend_txt_i18n = %pressure_trend_txt_nl;
%status_items_txt_i18n = %status_items_txt_nl; %status_items_txt_i18n = %status_items_txt_nl;
} }
elsif ( $lang eq 'fr' ) {
when ('fr') { }
elsif ( $lang eq 'fr' ) {
%wdays_txt_i18n = %wdays_txt_fr; %wdays_txt_i18n = %wdays_txt_fr;
@directions_txt_i18n = @directions_txt_fr; @directions_txt_i18n = @directions_txt_fr;
%pressure_trend_txt_i18n = %pressure_trend_txt_fr; %pressure_trend_txt_i18n = %pressure_trend_txt_fr;
%status_items_txt_i18n = %status_items_txt_fr; %status_items_txt_i18n = %status_items_txt_fr;
}
when ('pl') { }
elsif ( $lang eq 'pl' ) {
%wdays_txt_i18n = %wdays_txt_pl; %wdays_txt_i18n = %wdays_txt_pl;
@directions_txt_i18n = @directions_txt_pl; @directions_txt_i18n = @directions_txt_pl;
%pressure_trend_txt_i18n = %pressure_trend_txt_pl; %pressure_trend_txt_i18n = %pressure_trend_txt_pl;
%status_items_txt_i18n = %status_items_txt_pl; %status_items_txt_i18n = %status_items_txt_pl;
}
when ('it') { }
elsif ( $lang eq 'it' ) {
%wdays_txt_i18n = %wdays_txt_it; %wdays_txt_i18n = %wdays_txt_it;
@directions_txt_i18n = @directions_txt_it; @directions_txt_i18n = @directions_txt_it;
%pressure_trend_txt_i18n = %pressure_trend_txt_it; %pressure_trend_txt_i18n = %pressure_trend_txt_it;
%status_items_txt_i18n = %status_items_txt_it; %status_items_txt_i18n = %status_items_txt_it;
}
default { }
else {
%wdays_txt_i18n = %wdays_txt_en; %wdays_txt_i18n = %wdays_txt_en;
@directions_txt_i18n = @directions_txt_en; @directions_txt_i18n = @directions_txt_en;
%pressure_trend_txt_i18n = %pressure_trend_txt_en; %pressure_trend_txt_i18n = %pressure_trend_txt_en;
%status_items_txt_i18n = %status_items_txt_en; %status_items_txt_i18n = %status_items_txt_en;
}
} }
return; return;
@@ -862,8 +859,7 @@ sub Attr {
my ( $cmd, $name, $attrName, $AttrVal ) = @_; my ( $cmd, $name, $attrName, $AttrVal ) = @_;
my $hash = $::defs{$name}; my $hash = $::defs{$name};
given ($attrName) { if ( $attrName eq 'forecast' ) {
when ('forecast') {
if ( $cmd eq 'set' ) { if ( $cmd eq 'set' ) {
$hash->{fhem}->{api}->setForecast($AttrVal); $hash->{fhem}->{api}->setForecast($AttrVal);
} }
@@ -874,13 +870,11 @@ sub Attr {
::InternalTimer( gettimeofday() + 0.5, ::InternalTimer( gettimeofday() + 0.5,
\&FHEM::Core::Weather::DeleteForecastreadings, $hash ); \&FHEM::Core::Weather::DeleteForecastreadings, $hash );
} }
elsif ('forecastLimit') {
when ('forecastLimit') {
::InternalTimer( gettimeofday() + 0.5, ::InternalTimer( gettimeofday() + 0.5,
\&FHEM::Core::Weather::DeleteForecastreadings, $hash ); \&FHEM::Core::Weather::DeleteForecastreadings, $hash );
} }
elsif ('alerts') {
when ('alerts') {
if ( $cmd eq 'set' ) { if ( $cmd eq 'set' ) {
$hash->{fhem}->{api}->setAlerts($AttrVal); $hash->{fhem}->{api}->setAlerts($AttrVal);
} }
@@ -891,7 +885,6 @@ sub Attr {
::InternalTimer( gettimeofday() + 0.5, ::InternalTimer( gettimeofday() + 0.5,
\&FHEM::Core::Weather::DeleteAlertsreadings, $hash ); \&FHEM::Core::Weather::DeleteAlertsreadings, $hash );
} }
}
return; return;
} }