Compare commits
	
		
			9 Commits
		
	
	
		
			2db8db3b89
			...
			testing
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 437d04b87c | |||
| 82d0e6b1b6 | |||
| e84d810e39 | |||
| dbd7d760aa | |||
| 75f92aece3 | |||
| 14644b8575 | |||
| f37a24673c | |||
| d313cb8d4a | |||
| 2e3210c438 | 
							
								
								
									
										200
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										200
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,4 +1,200 @@
 | 
			
		||||
### ``` Refactor pre-commit hook file list and output formatting (HEAD -> patch-removedarksky)
 | 
			
		||||
### Update version to 2.3.1 and fix conditionals in Weather.pm (HEAD -> patch-mod-weather)
 | 
			
		||||
>Thu, 16 Oct 2025 19:01:00 +0200
 | 
			
		||||
 | 
			
		||||
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
 | 
			
		||||
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
 | 
			
		||||
This commit updates the version number in the FHEM weather module
 | 
			
		||||
from 2.3.0 to 2.3.1 to reflect the latest changes.
 | 
			
		||||
 | 
			
		||||
In addition to the version bump, several conditionals in
 | 
			
		||||
lib/FHEM/Core/Weather.pm have been corrected. Specifically, the
 | 
			
		||||
syntax for checking the command attributes has been fixed to ensure
 | 
			
		||||
proper evaluation of the conditions.
 | 
			
		||||
 | 
			
		||||
These changes improve code clarity and correctness, which helps
 | 
			
		||||
in maintaining the module. There are no breaking changes in this
 | 
			
		||||
commit, and existing functionality remains intact.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Remove DarkSky API support from Weather module (tag: v2.3.0, origin/testing, origin/main, origin/dev, origin/HEAD, testing, main, dev)
 | 
			
		||||
>Tue, 14 Oct 2025 07:35:31 +0200
 | 
			
		||||
 | 
			
		||||
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
 | 
			
		||||
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
 | 
			
		||||
The DarkSky API support has been removed from the Weather module
 | 
			
		||||
documentation, affecting both English and German sections. The API
 | 
			
		||||
documentation now focuses solely on the OpenWeatherMap API.
 | 
			
		||||
 | 
			
		||||
Changes include the deletion of DarkSky references in `59_Weather.pm`
 | 
			
		||||
and updates to example command snippets to refer to the
 | 
			
		||||
OpenWeatherMap API. The version number was incremented from
 | 
			
		||||
v2.2.35 to v2.3.0, and the OpenWeatherMap API version was updated
 | 
			
		||||
from v3.2.7 to v3.2.8.
 | 
			
		||||
 | 
			
		||||
These updates were necessary as DarkSky has been discontinued,
 | 
			
		||||
streamlining the module's functionality. There are no breaking
 | 
			
		||||
changes for current OpenWeatherMap API users.
 | 
			
		||||
 | 
			
		||||
Additionally, the language handling in the Weather API was
 | 
			
		||||
refactored to replace the experimental `given/when` construct
 | 
			
		||||
with standard `if/elsif` statements for better readability
 | 
			
		||||
and maintainability. This change does not introduce any breaking
 | 
			
		||||
changes and enhances code clarity.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Remove DarkSky API support from Weather module
 | 
			
		||||
>Tue, 14 Oct 2025 07:35:18 +0200
 | 
			
		||||
 | 
			
		||||
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
 | 
			
		||||
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
 | 
			
		||||
The DarkSky API support has been removed from the Weather module documentation,
 | 
			
		||||
including its references in both English and German sections. The API
 | 
			
		||||
documentation has been updated to exclusively focus on the
 | 
			
		||||
OpenWeatherMap API.
 | 
			
		||||
 | 
			
		||||
The changes made to `59_Weather.pm` include:
 | 
			
		||||
 | 
			
		||||
- Deleted mentions of the DarkSky API in the documentation.
 | 
			
		||||
- Updated example command snippets to reference the
 | 
			
		||||
  OpenWeatherMap API.
 | 
			
		||||
