Compare commits

..

No commits in common. "6a38b446a93bd6bfba5f7507215f0e3db905e177" and "6b6c066a9b16f77e5dca800d56508dceda05f3b9" have entirely different histories.

5 changed files with 76 additions and 145 deletions

View File

@ -1,46 +1,4 @@
### docs: change versions and add copyright (HEAD -> patch-fixforecast) ### feat: new reading owmAPICode for original code (HEAD -> patch-createDecimal)
>Fri, 11 Oct 2024 12:04:07 +0200
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net)
>Commiter: Marko Oldenburg (fhemdevelopment@cooltux.net)
### docs: Changelog (origin/patch-fixforecast)
>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 >Tue, 11 Jul 2023 14:10:13 +0200
>Author: Marko Oldenburg (fhemdevelopment@cooltux.net) >Author: Marko Oldenburg (fhemdevelopment@cooltux.net)

View File

@ -2,13 +2,12 @@
############################################################################## ##############################################################################
# #
# 59_Weather.pm # 59_Weather.pm
# (c) 2009-2024 Copyright by Dr. Boris Neubert # (c) 2009-2023 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.
@ -544,7 +543,7 @@ __END__
], ],
"release_status": "stable", "release_status": "stable",
"license": "GPL_2", "license": "GPL_2",
"version": "v2.2.30", "version": "v2.2.22",
"author": [ "author": [
"Marko Oldenburg <fhemdevelopment@cooltux.net>" "Marko Oldenburg <fhemdevelopment@cooltux.net>"
], ],

View File

@ -1,5 +1,5 @@
UPD 2024-10-11_12:02:22 25848 FHEM/59_Weather.pm UPD 2023-01-29_16:14:48 25809 FHEM/59_Weather.pm
UPD 2024-10-11_11:59:21 34293 lib/FHEM/Core/Weather.pm UPD 2023-06-06_07:31:00 34254 lib/FHEM/Core/Weather.pm
UPD 2023-01-29_16:14:48 50106 lib/FHEM/APIs/Weather/DarkSkyAPI.pm UPD 2023-01-29_16:14:48 50106 lib/FHEM/APIs/Weather/DarkSkyAPI.pm
UPD 2023-07-11_14:08:00 33779 lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm UPD 2023-07-11_14:08:00 33779 lib/FHEM/APIs/Weather/OpenWeatherMapAPI.pm
UPD 2024-10-11_12:02:42 37627 lib/FHEM/APIs/Weather/wundergroundAPI.pm UPD 2023-06-02_05:03:58 36607 lib/FHEM/APIs/Weather/wundergroundAPI.pm

View File

