diff --git a/CHANGELOG.md b/CHANGELOG.md index c6fc315..408cb81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,147 @@ -### feat: remove DarkSky, change versions remove DarkSkyAPI, no longer supported change Copyright years and versions of OWM API (HEAD -> patch-changeVersion) +### Refactor language handling in Weather API (HEAD -> patch-remove-perlexperimental) +>Tue, 14 Oct 2025 07:03:38 +0200 + +>Author: Marko Oldenburg (fhemdevelopment@cooltux.net) + +>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net) + +Improved the language initialization logic by replacing the +experimental `given/when` construct with a more standard +`if/elsif` structure, enhancing code readability and +maintainability. The attribute handling in the `Attr` subroutine +was also refactored for clarity, removing unnecessary usage +of `given/when`, which helps reduce complexity throughout +the codebase. + +In the OpenWeatherMapAPI module, the logic for handling +weather response data was streamlined by removing `given/when` +statements in favor of `if` conditions. This change avoids +potential confusion and enhances the clarity of the code logic. +No breaking changes were introduced; the overall functionality +remains intact. + + + +### Refactor language handling to improve readability +>Tue, 14 Oct 2025 07:01:07 +0200 + +>Author: Marko Oldenburg (fhemdevelopment@cooltux.net) + +>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net) + +Improved the language initialization logic by replacing the +experimental `given/when` construct with a more standard +`if/elsif` structure, enhancing code readability and +maintainability. Additionally, the attribute handling in the +`Attr` subroutine was refactored for clarity, removing +unnecessary usage of `given/when`, which helps reduce +complexity across the codebase. + +Furthermore, in the OpenWeatherMapAPI module, logic for +handling weather response data was streamlined by removing +the `given/when` statements in favor of `if` conditions. +This change eliminates potential confusion and enhances +the clarity of the code logic. No breaking changes were +introduced; the overall functionality remains intact. + + + +### Refactor language initialization and attribute handling +>Tue, 14 Oct 2025 06:53:44 +0200 + +>Author: Marko Oldenburg (fhemdevelopment@cooltux.net) + +>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net) + +Improved the language initialization logic by replacing +the experimental `given/when` construct with a more +standard `if/elsif` structure. This change enhances code +readability and maintainability, making it easier to follow +the flow of language assignments. + +Additionally, refactored attribute handling in the `Attr` +subroutine by streamlining the conditions, removing +unnecessary `given/when` usage, and maintaining clarity +in the logic for setting and deleting forecasts and alerts. +These changes help reduce complexity and improve +consistency throughout the codebase. + + + +### ``` Refactor pre-commit hook by removing DarkSkyAPI references +>Wed, 5 Feb 2025 07:08:45 +0100 + +>Author: Marko Oldenburg (fhemdevelopment@cooltux.net) + +>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net) + +Updated the pre-commit hook to eliminate references to +'lib/FHEM/APIs/Weather/DarkSkyAPI.pm'. This change was made to +simplify the codebase and make it more relevant by focusing on +the other weather API files. + +Additionally, the output formatting of the pre-commit hook +has been improved for better readability, and the order of +the files in the @filenames array has been restructured for +clarity. + +No breaking changes have been introduced; the pre-commit +hook continues to operate as intended. +``` + + + +### ``` Refactor pre-commit hook file list and output formatting +>Wed, 5 Feb 2025 07:07:52 +0100 + +>Author: Marko Oldenburg (fhemdevelopment@cooltux.net) + +>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net) + +Updated the list of files in the pre-commit hook to remove +references to 'lib/FHEM/APIs/Weather/DarkSkyAPI.pm' and adjusted +the output formatting for better readability. The order of the +files in the @filenames array has been restructured for clarity. +These changes were necessary to ensure our code base focuses on +the more relevant weather API files. + +No breaking changes introduced; the pre-commit hook continues to +function as intended. +``` + + + +### docs: add changelog +>Tue, 4 Feb 2025 21:27:10 +0100 + +>Author: Marko Oldenburg (fhemdevelopment@cooltux.net) + +>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net) + + + + +### docs: fix unbalanced p +>Tue, 4 Feb 2025 21:26:52 +0100 + +>Author: Marko Oldenburg (fhemdevelopment@cooltux.net) + +>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net) + + + + +### docs: add changelog +>Tue, 4 Feb 2025 21:01:33 +0100 + +>Author: Marko Oldenburg (fhemdevelopment@cooltux.net) + +>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net) + + + + +### feat: remove DarkSky, change versions remove DarkSkyAPI, no longer supported change Copyright years and versions of OWM API >Tue, 4 Feb 2025 21:01:17 +0100 >Author: Marko Oldenburg (fhemdevelopment@cooltux.net) diff --git a/FHEM/59_Weather.pm b/FHEM/59_Weather.pm index 996aded..3b2a855 100755 --- a/FHEM/59_Weather.pm +++ b/FHEM/59_Weather.pm @@ -74,7 +74,7 @@ __END__
apt-get install
- libjson-perl on Debian and derivatives.+ libjson-perl on Debian and derivatives.
The Weather module works with various weather APIs:langde,
en, pl, fr, it or nl+
A very simple definition is:define <name> Weather apikey=<DarkSkyAPISecretKey>+ retrieve from the Dark Sky web site.
Examples:
@@ -120,9 +120,9 @@ __END__
- API-specific documentation follows.+ API-specific documentation follows.
-+
| API | DarkSkyAPI |
+
-+
| API | OpenWeatherMapAPI |
+
-+
| API | wundergroundAPI |
+
The module provides four additional functionsWeatherAsHtml,
WeatherAsHtmlV, WeatherAsHtmlH and
@@ -303,7 +303,7 @@ __END__
apt-get install
libjson-perl kann es unter Debian und Derivaten installiert
- werden.+ werden.
Das Weather-Modul arbeitet mit verschiedenen Wetter-APIs zusammen:langde,
en, pl, fr, it oder nl+
+ Eine ganz einfache Definition ist:define <name> Weather apikey=<DarkSkyAPISecretKey>+ beschaffen muss.
Beispiele:
@@ -350,9 +351,9 @@ __END__
define Weather API=wundergroundAPI,stationId:IHAUIDELB111 apikey=ed64ccc80f004556a4e3456567800b6324a
- Es folgt die API-spezifische Dokumentation.+ Es folgt die API-spezifische Dokumentation.
-+
| API | DarkSkyAPI |
+
-+
| API | OpenWeatherMapAPI |
+
-+
| API | wundergroundAPI |
+
Das Modul unterstützt zusätzlich vier verschiedene FunktionenWeatherAsHtml, WeatherAsHtmlV,
diff --git a/controls_Weather.txt b/controls_Weather.txt
index 9a4783f..e3d2e88 100644
--- a/controls_Weather.txt
+++ b/controls_Weather.txt
@@ -1,4 +1,4 @@
-UPD 2025-02-04_20:57:25 25848 FHEM/59_Weather.pm
-UPD 2025-02-04_20:58:03 34419 lib/FHEM/Core/Weather.pm
-UPD 2025-02-04_20:58:29 33780 lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm
-UPD 2025-02-04_20:57:50 38751 lib/FHEM/APIs/Weather/wundergroundAPI.pm
+UPD 2025-02-05_05:56:41 25899 FHEM/59_Weather.pm
+UPD 2025-10-14_06:51:10 34175 lib/FHEM/Core/Weather.pm
+UPD 2025-10-14_07:00:04 33545 lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm
+UPD 2025-10-14_07:03:17 38721 lib/FHEM/APIs/Weather/wundergroundAPI.pm
diff --git a/hooks/pre-commit b/hooks/pre-commit
index 733d777..a330cfb 100755
--- a/hooks/pre-commit
+++ b/hooks/pre-commit
@@ -4,33 +4,34 @@ use File::Basename;
use POSIX qw(strftime);
use strict;
-my @filenames = ( 'FHEM/59_Weather.pm',
- 'lib/FHEM/Core/Weather.pm',
- 'lib/FHEM/APIs/Weather/DarkSkyAPI.pm',
- 'lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm',
- 'lib/FHEM/APIs/Weather/wundergroundAPI.pm',
- );
+my @filenames = (
+ 'FHEM/59_Weather.pm',
+ 'lib/FHEM/Core/Weather.pm',
+ 'lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm',
+ 'lib/FHEM/APIs/Weather/wundergroundAPI.pm',
+);
-my $controlsfile = 'controls_Weather.txt';
+my $controlsfile = 'controls_Weather.txt';
-open(FH, ">$controlsfile") || return("Can't open $controlsfile: $!");
+open( FH, ">$controlsfile" ) || return ("Can't open $controlsfile: $!");
-for my $filename (@filenames) {
+for my $filename (@filenames) {
my @statOutput = stat($filename);
-
- if (scalar @statOutput != 13) {
- printf 'error: stat has unexpected return value for ' . $filename . "\n";
+
+ if ( scalar @statOutput != 13 ) {
+ printf 'error: stat has unexpected return value for '
+ . $filename . "\n";
next;
}
- my $mtime = $statOutput[9];
- my $date = POSIX::strftime("%Y-%m-%d", localtime($mtime));
- my $time = POSIX::strftime("%H:%M:%S", localtime($mtime));
- my $filetime = $date."_".$time;
+ my $mtime = $statOutput[9];
+ my $date = POSIX::strftime( "%Y-%m-%d", localtime($mtime) );
+ my $time = POSIX::strftime( "%H:%M:%S", localtime($mtime) );
+ my $filetime = $date . "_" . $time;
my $filesize = $statOutput[7];
- printf FH 'UPD ' . $filetime . ' ' . $filesize . ' ' .$filename . "\n";
+ printf FH 'UPD ' . $filetime . ' ' . $filesize . ' ' . $filename . "\n";
}
close(FH);
diff --git a/lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm b/lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm
index 3b24b79..88e6a39 100644
--- a/lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm
+++ b/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 );
}
}
diff --git a/lib/FHEM/APIs/Weather/wundergroundAPI.pm b/lib/FHEM/APIs/Weather/wundergroundAPI.pm
index f358ed2..1a12bfb 100644
--- a/lib/FHEM/APIs/Weather/wundergroundAPI.pm
+++ b/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/lib/FHEM/Core/Weather.pm b/lib/FHEM/Core/Weather.pm
index 4b786c9..8c09d2b 100644
--- a/lib/FHEM/Core/Weather.pm
+++ b/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;