- Version number has been incremented from v2.2.35 to v2.3.0.
 | 
			
		||||
 | 
			
		||||
In addition, the version number for the OpenWeatherMap API support
 | 
			
		||||
has been updated from v3.2.7 to v3.2.8 in the corresponding API file.
 | 
			
		||||
 | 
			
		||||
These updates were necessary to streamline the module's
 | 
			
		||||
functionality and align it with current API availability, as
 | 
			
		||||
DarkSky has been discontinued. There are no breaking changes
 | 
			
		||||
for existing users of the OpenWeatherMap API.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Refactor language handling in Weather API
 | 
			
		||||
>Tue, 14 Oct 2025 07:04:00 +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 to enhance code readability and
 | 
			
		||||
maintainability. The attribute handling in the `Attr` subroutine
 | 
			
		||||
was simplified for clarity, removing unnecessary usage
 | 
			
		||||
of `given/when`, which helps reduce complexity throughout
 | 
			
		||||
the codebase.
 | 
			
		||||
 | 
			
		||||
Additionally, 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 in Weather API
 | 
			
		||||
>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)
 | 
			
		||||
@@ -38,7 +234,7 @@ function as intended.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### docs: add changelog (origin/patch-changeVersion)
 | 
			
		||||
### docs: add changelog
 | 
			
		||||
>Tue, 4 Feb 2025 21:01:33 +0100
 | 
			
		||||
 | 
			
		||||
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
			
		||||
 
 | 
			
		||||
@@ -78,7 +78,6 @@ __END__
 | 
			
		||||
 | 
			
		||||
  The Weather module works with various weather APIs:
 | 
			
		||||
  <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>Wunderground (<a href="https://www.wunderground.com/member/api-keys">web site)</a></li>
 | 
			
		||||
  </ul>
 | 
			
		||||
@@ -96,7 +95,7 @@ __END__
 | 
			
		||||
       The parameters have the following meanings:<br>
 | 
			
		||||
 | 
			
		||||
       <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>apikey</code></td><td>key for the chosen API</td></tr>
 | 
			
		||||
       <tr><td><code>location</code></td><td>location for the weather forecast;
 | 
			
		||||
@@ -108,7 +107,7 @@ __END__
 | 
			
		||||
       <p></p>
 | 
			
		||||
 | 
			
		||||
    A very simple definition is:<br><br>
 | 
			
		||||
    <code>define <name> Weather apikey=<DarkSkyAPISecretKey></code><br><br>
 | 
			
		||||
    <code>define <name> Weather apikey=<OpenWeatherMapAPISecretKey></code><br><br>
 | 
			
		||||
    This uses the Dark Sky API with an individual key that you need to
 | 
			
		||||
    retrieve from the Dark Sky web site.<p></p>
 | 
			
		||||
 | 
			
		||||
@@ -122,19 +121,6 @@ __END__
 | 
			
		||||
 | 
			
		||||
    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:<cachemaxage></code><br>duration
 | 
			
		||||
          in seconds to retrieve the forecast from the cache instead from the API</td></tr>
 | 
			
		||||
        <tr><td>location</td><td><code><latitude,longitude></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>
 | 
			
		||||
 | 
			
		||||
        <table>
 | 
			
		||||
@@ -324,7 +310,7 @@ __END__
 | 
			
		||||
    Die Parameter haben die folgende Bedeutung:<br>
 | 
			
		||||
 | 
			
		||||
    <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ür das gewählte API</td></tr>
 | 
			
		||||
    <tr><td><code>apikey</code></td><td>Schlüssel für das gewählte API</td></tr>
 | 
			
		||||
    <tr><td><code>location</code></td><td>Ort, für den das Wetter vorhergesagt wird.
 | 
			
		||||
