Compare commits
56 Commits
Author | SHA1 | Date | |
---|---|---|---|
dbd7d760aa | |||
75f92aece3 | |||
14644b8575 | |||
f37a24673c | |||
d313cb8d4a | |||
2e3210c438 | |||
2db8db3b89 | |||
af36bed895 | |||
ba898624c5 | |||
12595b3674 | |||
f7234b10f8 | |||
be3fb7bbfc | |||
23bbc9f9b0 | |||
e60509fbfd | |||
aafeea4d5f | |||
c6b6a12e47 | |||
b57f538bc3 | |||
464ba0bec3 | |||
2b96be4e6e | |||
d07297bcd8 | |||
af786290bc | |||
478c4a3159 | |||
6a38b446a9 | |||
00c0a2a87e | |||
0a47226436 | |||
e9fb9357a9 | |||
ce875a8beb | |||
d0157fb2c7 | |||
eb134a19e9 | |||
cfd255569f | |||
b1de4b52da | |||
6b6c066a9b | |||
530fc01d57 | |||
7d7cbef4ed | |||
8b9bbd4f98 | |||
2a06821252 | |||
9868f74a86 | |||
d2e93a6d5a | |||
c27d51534c | |||
5bfd1c49d9 | |||
0f1af75a9e | |||
70a402f096 | |||
245fc455e1 | |||
1683fab2d4 | |||
33763032c6 | |||
2afb98f9b9 | |||
38091aacd1 | |||
30dd03cbea | |||
43e3fcb237 | |||
5f611555e3 | |||
a3fa194cdd | |||
baa48a79a4 | |||
2601a42643 | |||
cfd8ff9ea1 | |||
be3352e462 | |||
fb5087803b |
362
CHANGELOG.md
362
CHANGELOG.md
@@ -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
@@ -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 <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
|
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:<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>
|
|
||||||
|
|
||||||
<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ötigt. Mit <code>apt-get install
|
Hinweis: es wird das Perl-Modul JSON benö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ür das gewählte API</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>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.
|
<tr><td><code>location</code></td><td>Ort, fü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 <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
|
Bei dieser Definition wird die API von Dark Sky verwendet mit einem
|
||||||
individuellen Schlüssel, den man sich auf der Webseite von Dark Sky
|
individuellen Schlü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:<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>
|
|
||||||
|
|
||||||
<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ützt zusätzlich vier verschiedene Funktionen
|
Das Modul unterstützt zusä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>"
|
||||||
],
|
],
|
||||||
|
@@ -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
|
|
||||||
|
@@ -4,9 +4,9 @@ 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',
|
||||||
);
|
);
|
||||||
@@ -19,7 +19,8 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -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 );
|
||||||
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user