@ -15,9 +15,9 @@ return "$@" if ($@);
return $ret if ($ret); return $ret if ($ret);
$::packages{wundergroundAPI}{META} = $META; $::packages{wundergroundAPI}{META} = $META;
use version 0.80; our $VERSION = $META->{version}; use version 0.77; our $VERSION = $META->{version};
use Data::Dumper; # use Data::Dumper;
# try to use JSON::MaybeXS wrapper # try to use JSON::MaybeXS wrapper
# for chance of better performance + open code # for chance of better performance + open code
@ -103,11 +103,10 @@ sub new {
? $argsRef->{apikey} ? $argsRef->{apikey}
: 'none' : 'none'
), ),
lang => $argsRef->{language}, lang => $argsRef->{language},
lat => ( split( ',', $argsRef->{location} ) )[0], lat => ( split( ',', $argsRef->{location} ) )[0],
long => ( split( ',', $argsRef->{location} ) )[1], long => ( split( ',', $argsRef->{location} ) )[1],
fetchTime => 0, fetchTime => 0,
forecastFetchTime => 0,
}; };
$self->{cachemaxage} = ( $self->{cachemaxage} = (
@ -211,66 +210,29 @@ sub _RetrieveDataFromWU {
return 0 unless ( __PACKAGE__ eq caller(0) ); return 0 unless ( __PACKAGE__ eq caller(0) );
my $self = shift; my $self = shift;
my $paramRef;
my $options; # retrieve data from cache
if ( ( time() - $self->{fetchTime} ) < $self->{cachemaxage}
and $self->{cached}->{lat} == $self->{lat}
and $self->{cached}->{long} == $self->{long} )
{
return _CallWeatherCallbackFn($self);
}
$self->{cached}->{lat} = $self->{lat} $self->{cached}->{lat} = $self->{lat}
unless ( $self->{cached}->{lat} == $self->{lat} ); unless ( $self->{cached}->{lat} == $self->{lat} );
$self->{cached}->{long} = $self->{long} $self->{cached}->{long} = $self->{long}
unless ( $self->{cached}->{long} == $self->{long} ); unless ( $self->{cached}->{long} == $self->{long} );
# retrieve forecast data from cache my $paramRef = {
if ( ( time() - $self->{forecastFetchTime} ) < $self->{cachemaxage} timeout => 15,
and $self->{cached}->{lat} == $self->{lat} self => $self,
and $self->{cached}->{long} == $self->{long} ) callback => (
{ $self->{stationId}
# old: return _CallWeatherCallbackFn($self); ? \&_RetrieveDataFromPWS
# Do not just return but get PWS data without forecast : \&_RetrieveDataFinished
$paramRef = { ),
timeout => 15, };
self => $self,
callback => \&_RetrieveDataFinished,
};
#Build station URL
$options = 'stationId=' . $self->{stationId};
$options .= '&format=json';
$options .= '&units=' . $self->{units};
$options .= '&numericPrecision=decimal';
$options .= '&apiKey=' . $self->{key};
$paramRef->{url} = $URL . 'v2/pws/observations/current?' . $options;
}
else {
# Get the complete data station and forecast
$paramRef = {
timeout => 15,
self => $self,
callback => (
$self->{stationId}
? \&_RetrieveDataFromPWS
: \&_RetrieveDataFinished
),
};
# Build forecast URL
$options = 'geocode=' . $self->{lat} . ',' . $self->{long};
$options .= '&format=json';
$options .= '&units=' . $self->{units};
$options .= '&language='
. (
$self->{lang} eq 'en'
? 'en-US'
: $self->{lang} . '-' . uc( $self->{lang} )
);
$options .= '&apiKey=' . $self->{key};
$paramRef->{url} =
$URL
. 'v3/wx/forecast/daily/'
. $self->{days} . 'day' . '?'
. $options;
}
if ( $self->{lat} eq 'error' if ( $self->{lat} eq 'error'
or $self->{long} eq 'error' or $self->{long} eq 'error'
@ -288,6 +250,23 @@ sub _RetrieveDataFromWU {
if ( $self->{key} eq 'none' ); if ( $self->{key} eq 'none' );
} }
else { else {
my $options = 'geocode=' . $self->{lat} . ',' . $self->{long};
$options .= '&format=json';
$options .= '&units=' . $self->{units};
$options .= '&language='
. (
$self->{lang} eq 'en'
? 'en-US'
: $self->{lang} . '-' . uc( $self->{lang} )
);
$options .= '&apiKey=' . $self->{key};
$paramRef->{url} =
$URL
. 'v3/wx/forecast/daily/'
. $self->{days} . 'day' . '?'
. $options;
if ( lc( $self->{key} ) eq 'demo' ) { if ( lc( $self->{key} ) eq 'demo' ) {
_RetrieveDataFinished( $paramRef, undef, 'DEMODATA' . $DEMODATA ); _RetrieveDataFinished( $paramRef, undef, 'DEMODATA' . $DEMODATA );
} }
@ -373,20 +352,10 @@ sub _RetrieveDataFinished {
$self->{cached}{status} = 'ok'; $self->{cached}{status} = 'ok';
$self->{cached}{validity} = 'up-to-date'; $self->{cached}{validity} = 'up-to-date';
$self->{fetchTime} = time(); $self->{fetchTime} = time();
#print Dumper $response; ## for debugging
#print Dumper $data; ## for debugging
#if (exists( $response->{daily} )) {
if ( $response =~ /{"daily":/ ) {
$self->{forecastFetchTime} = time();
}
_ProcessingRetrieveData( $self, $response ); _ProcessingRetrieveData( $self, $response );
} }
else { else {
$self->{fetchTime} = time() if ( not defined( $self->{fetchTime} ) ); $self->{fetchTime} = time() if ( not defined( $self->{fetchTime} ) );
$self->{forecastFetchTime} = time()
if ( not defined( $self->{forecastFetchTime} ) );
_ErrorHandling( $self, $err ); _ErrorHandling( $self, $err );
_ProcessingRetrieveData( $self, $response ); _ProcessingRetrieveData( $self, $response );
} }
@ -420,15 +389,12 @@ sub _ProcessingRetrieveData {
# 'Code: ' . $data->{code} . ' Error: ' . $data->{error} ); # 'Code: ' . $data->{code} . ' Error: ' . $data->{error} );
# } # }
else { else {
# print Dumper $response; ## for debugging # print Dumper $response; ## für Debugging
# print Dumper $data; ## for debugging # print Dumper $data; ## für Debugging
$self->{cached}{current_date_time} = $self->{cached}{current_date_time} =
_strftimeWrapper( "%a, %e %b %Y %H:%M", _strftimeWrapper( "%a, %e %b %Y %H:%M",
localtime( $self->{fetchTime} ) ); localtime( $self->{fetchTime} ) );
$self->{cached}{current_forecast_date_time} =
_strftimeWrapper( "%a, %e %b %Y %H:%M",
localtime( $self->{forecastFetchTime} ) );
# $self->{cached}{timezone} = $data->{timezone}; # $self->{cached}{timezone} = $data->{timezone};
$self->{cached}{license}{text} = $self->{cached}{license}{text} =
@ -457,22 +423,34 @@ sub _ProcessingRetrieveData {
); );
$self->{cached}{current} = { $self->{cached}{current} = {
'dewPoint' => sprintf( "%.1f", $data->{$unit}{dewpt} ), 'dewPoint' =>
'heatIndex' => $data->{$unit}{heatIndex}, int( sprintf( "%.1f", $data->{$unit}{dewpt} ) + 0.5 ),
'heatIndex' => $data->{$unit}{heatIndex},
'precipRate' => $data->{$unit}{precipRate}, 'precipRate' => $data->{$unit}{precipRate},
'precipTotal' => $data->{$unit}{precipTotal}, 'precipTotal' => $data->{$unit}{precipTotal},
'pressure' => 'pressure' => int(
sprintf( "%.1f", $data->{$unit}{pressure} ), sprintf( "%.1f", $data->{$unit}{pressure} ) + 0.5
),
'temperature' => 'temperature' =>
sprintf( "%.1f", $data->{$unit}{temp} ), int( sprintf( "%.1f", $data->{$unit}{temp} ) + 0.5 ),
'temp_c' => sprintf( "%.1f", $data->{$unit}{temp} ), 'temp_c' =>
'wind_chill' => int( sprintf( "%.1f", $data->{$unit}{temp} ) + 0.5 ),
sprintf( "%.1f", $data->{$unit}{windChill} ), 'wind_chill' => int(
'windGust' => sprintf( "%.1f", ( $data->{$unit}{windChill} ) ) +
sprintf( "%.1f", $data->{$unit}{windGust} ), 0.5
'wind' => sprintf( "%.1f", $data->{$unit}{windSpeed} ), ),
'wind_speed' => 'windGust' => int(
sprintf( "%.1f", $data->{$unit}{windSpeed} ), sprintf( "%.1f", ( $data->{$unit}{windGust} ) ) +
0.5
),
'wind' => int(
sprintf( "%.1f", ( $data->{$unit}{windSpeed} ) ) +
0.5
),
'wind_speed' => int(
sprintf( "%.1f", ( $data->{$unit}{windSpeed} ) ) +
0.5
),
'wind_direction' => $data->{winddir}, 'wind_direction' => $data->{winddir},
'solarRadiation' => $data->{solarRadiation}, 'solarRadiation' => $data->{solarRadiation},
'uvIndex' => $data->{uv}, 'uvIndex' => $data->{uv},
@ -764,7 +742,7 @@ sub _CallWeatherCallbackFn {
my $self = shift; my $self = shift;
## Aufruf der callbackFn # ## Aufruf der callbackFn
return FHEM::Core::Weather::RetrieveCallbackFn( $self->{devName} ); return FHEM::Core::Weather::RetrieveCallbackFn( $self->{devName} );
} }
@ -776,9 +754,6 @@ sub _ErrorHandling {
$self->{cached}{current_date_time} = $self->{cached}{current_date_time} =
_strftimeWrapper( "%a, %e %b %Y %H:%M", localtime( $self->{fetchTime} ) ); _strftimeWrapper( "%a, %e %b %Y %H:%M", localtime( $self->{fetchTime} ) );
$self->{cached}{current_forecast_date_time} =
_strftimeWrapper( "%a, %e %b %Y %H:%M",
localtime( $self->{forecastFetchTime} ) );
$self->{cached}{status} = $err; $self->{cached}{status} = $err;
$self->{cached}{validity} = 'stale'; $self->{cached}{validity} = 'stale';
@ -840,7 +815,7 @@ sub _strftimeWrapper {
"abstract": "Wetter API für Weather Underground" "abstract": "Wetter API für Weather Underground"
} }
}, },
"version": "v1.3.0", "version": "v1.2.0",
"author": [ "author": [
"Julian Pawlowski <julian.pawlowski@gmail.com>" "Julian Pawlowski <julian.pawlowski@gmail.com>"
], ],

View File

@ -2,13 +2,12 @@
############################################################################## ##############################################################################
# #
# 59_Weather.pm # 59_Weather.pm
# (c) 2009-2024 Copyright by Dr. Boris Neubert # (c) 2009-2023 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.