@@ -338,7 +324,7 @@ __END__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    Eine ganz einfache Definition ist:<br><br>
 | 
			
		||||
    <code>define <name> Weather apikey=<DarkSkyAPISecretKey></code><br><br>
 | 
			
		||||
    <code>define <name> Weather apikey=<OpenWeatherMapAPISecretKey></code><br><br>
 | 
			
		||||
 | 
			
		||||
    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.<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:<cachemaxage></code><br>Zeitdauer in
 | 
			
		||||
      Sekunden, innerhalb derer die Wettervorhersage nicht neu abgerufen
 | 
			
		||||
      sondern aus dem Cache zurück geliefert wird.</td></tr>
 | 
			
		||||
    <tr><td>location</td><td><code><latitude,longitude></code><br> 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 <code>global</code>-Device genommen, sofern vorhanden.</td></tr>
 | 
			
		||||
    </table>
 | 
			
		||||
    <p></p>
 | 
			
		||||
 | 
			
		||||
    <h4>OpenWeatherMap</h4><p></p>
 | 
			
		||||
 | 
			
		||||
    <table>
 | 
			
		||||
@@ -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.1",
 | 
			
		||||
  "author": [
 | 
			
		||||
    "Marko Oldenburg <fhemdevelopment@cooltux.net>"
 | 
			
		||||
  ],
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
UPD 2025-02-05_05:56:41 25899 FHEM/59_Weather.pm
 | 
			
		||||
UPD 2025-02-04_21:08:26 34419 lib/FHEM/Core/Weather.pm
 | 
			
		||||
UPD 2025-02-05_06:38:34 33780 lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm
 | 
			
		||||
UPD 2025-02-04_21:08:26 38751 lib/FHEM/APIs/Weather/wundergroundAPI.pm
 | 
			
		||||
UPD 2025-10-16_18:59:55 24515 FHEM/59_Weather.pm
 | 
			
		||||
UPD 2025-10-16_18:59:41 34158 lib/FHEM/Core/Weather.pm
 | 
			
		||||
UPD 2025-10-14_07:39:57 33545 lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm
 | 
			
		||||
UPD 2025-10-14_07:20:30 38721 lib/FHEM/APIs/Weather/wundergroundAPI.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 <fhemdevelopment@cooltux.net>"
 | 
			
		||||
  ],
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ use FHEM::Meta;
 | 
			
		||||
 | 
			
		||||
use POSIX;
 | 
			
		||||
use HttpUtils;
 | 
			
		||||
use experimental qw /switch/;
 | 
			
		||||
use Encode;
 | 
			
		||||
 | 
			
		||||
my $META = {};
 | 
			
		||||
 
 | 
			
		||||
