56 Commits

Author SHA1 Message Date
dbd7d760aa Remove DarkSky API support from Weather module
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.
2025-10-14 07:35:31 +02:00
75f92aece3 Remove DarkSky API support from Weather module
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.
2025-10-14 07:35:18 +02:00
14644b8575 Refactor language handling in Weather API
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.
2025-10-14 07:04:00 +02:00
f37a24673c Refactor language handling in Weather API
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.
2025-10-14 07:03:38 +02:00
d313cb8d4a Refactor language handling to improve readability
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.
2025-10-14 07:01:07 +02:00
2e3210c438 Refactor language initialization and attribute handling
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.
2025-10-14 06:53:44 +02:00
2db8db3b89 Merge pull request 'dev' (#75) from dev into main
Reviewed-on: #75
2025-02-05 06:15:30 +00:00
af36bed895 Merge pull request 'patch-removedarksky' (#74) from patch-removedarksky into dev
Reviewed-on: #74
2025-02-05 06:11:46 +00:00
ba898624c5 ```
Refactor pre-commit hook by removing DarkSkyAPI references

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.
```
2025-02-05 07:08:45 +01:00
12595b3674 ```
Refactor pre-commit hook file list and output formatting

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.
```
2025-02-05 07:07:52 +01:00
f7234b10f8 Merge pull request 'dev' (#73) from dev into main
Reviewed-on: #73
2025-02-04 20:30:22 +00:00
be3fb7bbfc Merge pull request 'patch-Unbalanced_p' (#72) from patch-Unbalanced_p into dev
Reviewed-on: #72
2025-02-04 20:29:19 +00:00
23bbc9f9b0 docs: add changelog 2025-02-04 21:27:10 +01:00
e60509fbfd docs: fix unbalanced p 2025-02-04 21:26:52 +01:00
aafeea4d5f Merge pull request 'testing' (#71) from testing into main
Reviewed-on: #71
2025-02-04 20:08:10 +00:00
c6b6a12e47 Merge pull request 'dev' (#70) from dev into testing
Reviewed-on: #70
2025-02-04 20:03:28 +00:00
b57f538bc3 Merge pull request 'patch-changeVersion' (#69) from patch-changeVersion into dev
Reviewed-on: #69
2025-02-04 20:02:15 +00:00
464ba0bec3 docs: add changelog 2025-02-04 21:01:33 +01:00
2b96be4e6e feat: remove DarkSky, change versions
remove DarkSkyAPI, no longer supported
change Copyright years and versions of OWM API

[Ticket: no]
2025-02-04 21:01:17 +01:00
d07297bcd8 Merge pull request 'patch-stefanru' (#68) from patch-stefanru into dev
Reviewed-on: #68
2025-02-04 19:54:21 +00:00
af786290bc docs: changelog
[Ticket: no]
2025-02-04 20:53:14 +01:00
478c4a3159 fix: apply patch from stefanru
https://forum.fhem.de/index.php?msg=1332884

[Ticket: no]
2025-02-04 20:52:52 +01:00
6a38b446a9 Merge pull request 'testing' (#67) from testing into main
Reviewed-on: #67
2024-10-11 17:43:20 +00:00
00c0a2a87e Merge pull request 'dev' (#66) from dev into testing
Reviewed-on: #66
2024-10-11 10:14:14 +00:00
0a47226436 Merge pull request 'patch-fixforecast' (#65) from patch-fixforecast into dev
Reviewed-on: #65
2024-10-11 10:05:05 +00:00
e9fb9357a9 docs: new CHANGELOG 2024-10-11 12:04:37 +02:00
ce875a8beb docs: change versions and add copyright 2024-10-11 12:04:07 +02:00
d0157fb2c7 Merge pull request 'docs: Changelog' (#64) from patch-fixforecast into dev
Reviewed-on: #64
2024-10-11 05:08:47 +00:00
eb134a19e9 docs: Changelog
[Ticket: no]
2024-10-11 07:07:57 +02:00
cfd255569f Merge pull request 'patch-fixforecast' (#63) from patch-fixforecast into dev
Reviewed-on: #63
2024-10-11 05:04:17 +00:00
b1de4b52da fix: Update forecast with cachemaxage after API calls are down.
special thanks to stefanru (forum)

[Ticket: no]
2024-10-11 06:59:53 +02:00
6b6c066a9b Merge pull request 'testing' (#62) from testing into main
Reviewed-on: #62
2023-10-21 09:07:57 +02:00
530fc01d57 Merge pull request 'dev' (#61) from dev into testing
Reviewed-on: #61
2023-10-21 09:07:21 +02:00
7d7cbef4ed Merge pull request 'patch-createDecimal' (#60) from patch-createDecimal into dev
Reviewed-on: #60
2023-10-21 09:00:46 +02:00
8b9bbd4f98 test: add new CHANGELOG 2023-10-21 08:59:11 +02:00
2a06821252 feat: new reading owmAPICode for original code
[Ticket: no]
2023-07-11 14:10:13 +02:00
9868f74a86 Merge pull request 'testing' (#59) from testing into main
Reviewed-on: #59
2023-06-06 08:44:06 +02:00
d2e93a6d5a Merge pull request 'dev' (#58) from dev into testing
Reviewed-on: #58
2023-06-06 08:43:34 +02:00
c27d51534c Merge pull request 'closes #56 patch-newsummaryfield' (#57) from patch-newsummaryfield into dev
Reviewed-on: #57
2023-06-06 08:37:44 +02:00
5bfd1c49d9 feat: add human-readable text of daily forecast
add the proper human-readable text description of the daily forecast

[Ticket: no]
2023-06-06 08:35:06 +02:00
0f1af75a9e Merge pull request 'testing' (#55) from testing into main
Reviewed-on: #55
2023-06-02 05:01:51 +02:00
70a402f096 Merge pull request 'dev' (#54) from dev into testing
Reviewed-on: #54
2023-06-02 05:01:27 +02:00
245fc455e1 Merge pull request 'patch-wunderground' (#53) from patch-wunderground into dev
Reviewed-on: #53
2023-06-02 05:00:55 +02:00
1683fab2d4 add temperatur reading and fix weblink 2023-05-23 08:08:42 +02:00
33763032c6 Merge pull request 'testing' (#52) from testing into main
Reviewed-on: #52
2023-02-05 09:48:33 +01:00
2afb98f9b9 Merge pull request 'dev' (#51) from dev into testing
Reviewed-on: #51
2023-02-05 09:46:46 +01:00
38091aacd1 Merge pull request 'fix: missing perl modules' (#50) from patch-removePrivatFnDeklaration into dev
Reviewed-on: #50
2023-02-05 09:27:02 +01:00
30dd03cbea fix: missing perl modules 2023-02-05 09:26:04 +01:00
43e3fcb237 Merge pull request 'patch-removePrivatFnDeklaration' (#49) from patch-removePrivatFnDeklaration into dev
Reviewed-on: #49
2023-02-05 09:21:27 +01:00
5f611555e3 fix: failed then Readonly is missing 2023-02-05 09:20:20 +01:00
a3fa194cdd Merge pull request 'dev' (#48) from dev into main
Reviewed-on: #48
2023-02-02 23:01:37 +01:00
baa48a79a4 fixes: #46 Merge pull request 'fixes: #46 patch-UndefinedSubroutine' (#47) from patch-UndefinedSubroutine into dev
Reviewed-on: #47
2023-02-02 23:00:17 +01:00
2601a42643 fix: : Undefined subroutine
&FHEM::Core::Weather::DeleteForecastreadings

[Ticket: #46]
2023-02-02 22:58:40 +01:00
cfd8ff9ea1 Merge pull request 'testing' (#45) from testing into main
Reviewed-on: #45
2023-01-29 16:14:03 +01:00
be3352e462 Merge pull request 'dev' (#44) from dev into testing
Reviewed-on: #44
2023-01-10 21:56:18 +01:00
fb5087803b Merge pull request 'patch-package' (#43) from patch-package into dev
Reviewed-on: #43
2023-01-10 21:46:48 +01:00
9 changed files with 679 additions and 1183 deletions

View File

@@ -1,4 +1,362 @@
### build: v2.2.22 (HEAD -> patch-package) ### Remove DarkSky API support from Weather module (HEAD -> patch-newversion)
>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 (origin/testing, origin/main, origin/dev, origin/HEAD, testing, main, dev)
>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)
>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)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
[Ticket: no]
### docs: changelog
>Tue, 4 Feb 2025 20:53:14 +0100
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
[Ticket: no]
### fix: apply patch from stefanru https://forum.fhem.de/index.php?msg=1332884
>Tue, 4 Feb 2025 20:52:52 +0100
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
[Ticket: no]
### docs: new CHANGELOG
>Fri, 11 Oct 2024 12:04:37 +0200
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
### docs: change versions and add copyright
>Fri, 11 Oct 2024 12:04:07 +0200
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
### docs: Changelog
>Fri, 11 Oct 2024 07:07:57 +0200
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
[Ticket: no]
### fix: Update forecast with cachemaxage after API calls are down. special thanks to stefanru (forum)
>Fri, 11 Oct 2024 06:59:53 +0200
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
[Ticket: no]
### test: add new CHANGELOG
>Sat, 21 Oct 2023 08:59:11 +0200
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
### feat: new reading owmAPICode for original code
>Tue, 11 Jul 2023 14:10:13 +0200
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
[Ticket: no]
### feat: add human-readable text of daily forecast
>Tue, 6 Jun 2023 08:35:06 +0200
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
add the proper human-readable text description of the daily forecast
[Ticket: no]
### add temperatur reading and fix weblink
>Tue, 23 May 2023 08:08:42 +0200
>Author: Marko Oldenburg (oldenburg@b1-systems.de)
>Commiter: Marko Oldenburg (oldenburg@b1-systems.de)
### fix: missing perl modules
>Sun, 5 Feb 2023 09:26:04 +0100
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
### fix: failed then Readonly is missing
>Sun, 5 Feb 2023 09:20:20 +0100
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
### fix: : Undefined subroutine
>Thu, 2 Feb 2023 22:58:40 +0100
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
&FHEM::Core::Weather::DeleteForecastreadings
[Ticket: #46]
### docs: add new entry in CHANGELOG.md (tag: v2.2.22)
>Tue, 10 Jan 2023 21:44:20 +0100
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
### build: v2.2.22
>Tue, 10 Jan 2023 21:43:26 +0100 >Tue, 10 Jan 2023 21:43:26 +0100
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net) >Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
@@ -8,7 +366,7 @@
### docs: add new modul path in to pre-commit (origin/patch-package) ### docs: add new modul path in to pre-commit
>Tue, 10 Jan 2023 21:37:10 +0100 >Tue, 10 Jan 2023 21:37:10 +0100
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net) >Author: Marko Oldenburg (fhemdevelopment@cooltux.net)

File diff suppressed because one or more lines are too long

View File

@@ -2,12 +2,13 @@
############################################################################## ##############################################################################
# #
# 59_Weather.pm # 59_Weather.pm
# (c) 2009-2023 Copyright by Dr. Boris Neubert # (c) 2009-2025 Copyright by Dr. Boris Neubert
# e-mail: omega at online dot de # e-mail: omega at online dot de
# #
# Contributors: # Contributors:
# - Marko Oldenburg (CoolTux) # - Marko Oldenburg (CoolTux)
# - Lippie # - Lippie
# - stefanru (wundergroundAPI)
# #
# #
# This file is part of fhem. # This file is part of fhem.
@@ -73,11 +74,10 @@ __END__
<h3>Weather</h3> <h3>Weather</h3>
<ul> <ul>
Note: you need the JSON perl module. Use <code>apt-get install Note: you need the JSON perl module. Use <code>apt-get install
libjson-perl</code> on Debian and derivatives.<p><p> libjson-perl</code> on Debian and derivatives.<p></p>
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>
@@ -95,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;
@@ -104,12 +104,12 @@ __END__
<tr><td><code>lang</code></td><td>language of the forecast: <code>de</code>, <tr><td><code>lang</code></td><td>language of the forecast: <code>de</code>,
<code>en</code>, <code>pl</code>, <code>fr</code>, <code>it</code> or <code>nl</code></td></tr> <code>en</code>, <code>pl</code>, <code>fr</code>, <code>it</code> or <code>nl</code></td></tr>
</table> </table>
<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>
Examples: Examples:
<pre> <pre>
@@ -119,22 +119,9 @@ __END__
</pre> </pre>
API-specific documentation follows.<p> API-specific documentation follows.<p></p>
<h4>Dark Sky</h4><p> <h4>OpenWeatherMap</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>
<table> <table>
<tr><td>API</td><td><code>OpenWeatherMapAPI</code></td></tr> <tr><td>API</td><td><code>OpenWeatherMapAPI</code></td></tr>
@@ -150,9 +137,9 @@ __END__
weather is forecast; if missing, the values of the attributes weather is forecast; if missing, the values of the attributes
of the <code>global</code> device are taken, if these exist.</td></tr> of the <code>global</code> device are taken, if these exist.</td></tr>
</table> </table>
<p><p> <p></p>
<h4>Wunderground</h4><p> <h4>Wunderground</h4><p></p>
<table> <table>
<tr><td>API</td><td><code>wundergroundAPI</code></td></tr> <tr><td>API</td><td><code>wundergroundAPI</code></td></tr>
@@ -164,7 +151,7 @@ __END__
weather is forecast; if missing, the values of the attributes weather is forecast; if missing, the values of the attributes
of the <code>global</code> device are taken, if these exist.</td></tr> of the <code>global</code> device are taken, if these exist.</td></tr>
</table> </table>
<p><p> <p></p>
The module provides four additional functions <code>WeatherAsHtml</code>, The module provides four additional functions <code>WeatherAsHtml</code>,
<code>WeatherAsHtmlV</code>, <code>WeatherAsHtmlH</code> and <code>WeatherAsHtmlV</code>, <code>WeatherAsHtmlH</code> and
@@ -302,7 +289,7 @@ __END__
<ul> <ul>
Hinweis: es wird das Perl-Modul JSON ben&ouml;tigt. Mit <code>apt-get install Hinweis: es wird das Perl-Modul JSON ben&ouml;tigt. Mit <code>apt-get install
libjson-perl</code> kann es unter Debian und Derivaten installiert libjson-perl</code> kann es unter Debian und Derivaten installiert
werden.<p><p> werden.<p></p>
Das Weather-Modul arbeitet mit verschiedenen Wetter-APIs zusammen: Das Weather-Modul arbeitet mit verschiedenen Wetter-APIs zusammen:
<ul> <ul>
@@ -323,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.
@@ -333,14 +320,15 @@ __END__
<tr><td><code>lang</code></td><td>Sprache der Wettervorhersage: <code>de</code>, <tr><td><code>lang</code></td><td>Sprache der Wettervorhersage: <code>de</code>,
<code>en</code>, <code>pl</code>, <code>fr</code>, <code>it</code> oder <code>nl</code></td></tr> <code>en</code>, <code>pl</code>, <code>fr</code>, <code>it</code> oder <code>nl</code></td></tr>
</table> </table>
<p> <p></p>
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
beschaffen muss.<p><p> beschaffen muss.<p></p>
Beispiele: Beispiele:
<pre> <pre>
@@ -349,23 +337,9 @@ __END__
define <name> Weather API=wundergroundAPI,stationId:IHAUIDELB111 apikey=ed64ccc80f004556a4e3456567800b6324a define <name> Weather API=wundergroundAPI,stationId:IHAUIDELB111 apikey=ed64ccc80f004556a4e3456567800b6324a
</pre> </pre>
Es folgt die API-spezifische Dokumentation.<p> Es folgt die API-spezifische Dokumentation.<p></p>
<h4>Dark Sky</h4><p> <h4>OpenWeatherMap</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>
<table> <table>
<tr><td>API</td><td><code>OpenWeatherMapAPI</code></td></tr> <tr><td>API</td><td><code>OpenWeatherMapAPI</code></td></tr>
@@ -384,9 +358,9 @@ __END__
Bei fehlender Angabe werden die Werte aus den gleichnamigen Attributen Bei fehlender Angabe werden die Werte aus den gleichnamigen Attributen
des <code>global</code>-Device genommen, sofern vorhanden.</td></tr> des <code>global</code>-Device genommen, sofern vorhanden.</td></tr>
</table> </table>
<p><p> <p></p>
<h4>Wunderground</h4><p> <h4>Wunderground</h4><p></p>
<table> <table>
<tr><td>API</td><td><code>wundergroundAPI</code></td></tr> <tr><td>API</td><td><code>wundergroundAPI</code></td></tr>
@@ -399,7 +373,7 @@ __END__
Bei fehlender Angabe werden die Werte aus den gleichnamigen Attributen Bei fehlender Angabe werden die Werte aus den gleichnamigen Attributen
des <code>global</code>-Device genommen, sofern vorhanden.</td></tr> des <code>global</code>-Device genommen, sofern vorhanden.</td></tr>
</table> </table>
<p><p> <p></p>
Das Modul unterst&uuml;tzt zus&auml;tzlich vier verschiedene Funktionen Das Modul unterst&uuml;tzt zus&auml;tzlich vier verschiedene Funktionen
<code>WeatherAsHtml</code>, <code>WeatherAsHtmlV</code>, <code>WeatherAsHtml</code>, <code>WeatherAsHtmlV</code>,
@@ -537,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.22", "version": "v2.3.0",
"author": [ "author": [
"Marko Oldenburg <fhemdevelopment@cooltux.net>" "Marko Oldenburg <fhemdevelopment@cooltux.net>"
], ],

View File

@@ -1,5 +1,4 @@
UPD 2023-01-10_21:41:34 25809 FHEM/59_Weather.pm UPD 2025-10-14_07:34:42 24515 FHEM/59_Weather.pm
UPD 2023-01-10_21:20:58 33948 lib/FHEM/Core/Weather.pm UPD 2025-10-14_07:20:30 34175 lib/FHEM/Core/Weather.pm
UPD 2023-01-10_21:25:52 50106 lib/FHEM/APIs/Weather/DarkSkyAPI.pm UPD 2025-10-14_07:25:36 33545 lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm
UPD 2023-01-10_21:25:49 33422 lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm UPD 2025-10-14_07:20:30 38721 lib/FHEM/APIs/Weather/wundergroundAPI.pm
UPD 2023-01-10_21:25:53 36101 lib/FHEM/APIs/Weather/wundergroundAPI.pm

View File

@@ -4,33 +4,34 @@ use File::Basename;
use POSIX qw(strftime); use POSIX qw(strftime);
use strict; use strict;
my @filenames = ( 'FHEM/59_Weather.pm', my @filenames = (
'FHEM/59_Weather.pm',
'lib/FHEM/Core/Weather.pm', 'lib/FHEM/Core/Weather.pm',
'lib/FHEM/APIs/Weather/DarkSkyAPI.pm',
'lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm', 'lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm',
'lib/FHEM/APIs/Weather/wundergroundAPI.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); my @statOutput = stat($filename);
if (scalar @statOutput != 13) { if ( scalar @statOutput != 13 ) {
printf 'error: stat has unexpected return value for ' . $filename . "\n"; printf 'error: stat has unexpected return value for '
. $filename . "\n";
next; next;
} }
my $mtime = $statOutput[9]; my $mtime = $statOutput[9];
my $date = POSIX::strftime("%Y-%m-%d", localtime($mtime)); my $date = POSIX::strftime( "%Y-%m-%d", localtime($mtime) );
my $time = POSIX::strftime("%H:%M:%S", localtime($mtime)); my $time = POSIX::strftime( "%H:%M:%S", localtime($mtime) );
my $filetime = $date."_".$time; my $filetime = $date . "_" . $time;
my $filesize = $statOutput[7]; my $filesize = $statOutput[7];
printf FH 'UPD ' . $filetime . ' ' . $filesize . ' ' .$filename . "\n"; printf FH 'UPD ' . $filetime . ' ' . $filesize . ' ' . $filename . "\n";
} }
close(FH); close(FH);

File diff suppressed because one or more lines are too long

View File

@@ -3,7 +3,7 @@
# #
# Developed with VSCodium and richterger perl plugin # Developed with VSCodium and richterger perl plugin
# #
# (c) 2019-2023 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net) # (c) 2019-2025 Copyright: Marko Oldenburg (fhemdevelopment at cooltux dot net)
# All rights reserved # All rights reserved
# #
# Special thanks goes to: # Special thanks goes to:
@@ -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 );
@@ -423,7 +424,7 @@ sub _ProcessingRetrieveData {
_ErrorHandling( $self, _ErrorHandling( $self,
'OpenWeatherMap Weather decode JSON err ' . $@ ); 'OpenWeatherMap Weather decode JSON err ' . $@ );
} }
elsif (defined( $data->{cod} ) elsif ( defined( $data->{cod} )
&& $data->{cod} && $data->{cod}
&& $data->{cod} != 200 && $data->{cod} != 200
&& defined( $data->{message} ) && defined( $data->{message} )
@@ -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 );
}
} }
} }
@@ -591,6 +584,7 @@ sub _FillSelfHashWithWeatherResponseForWeatherCurrent {
'wind_direction' => $data->{wind}->{deg}, 'wind_direction' => $data->{wind}->{deg},
'cloudCover' => $data->{clouds}->{all}, 'cloudCover' => $data->{clouds}->{all},
'code' => $codes{ $data->{weather}->[0]->{id} }, 'code' => $codes{ $data->{weather}->[0]->{id} },
'owmAPICode' => $data->{weather}->[0]->{id},
'iconAPI' => $data->{weather}->[0]->{icon}, 'iconAPI' => $data->{weather}->[0]->{icon},
'sunsetTime' => _strftimeWrapper( 'sunsetTime' => _strftimeWrapper(
"%a, %e %b %Y %H:%M", "%a, %e %b %Y %H:%M",
@@ -670,6 +664,7 @@ sub _FillSelfHashWithWeatherResponseForForecastHourly {
), ),
'cloudCover' => $data->{list}->[$i]->{clouds}->{all}, 'cloudCover' => $data->{list}->[$i]->{clouds}->{all},
'code' => $codes{ $data->{list}->[$i]->{weather}->[0]->{id} }, 'code' => $codes{ $data->{list}->[$i]->{weather}->[0]->{id} },
'owmAPICode' => $data->{list}->[$i]->{weather}->[0]->{id},
'iconAPI' => $data->{list}->[$i]->{weather}->[0]->{icon}, 'iconAPI' => $data->{list}->[$i]->{weather}->[0]->{icon},
'rain1h' => ( 'rain1h' => (
$data->{list}->[$i]->{rain}->{'1h'} $data->{list}->[$i]->{rain}->{'1h'}
@@ -732,6 +727,7 @@ sub _FillSelfHashWithWeatherResponseForOnecallCurrent {
'rain_1h' => ( $data->{rain}->{'1h'} ? $data->{rain}->{'1h'} : 0 ), 'rain_1h' => ( $data->{rain}->{'1h'} ? $data->{rain}->{'1h'} : 0 ),
'cloudCover' => $data->{current}->{clouds}, 'cloudCover' => $data->{current}->{clouds},
'code' => $codes{ $data->{current}->{weather}->[0]->{id} }, 'code' => $codes{ $data->{current}->{weather}->[0]->{id} },
'owmAPICode' => $data->{current}->{weather}->[0]->{id},
'iconAPI' => $data->{current}->{weather}->[0]->{icon}, 'iconAPI' => $data->{current}->{weather}->[0]->{icon},
'condition' => 'condition' =>
encode_utf8( $data->{current}->{weather}->[0]->{description} ), encode_utf8( $data->{current}->{weather}->[0]->{description} ),
@@ -788,6 +784,7 @@ sub _FillSelfHashWithWeatherResponseForOnecallDaily {
'moonset' => strftime( 'moonset' => strftime(
"%a, %H:%M", localtime( $data->{daily}->[$i]->{moonset} ) "%a, %H:%M", localtime( $data->{daily}->[$i]->{moonset} )
), ),
'summary' => $data->{daily}->[$i]->{summary},
'temperature' => 'temperature' =>
int( sprintf( "%.0f", $data->{daily}->[$i]->{temp}->{day} ) ), int( sprintf( "%.0f", $data->{daily}->[$i]->{temp}->{day} ) ),
'temperature_morn' => int( 'temperature_morn' => int(
@@ -833,6 +830,7 @@ sub _FillSelfHashWithWeatherResponseForOnecallDaily {
$data->{daily}->[$i]->{weather}->[0]->{description} $data->{daily}->[$i]->{weather}->[0]->{description}
), ),
'code' => $codes{ $data->{daily}->[$i]->{weather}->[0]->{id} }, 'code' => $codes{ $data->{daily}->[$i]->{weather}->[0]->{id} },
'owmAPICode' => $data->{daily}->[$i]->{weather}->[0]->{id},
'iconAPI' => $data->{daily}->[$i]->{weather}->[0]->{icon}, 'iconAPI' => $data->{daily}->[$i]->{weather}->[0]->{icon},
'pressure' => int( 'pressure' => int(
sprintf( "%.1f", $data->{daily}->[$i]->{pressure} ) + 0.5 sprintf( "%.1f", $data->{daily}->[$i]->{pressure} ) + 0.5
@@ -853,7 +851,6 @@ sub _FillSelfHashWithWeatherResponseForOnecallDaily {
sprintf( "%.1f", ( $data->{daily}->[$i]->{wind_deg} ) ) sprintf( "%.1f", ( $data->{daily}->[$i]->{wind_deg} ) )
), ),
'cloudCover' => $data->{daily}->[$i]->{clouds}, 'cloudCover' => $data->{daily}->[$i]->{clouds},
'code' => $codes{ $data->{daily}->[$i]->{weather}->[0]->{id} },
'rain' => ( 'rain' => (
$data->{daily}->[$i]->{rain} ? $data->{daily}->[$i]->{rain} $data->{daily}->[$i]->{rain} ? $data->{daily}->[$i]->{rain}
: 0 : 0
@@ -920,6 +917,7 @@ sub _FillSelfHashWithWeatherResponseForOnecallHourly {
'wind_direction' => $data->{hourly}->[$i]->{wind_deg}, 'wind_direction' => $data->{hourly}->[$i]->{wind_deg},
'cloudCover' => $data->{hourly}->[$i]->{clouds}, 'cloudCover' => $data->{hourly}->[$i]->{clouds},
'code' => $codes{ $data->{hourly}->[$i]->{weather}->[0]->{id} }, 'code' => $codes{ $data->{hourly}->[$i]->{weather}->[0]->{id} },
'owmAPICode' => $data->{hourly}->[$i]->{weather}->[0]->{id},
'iconAPI' => $data->{hourly}->[$i]->{weather}->[0]->{icon}, 'iconAPI' => $data->{hourly}->[$i]->{weather}->[0]->{icon},
'rain1h' => ( 'rain1h' => (
$data->{hourly}->[$i]->{rain}->{'1h'} $data->{hourly}->[$i]->{rain}->{'1h'}
@@ -1031,7 +1029,7 @@ sub _strftimeWrapper {
], ],
"release_status": "stable", "release_status": "stable",
"license": "GPL_2", "license": "GPL_2",
"version": "v3.2.6", "version": "v3.2.8",
"author": [ "author": [
"Marko Oldenburg <fhemdevelopment@cooltux.net>" "Marko Oldenburg <fhemdevelopment@cooltux.net>"
], ],

File diff suppressed because one or more lines are too long

View File

@@ -2,12 +2,13 @@
############################################################################## ##############################################################################
# #
# 59_Weather.pm # 59_Weather.pm
# (c) 2009-2023 Copyright by Dr. Boris Neubert # (c) 2009-2025 Copyright by Dr. Boris Neubert
# e-mail: omega at online dot de # e-mail: omega at online dot de
# #
# Contributors: # Contributors:
# - Marko Oldenburg (CoolTux) # - Marko Oldenburg (CoolTux)
# - Lippie # - Lippie
# - stefanru (wundergroundAPI)
# #
# #
# This file is part of fhem. # This file is part of fhem.
@@ -32,9 +33,15 @@ package FHEM::Core::Weather;
use strict; use strict;
use warnings; use warnings;
use Time::HiRes qw(gettimeofday); my $missingModul = '';
use experimental qw /switch/;
use Readonly; eval { use Time::HiRes qw /gettimeofday/; 1 }
or $missingModul .= "libtime-hires-perl ";
eval { use Readonly; 1 }
or $missingModul .= "libreadonly-perl ";
#use experimental qw /switch/;
use FHEM::Meta; use FHEM::Meta;
@@ -214,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;
@@ -317,9 +324,7 @@ sub _ReturnWithError {
return; return;
} }
sub _DeleteForecastreadings { sub DeleteForecastreadings {
return 0 unless ( __PACKAGE__ eq caller(0) );
my $hash = shift; my $hash = shift;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
@@ -426,8 +431,13 @@ sub _Writereadings {
&& ref( $dataRef->{$r} ) ne 'ARRAY' ); && ref( $dataRef->{$r} ) ne 'ARRAY' );
} }
if ( defined( $dataRef->{current}->{code} )
&& $dataRef->{current}->{code} )
{
::readingsBulkUpdate( $hash, 'icon', ::readingsBulkUpdate( $hash, 'icon',
$iconlist[ $dataRef->{current}->{code} ] ); $iconlist[ $dataRef->{current}->{code} ] );
}
if ( defined( $dataRef->{current}->{wind_direction} ) if ( defined( $dataRef->{current}->{wind_direction} )
&& $dataRef->{current}->{wind_direction} && $dataRef->{current}->{wind_direction}
&& defined( $dataRef->{current}->{wind_speed} ) && defined( $dataRef->{current}->{wind_speed} )
@@ -770,6 +780,12 @@ sub Define {
return $@ unless ( FHEM::Meta::SetInternals($hash) ); return $@ unless ( FHEM::Meta::SetInternals($hash) );
use version 0.60; our $VERSION = FHEM::Meta::Get( $hash, 'version' ); use version 0.60; our $VERSION = FHEM::Meta::Get( $hash, 'version' );
return
'Cannot define Weather device. Please use "apt install '
. ${missingModul}
. ' to install missing perl modules'
if ($missingModul);
my $usage = my $usage =
"syntax: define <name> Weather [API=<API>] [apikey=<apikey>] [location=<location>] [interval=<interval>] [lang=<lang>]"; "syntax: define <name> Weather [API=<API>] [apikey=<apikey>] [location=<location>] [interval=<interval>] [lang=<lang>]";
@@ -843,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);
} }
@@ -855,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);
} }
@@ -872,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;
} }