Compare commits
	
		
			58 Commits
		
	
	
		
			v2.2.22
			...
			82d0e6b1b6
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 82d0e6b1b6 | |||
| e84d810e39 | |||
| 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 | 
							
								
								
									
										412
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										412
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,4 +1,412 @@
 | 
				
			|||||||
### build: v2.2.22 (HEAD -> patch-package)
 | 
					### Update version to 2.3.1 and fix conditionals in Weather.pm (HEAD -> patch-mod-weather)
 | 
				
			||||||
 | 
					>Thu, 16 Oct 2025 19:01:00 +0200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This commit updates the version number in the FHEM weather module
 | 
				
			||||||
 | 
					from 2.3.0 to 2.3.1 to reflect the latest changes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In addition to the version bump, several conditionals in
 | 
				
			||||||
 | 
					lib/FHEM/Core/Weather.pm have been corrected. Specifically, the
 | 
				
			||||||
 | 
					syntax for checking the command attributes has been fixed to ensure
 | 
				
			||||||
 | 
					proper evaluation of the conditions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These changes improve code clarity and correctness, which helps
 | 
				
			||||||
 | 
					in maintaining the module. There are no breaking changes in this
 | 
				
			||||||
 | 
					commit, and existing functionality remains intact.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Remove DarkSky API support from Weather module (tag: v2.3.0, origin/testing, origin/main, origin/dev, origin/HEAD, testing, main, dev)
 | 
				
			||||||
 | 
					>Tue, 14 Oct 2025 07:35:31 +0200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The DarkSky API support has been removed from the Weather module
 | 
				
			||||||
 | 
					documentation, affecting both English and German sections. The API
 | 
				
			||||||
 | 
					documentation now focuses solely on the OpenWeatherMap API.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Changes include the deletion of DarkSky references in `59_Weather.pm`
 | 
				
			||||||
 | 
					and updates to example command snippets to refer to the
 | 
				
			||||||
 | 
					OpenWeatherMap API. The version number was incremented from
 | 
				
			||||||
 | 
					v2.2.35 to v2.3.0, and the OpenWeatherMap API version was updated
 | 
				
			||||||
 | 
					from v3.2.7 to v3.2.8.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These updates were necessary as DarkSky has been discontinued,
 | 
				
			||||||
 | 
					streamlining the module's functionality. There are no breaking
 | 
				
			||||||
 | 
					changes for current OpenWeatherMap API users.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Additionally, the language handling in the Weather API was
 | 
				
			||||||
 | 
					refactored to replace the experimental `given/when` construct
 | 
				
			||||||
 | 
					with standard `if/elsif` statements for better readability
 | 
				
			||||||
 | 
					and maintainability. This change does not introduce any breaking
 | 
				
			||||||
 | 
					changes and enhances code clarity.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Remove DarkSky API support from Weather module
 | 
				
			||||||
 | 
					>Tue, 14 Oct 2025 07:35:18 +0200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The DarkSky API support has been removed from the Weather module documentation,
 | 
				
			||||||
 | 
					including its references in both English and German sections. The API
 | 
				
			||||||
 | 
					documentation has been updated to exclusively focus on the
 | 
				
			||||||
 | 
					OpenWeatherMap API.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The changes made to `59_Weather.pm` include:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Deleted mentions of the DarkSky API in the documentation.
 | 
				
			||||||
 | 
					- Updated example command snippets to reference the
 | 
				
			||||||
 | 
					  OpenWeatherMap API.
 | 
				
			||||||
 | 
					- Version number has been incremented from v2.2.35 to v2.3.0.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In addition, the version number for the OpenWeatherMap API support
 | 
				
			||||||
 | 
					has been updated from v3.2.7 to v3.2.8 in the corresponding API file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These updates were necessary to streamline the module's
 | 
				
			||||||
 | 
					functionality and align it with current API availability, as
 | 
				
			||||||
 | 
					DarkSky has been discontinued. There are no breaking changes
 | 
				
			||||||
 | 
					for existing users of the OpenWeatherMap API.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Refactor language handling in Weather API
 | 
				
			||||||
 | 
					>Tue, 14 Oct 2025 07:04:00 +0200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Improved the language initialization logic by replacing the
 | 
				
			||||||
 | 
					experimental `given/when` construct with a more standard
 | 
				
			||||||
 | 
					`if/elsif` structure to enhance code readability and
 | 
				
			||||||
 | 
					maintainability. The attribute handling in the `Attr` subroutine
 | 
				
			||||||
 | 
					was simplified for clarity, removing unnecessary usage
 | 
				
			||||||
 | 
					of `given/when`, which helps reduce complexity throughout
 | 
				
			||||||
 | 
					the codebase.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Additionally, in the OpenWeatherMapAPI module, the logic for
 | 
				
			||||||
 | 
					handling weather response data was streamlined by removing
 | 
				
			||||||
 | 
					`given/when` statements in favor of `if` conditions. This change
 | 
				
			||||||
 | 
					avoids potential confusion and enhances the clarity of the
 | 
				
			||||||
 | 
					code logic. No breaking changes were introduced; the overall
 | 
				
			||||||
 | 
					functionality remains intact.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Refactor language handling in Weather API
 | 
				
			||||||
 | 
					>Tue, 14 Oct 2025 07:03:38 +0200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Improved the language initialization logic by replacing the
 | 
				
			||||||
 | 
					experimental `given/when` construct with a more standard
 | 
				
			||||||
 | 
					`if/elsif` structure, enhancing code readability and
 | 
				
			||||||
 | 
					maintainability. The attribute handling in the `Attr` subroutine
 | 
				
			||||||
 | 
					was also refactored for clarity, removing unnecessary usage
 | 
				
			||||||
 | 
					of `given/when`, which helps reduce complexity throughout
 | 
				
			||||||
 | 
					the codebase.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In the OpenWeatherMapAPI module, the logic for handling
 | 
				
			||||||
 | 
					weather response data was streamlined by removing `given/when`
 | 
				
			||||||
 | 
					statements in favor of `if` conditions. This change avoids
 | 
				
			||||||
 | 
					potential confusion and enhances the clarity of the code logic.
 | 
				
			||||||
 | 
					No breaking changes were introduced; the overall functionality
 | 
				
			||||||
 | 
					remains intact.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Refactor language handling to improve readability
 | 
				
			||||||
 | 
					>Tue, 14 Oct 2025 07:01:07 +0200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Improved the language initialization logic by replacing the
 | 
				
			||||||
 | 
					experimental `given/when` construct with a more standard
 | 
				
			||||||
 | 
					`if/elsif` structure, enhancing code readability and
 | 
				
			||||||
 | 
					maintainability. Additionally, the attribute handling in the
 | 
				
			||||||
 | 
					`Attr` subroutine was refactored for clarity, removing
 | 
				
			||||||
 | 
					unnecessary usage of `given/when`, which helps reduce
 | 
				
			||||||
 | 
					complexity across the codebase.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Furthermore, in the OpenWeatherMapAPI module, logic for
 | 
				
			||||||
 | 
					handling weather response data was streamlined by removing
 | 
				
			||||||
 | 
					the `given/when` statements in favor of `if` conditions.
 | 
				
			||||||
 | 
					This change eliminates potential confusion and enhances
 | 
				
			||||||
 | 
					the clarity of the code logic. No breaking changes were
 | 
				
			||||||
 | 
					introduced; the overall functionality remains intact.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Refactor language initialization and attribute handling
 | 
				
			||||||
 | 
					>Tue, 14 Oct 2025 06:53:44 +0200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Improved the language initialization logic by replacing
 | 
				
			||||||
 | 
					the experimental `given/when` construct with a more
 | 
				
			||||||
 | 
					standard `if/elsif` structure. This change enhances code
 | 
				
			||||||
 | 
					readability and maintainability, making it easier to follow
 | 
				
			||||||
 | 
					the flow of language assignments.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Additionally, refactored attribute handling in the `Attr`
 | 
				
			||||||
 | 
					subroutine by streamlining the conditions, removing
 | 
				
			||||||
 | 
					unnecessary `given/when` usage, and maintaining clarity
 | 
				
			||||||
 | 
					in the logic for setting and deleting forecasts and alerts.
 | 
				
			||||||
 | 
					These changes help reduce complexity and improve
 | 
				
			||||||
 | 
					consistency throughout the codebase.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### ``` Refactor pre-commit hook by removing DarkSkyAPI references
 | 
				
			||||||
 | 
					>Wed, 5 Feb 2025 07:08:45 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Updated the pre-commit hook to eliminate references to
 | 
				
			||||||
 | 
					'lib/FHEM/APIs/Weather/DarkSkyAPI.pm'. This change was made to
 | 
				
			||||||
 | 
					simplify the codebase and make it more relevant by focusing on
 | 
				
			||||||
 | 
					the other weather API files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Additionally, the output formatting of the pre-commit hook
 | 
				
			||||||
 | 
					has been improved for better readability, and the order of
 | 
				
			||||||
 | 
					the files in the @filenames array has been restructured for
 | 
				
			||||||
 | 
					clarity.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					No breaking changes have been introduced; the pre-commit
 | 
				
			||||||
 | 
					hook continues to operate as intended.
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### ``` Refactor pre-commit hook file list and output formatting
 | 
				
			||||||
 | 
					>Wed, 5 Feb 2025 07:07:52 +0100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					>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 +416,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.1",
 | 
				
			||||||
  "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-16_18:59:55 24515 FHEM/59_Weather.pm
 | 
				
			||||||