@@ -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,45 @@ 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' ) {
 | 
			
		||||
        %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 ('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 '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 ('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 '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 ('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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
        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;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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;
 | 
			
		||||
@@ -650,13 +644,13 @@ sub Get {
 | 
			
		||||
    my $reading = shift @$aRef // return;
 | 
			
		||||
    my $value;
 | 
			
		||||
 | 
			
		||||
    if ( defined( $hash->{readings}->{$reading} ) ) {
 | 
			
		||||
        $value = $hash->{readings}->{$reading}->{VAL};
 | 
			
		||||
    if ( defined( $hash->{READINGS}->{$reading} ) ) {
 | 
			
		||||
        $value = $hash->{READINGS}->{$reading}->{VAL};
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        my $rt = '';
 | 
			
		||||
        if ( defined( $hash->{readings} ) ) {
 | 
			
		||||
            $rt = join( ":noArg ", sort keys %{ $hash->{readings} } );
 | 
			
		||||
        if ( defined( $hash->{READINGS} ) ) {
 | 
			
		||||
            $rt = join( ":noArg ", sort keys %{ $hash->{READINGS} } );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return "Unknown reading $reading, choose one of " . $rt;
 | 
			
		||||
@@ -862,35 +856,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 ( $cmd eq 'forecastLimit' ) {
 | 
			
		||||
        ::InternalTimer( gettimeofday() + 0.5,
 | 
			
		||||
            \&FHEM::Core::Weather::DeleteForecastreadings, $hash );
 | 
			
		||||
    }
 | 
			
		||||
    elsif ( $cmd eq '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;
 | 
			
		||||
@@ -943,8 +933,8 @@ sub WeatherAsHtmlV {
 | 
			
		||||
    else {
 | 
			
		||||
        $fc = (
 | 
			
		||||
            (
 | 
			
		||||
                defined( $h->{readings}->{fc1_day_of_week} )
 | 
			
		||||
                  && $h->{readings}->{fc1_day_of_week}
 | 
			
		||||
                defined( $h->{READINGS}->{fc1_day_of_week} )
 | 
			
		||||
                  && $h->{READINGS}->{fc1_day_of_week}
 | 
			
		||||
            ) ? 'fc' : 'hfc'
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
@@ -960,8 +950,8 @@ sub WeatherAsHtmlV {
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    for ( my $i = 1 ; $i < $items ; $i++ ) {
 | 
			
		||||
        if ( defined( $h->{readings}->{"${fc}${i}_low_c"} )
 | 
			
		||||
            && $h->{readings}->{"${fc}${i}_low_c"} )
 | 
			
		||||
        if ( defined( $h->{READINGS}->{"${fc}${i}_low_c"} )
 | 
			
		||||
            && $h->{READINGS}->{"${fc}${i}_low_c"} )
 | 
			
		||||
        {
 | 
			
		||||
            $ret .= sprintf(
 | 
			
		||||
'<tr><td class="weatherIcon" width=%d>%s</td><td class="weatherValue"><span class="weatherDay">%s: %s</span><br><span class="weatherMin">min %s°C</span> <span class="weatherMax">max %s°C</span><br>%s</td></tr>',
 | 
			
		||||
@@ -1031,8 +1021,8 @@ sub WeatherAsHtmlH {
 | 
			
		||||
    else {
 | 
			
		||||
        $fc = (
 | 
			
		||||
            (
 | 
			
		||||
                defined( $h->{readings}->{fc1_day_of_week} )
 | 
			
		||||
                  && $h->{readings}->{fc1_day_of_week}
 | 
			
		||||
                defined( $h->{READINGS}->{fc1_day_of_week} )
 | 
			
		||||
                  && $h->{READINGS}->{fc1_day_of_week}
 | 
			
		||||
            ) ? 'fc' : 'hfc'
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
@@ -1066,8 +1056,8 @@ sub WeatherAsHtmlH {
 | 
			
		||||
        ::ReadingsVal( $d, "humidity", "" )
 | 
			
		||||
    );
 | 
			
		||||
    for ( my $i = 1 ; $i < $items ; $i++ ) {
 | 
			
		||||
        if ( defined( $h->{readings}->{"${fc}${i}_low_c"} )
 | 
			
		||||
            && $h->{readings}->{"${fc}${i}_low_c"} )
 | 
			
		||||
        if ( defined( $h->{READINGS}->{"${fc}${i}_low_c"} )
 | 
			
		||||
            && $h->{READINGS}->{"${fc}${i}_low_c"} )
 | 
			
		||||
        {
 | 
			
		||||
            $ret .= sprintf( '<td class="weatherMin">min %s°C</td>',
 | 
			
		||||
                ::ReadingsVal( $d, "${fc}${i}_low_c", " - " ) );
 | 
			
		||||
@@ -1084,8 +1074,8 @@ sub WeatherAsHtmlH {
 | 
			
		||||
    $ret .= sprintf( '<tr><td class="weatherMax">%s</td>',
 | 
			
		||||
        ::ReadingsVal( $d, "wind_condition", "" ) );
 | 
			
		||||
    for ( my $i = 1 ; $i < $items ; $i++ ) {
 | 
			
		||||
        if ( defined( $h->{readings}->{"${fc}${i}_high_c"} )
 | 
			
		||||
            && $h->{readings}->{"${fc}${i}_high_c"} )
 | 
			
		||||
        if ( defined( $h->{READINGS}->{"${fc}${i}_high_c"} )
 | 
			
		||||
            && $h->{READINGS}->{"${fc}${i}_high_c"} )
 | 
			
		||||
        {
 | 
			
		||||
            $ret .= sprintf( '<td class="weatherMax">max %s°C</td>',
 | 
			
		||||
                ::ReadingsVal( $d, "${fc}${i}_high_c", " - " ) );
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user