UPD 2023-01-10_21:20:58 33948 lib/FHEM/Core/Weather.pm
 | 
					UPD 2025-10-16_18:59:41 34158 lib/FHEM/Core/Weather.pm
 | 
				
			||||||
UPD 2023-01-10_21:25:52 50106 lib/FHEM/APIs/Weather/DarkSkyAPI.pm
 | 
					UPD 2025-10-14_07:39:57 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,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 = (
 | 
				
			||||||
		    'lib/FHEM/Core/Weather.pm',
 | 
					    'FHEM/59_Weather.pm',
 | 
				
			||||||
		    'lib/FHEM/APIs/Weather/DarkSkyAPI.pm',
 | 
					    'lib/FHEM/Core/Weather.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
											
										
									
								
							@@ -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,67 +467,59 @@ 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};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ## löschen des alten forecast Datensatzes
 | 
					        ## löschen des alten forecast Datensatzes
 | 
				
			||||||
            delete $self->{cached}->{forecast};
 | 
					        delete $self->{cached}->{forecast};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ## löschen des alten Alerts Datensatzes
 | 
					        ## löschen des alten Alerts Datensatzes
 | 
				
			||||||
            delete $self->{cached}->{alerts};
 | 
					        delete $self->{cached}->{alerts};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $self =
 | 
				
			||||||
 | 
					          _FillSelfHashWithWeatherResponseForOnecallCurrent( $self, $data );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ( ref( $data->{hourly} ) eq "ARRAY"
 | 
				
			||||||
 | 
					            && scalar( @{ $data->{hourly} } ) > 0 )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            $self =
 | 
					            $self =
 | 
				
			||||||
              _FillSelfHashWithWeatherResponseForOnecallCurrent( $self, $data );
 | 
					              _FillSelfHashWithWeatherResponseForOnecallHourly( $self, $data );
 | 
				
			||||||
 | 
					 | 
				
			||||||
            if ( ref( $data->{hourly} ) eq "ARRAY"
 | 
					 | 
				
			||||||
                && scalar( @{ $data->{hourly} } ) > 0 )
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                $self =
 | 
					 | 
				
			||||||
                  _FillSelfHashWithWeatherResponseForOnecallHourly( $self,
 | 
					 | 
				
			||||||
                    $data );
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if ( ref( $data->{daily} ) eq "ARRAY"
 | 
					 | 
				
			||||||
                && scalar( @{ $data->{daily} } ) > 0 )
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                $self =
 | 
					 | 
				
			||||||
                  _FillSelfHashWithWeatherResponseForOnecallDaily( $self,
 | 
					 | 
				
			||||||
                    $data );
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if ( ref( $data->{alerts} ) eq "ARRAY"
 | 
					 | 
				
			||||||
                && scalar( @{ $data->{alerts} } ) > 0 )
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                $self =
 | 
					 | 
				
			||||||
                  _FillSelfHashWithWeatherResponseForOnecallAlerts( $self,
 | 
					 | 
				
			||||||
                    $data );
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        when ('weather') {
 | 
					        if ( ref( $data->{daily} ) eq "ARRAY"
 | 
				
			||||||
            ## löschen des alten current Datensatzes
 | 
					            && scalar( @{ $data->{daily} } ) > 0 )
 | 
				
			||||||
            delete $self->{cached}->{current};
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            ## löschen des alten Alerts Datensatzes
 | 
					 | 
				
			||||||
            delete $self->{cached}->{alerts};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            $self =
 | 
					            $self =
 | 
				
			||||||
              _FillSelfHashWithWeatherResponseForWeatherCurrent( $self, $data );
 | 
					              _FillSelfHashWithWeatherResponseForOnecallDaily( $self, $data );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        when ('forecast') {
 | 
					        if ( ref( $data->{alerts} ) eq "ARRAY"
 | 
				
			||||||
            ## löschen des alten forecast Datensatzes
 | 
					            && scalar( @{ $data->{alerts} } ) > 0 )
 | 
				
			||||||
            delete $self->{cached}->{forecast};
 | 
					        {
 | 
				
			||||||
 | 
					            $self =
 | 
				
			||||||
 | 
					              _FillSelfHashWithWeatherResponseForOnecallAlerts( $self, $data );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    elsif ( $self->{endpoint} eq 'weather' ) {
 | 
				
			||||||
 | 
					        ## löschen des alten current Datensatzes
 | 
				
			||||||
 | 
					        delete $self->{cached}->{current};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if ( ref( $data->{list} ) eq "ARRAY"
 | 
					        ## löschen des alten Alerts Datensatzes
 | 
				
			||||||
                and scalar( @{ $data->{list} } ) > 0 )
 | 
					        delete $self->{cached}->{alerts};
 | 
				
			||||||
            {
 | 
					
 | 
				
			||||||
                $self =
 | 
					        $self =
 | 
				
			||||||
                  _FillSelfHashWithWeatherResponseForForecastHourly( $self,
 | 
					          _FillSelfHashWithWeatherResponseForWeatherCurrent( $self, $data );
 | 
				
			||||||
                    $data );
 | 
					    }
 | 
				
			||||||
            }
 | 
					    elsif ( $self->{endpoint} eq 'forecast' ) {
 | 
				
			||||||
 | 
					        ## löschen des alten forecast Datensatzes
 | 
				
			||||||
 | 
					        delete $self->{cached}->{forecast};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ( ref( $data->{list} ) eq "ARRAY"
 | 
				
			||||||
 | 
					            and scalar( @{ $data->{list} } ) > 0 )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            $self =
 | 
				
			||||||
 | 
					              _FillSelfHashWithWeatherResponseForForecastHourly( $self, $data );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -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,8 +664,9 @@ 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} },
 | 
				
			||||||
                'iconAPI' => $data->{list}->[$i]->{weather}->[0]->{icon},
 | 
					                'owmAPICode' => $data->{list}->[$i]->{weather}->[0]->{id},
 | 
				
			||||||
                'rain1h'  => (
 | 
					                'iconAPI'    => $data->{list}->[$i]->{weather}->[0]->{icon},
 | 
				
			||||||
 | 
					                'rain1h'     => (
 | 
				
			||||||
                      $data->{list}->[$i]->{rain}->{'1h'}
 | 
					                      $data->{list}->[$i]->{rain}->{'1h'}
 | 
				
			||||||
                    ? $data->{list}->[$i]->{rain}->{'1h'}
 | 
					                    ? $data->{list}->[$i]->{rain}->{'1h'}
 | 
				
			||||||
                    : 0
 | 
					                    : 0
 | 
				
			||||||
@@ -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,8 +830,9 @@ 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} },
 | 
				
			||||||
                'iconAPI'  => $data->{daily}->[$i]->{weather}->[0]->{icon},
 | 
					                'owmAPICode' => $data->{daily}->[$i]->{weather}->[0]->{id},
 | 
				
			||||||
                'pressure' => int(
 | 
					                'iconAPI'    => $data->{daily}->[$i]->{weather}->[0]->{icon},
 | 
				
			||||||
 | 
					                'pressure'   => int(
 | 
				
			||||||
                    sprintf( "%.1f", $data->{daily}->[$i]->{pressure} ) + 0.5
 | 
					                    sprintf( "%.1f", $data->{daily}->[$i]->{pressure} ) + 0.5
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
                'wind' => int(
 | 
					                'wind' => int(
 | 
				
			||||||
@@ -853,8 +851,7 @@ 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,8 +917,9 @@ 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} },
 | 
				
			||||||
                'iconAPI' => $data->{hourly}->[$i]->{weather}->[0]->{icon},
 | 
					                'owmAPICode' => $data->{hourly}->[$i]->{weather}->[0]->{id},
 | 
				
			||||||
                'rain1h'  => (
 | 
					                'iconAPI'    => $data->{hourly}->[$i]->{weather}->[0]->{icon},
 | 
				
			||||||
 | 
					                'rain1h'     => (
 | 
				
			||||||
                      $data->{hourly}->[$i]->{rain}->{'1h'}
 | 
					                      $data->{hourly}->[$i]->{rain}->{'1h'}
 | 
				
			||||||
                    ? $data->{hourly}->[$i]->{rain}->{'1h'}
 | 
					                    ? $data->{hourly}->[$i]->{rain}->{'1h'}
 | 
				
			||||||
                    : 0
 | 
					                    : 0
 | 
				
			||||||
@@ -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,45 @@ 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' ) {
 | 
				
			||||||
 | 
					        %wdays_txt_i18n          = %wdays_txt_nl;
 | 
				
			||||||
 | 
					        @directions_txt_i18n     = @directions_txt_nl;
 | 
				
			||||||
 | 
					        %pressure_trend_txt_i18n = %pressure_trend_txt_nl;
 | 
				
			||||||
 | 
					        %status_items_txt_i18n   = %status_items_txt_nl;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    elsif ( $lang eq 'fr' ) {
 | 
				
			||||||
 | 
					        %wdays_txt_i18n          = %wdays_txt_fr;
 | 
				
			||||||
 | 
					        @directions_txt_i18n     = @directions_txt_fr;
 | 
				
			||||||
 | 
					        %pressure_trend_txt_i18n = %pressure_trend_txt_fr;
 | 
				
			||||||
 | 
					        %status_items_txt_i18n   = %status_items_txt_fr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        when ('nl') {
 | 
					    }
 | 
				
			||||||
            %wdays_txt_i18n          = %wdays_txt_nl;
 | 
					    elsif ( $lang eq 'pl' ) {
 | 
				
			||||||
            @directions_txt_i18n     = @directions_txt_nl;
 | 
					        %wdays_txt_i18n          = %wdays_txt_pl;
 | 
				
			||||||
            %pressure_trend_txt_i18n = %pressure_trend_txt_nl;
 | 
					        @directions_txt_i18n     = @directions_txt_pl;
 | 
				
			||||||
            %status_items_txt_i18n   = %status_items_txt_nl;
 | 
					        %pressure_trend_txt_i18n = %pressure_trend_txt_pl;
 | 
				
			||||||
        }
 | 
					        %status_items_txt_i18n   = %status_items_txt_pl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        when ('fr') {
 | 
					    }
 | 
				
			||||||
            %wdays_txt_i18n          = %wdays_txt_fr;
 | 
					    elsif ( $lang eq 'it' ) {
 | 
				
			||||||
            @directions_txt_i18n     = @directions_txt_fr;
 | 
					        %wdays_txt_i18n          = %wdays_txt_it;
 | 
				
			||||||
            %pressure_trend_txt_i18n = %pressure_trend_txt_fr;
 | 
					        @directions_txt_i18n     = @directions_txt_it;
 | 
				
			||||||
            %status_items_txt_i18n   = %status_items_txt_fr;
 | 
					        %pressure_trend_txt_i18n = %pressure_trend_txt_it;
 | 
				
			||||||
        }
 | 
					        %status_items_txt_i18n   = %status_items_txt_it;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        when ('pl') {
 | 
					    }
 | 
				
			||||||
            %wdays_txt_i18n          = %wdays_txt_pl;
 | 
					    else {
 | 
				
			||||||
            @directions_txt_i18n     = @directions_txt_pl;
 | 
					        %wdays_txt_i18n          = %wdays_txt_en;
 | 
				
			||||||
            %pressure_trend_txt_i18n = %pressure_trend_txt_pl;
 | 
					        @directions_txt_i18n     = @directions_txt_en;
 | 
				
			||||||
            %status_items_txt_i18n   = %status_items_txt_pl;
 | 
					        %pressure_trend_txt_i18n = %pressure_trend_txt_en;
 | 
				
			||||||
        }
 | 
					        %status_items_txt_i18n   = %status_items_txt_en;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        when ('it') {
 | 
					 | 
				
			||||||
            %wdays_txt_i18n          = %wdays_txt_it;
 | 
					 | 
				
			||||||
            @directions_txt_i18n     = @directions_txt_it;
 | 
					 | 
				
			||||||
            %pressure_trend_txt_i18n = %pressure_trend_txt_it;
 | 
					 | 
				
			||||||
            %status_items_txt_i18n   = %status_items_txt_it;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        default {
 | 
					 | 
				
			||||||
            %wdays_txt_i18n          = %wdays_txt_en;
 | 
					 | 
				
			||||||
            @directions_txt_i18n     = @directions_txt_en;
 | 
					 | 
				
			||||||
            %pressure_trend_txt_i18n = %pressure_trend_txt_en;
 | 
					 | 
				
			||||||
            %status_items_txt_i18n   = %status_items_txt_en;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
@@ -317,9 +321,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 +428,13 @@ sub _Writereadings {
 | 
				
			|||||||
                && ref( $dataRef->{$r} ) ne 'ARRAY' );
 | 
					                && ref( $dataRef->{$r} ) ne 'ARRAY' );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ::readingsBulkUpdate( $hash, 'icon',
 | 
					        if ( defined( $dataRef->{current}->{code} )
 | 
				
			||||||
            $iconlist[ $dataRef->{current}->{code} ] );
 | 
					            && $dataRef->{current}->{code} )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ::readingsBulkUpdate( $hash, 'icon',
 | 
				
			||||||
 | 
					                $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 +777,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,35 +856,31 @@ 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);
 | 
					        }
 | 
				
			||||||
            }
 | 
					        elsif ( $cmd eq 'del' ) {
 | 
				
			||||||
            elsif ( $cmd eq 'del' ) {
 | 
					            $hash->{fhem}->{api}->setForecast();
 | 
				
			||||||
                $hash->{fhem}->{api}->setForecast();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            ::InternalTimer( gettimeofday() + 0.5,
 | 
					 | 
				
			||||||
                \&FHEM::Core::Weather::DeleteForecastreadings, $hash );
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        when ('forecastLimit') {
 | 
					        ::InternalTimer( gettimeofday() + 0.5,
 | 
				
			||||||
            ::InternalTimer( gettimeofday() + 0.5,
 | 
					            \&FHEM::Core::Weather::DeleteForecastreadings, $hash );
 | 
				
			||||||
                \&FHEM::Core::Weather::DeleteForecastreadings, $hash );
 | 
					    }
 | 
				
			||||||
 | 
					    elsif ( $cmd eq 'forecastLimit' ) {
 | 
				
			||||||
 | 
					        ::InternalTimer( gettimeofday() + 0.5,
 | 
				
			||||||
 | 
					            \&FHEM::Core::Weather::DeleteForecastreadings, $hash );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    elsif ( $cmd eq 'alerts' ) {
 | 
				
			||||||
 | 
					        if ( $cmd eq 'set' ) {
 | 
				
			||||||
 | 
					            $hash->{fhem}->{api}->setAlerts($AttrVal);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        elsif ( $cmd eq 'del' ) {
 | 
				
			||||||
 | 
					            $hash->{fhem}->{api}->setAlerts();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        when ('alerts') {
 | 
					        ::InternalTimer( gettimeofday() + 0.5,
 | 
				
			||||||
            if ( $cmd eq 'set' ) {
 | 
					            \&FHEM::Core::Weather::DeleteAlertsreadings, $hash );
 | 
				
			||||||
                $hash->{fhem}->{api}->setAlerts($AttrVal);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            elsif ( $cmd eq 'del' ) {
 | 
					 | 
				
			||||||
                $hash->{fhem}->{api}->setAlerts();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            ::InternalTimer( gettimeofday() + 0.5,
 | 
					 | 
				
			||||||
                \&FHEM::Core::Weather::DeleteAlertsreadings, $hash );
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user