59_Weather.pm:plus all API Files - Add new Modul setter newLocation

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@20155 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
LeonGaultier 2019-09-13 10:22:36 +00:00
parent db340fb39a
commit 3da8ec7c54
5 changed files with 230 additions and 22 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
- feature: 59_Weather.pm: plus all API Files - Add new Modul setter newLocation
- feature: 49_SSCam(STRM): hide buttons in streaming device with new attribute
hideFooter, minor code changes
- feature 73_AutoShuttersControl: add roommate value for ASC_Up/Down for

View File

@ -310,6 +310,10 @@ sub Weather_ReturnWithError($$) {
sub Weather_RetrieveCallbackFn($) {
my $name = shift;
return undef
unless ( IsDevice($name) );
my $hash = $defs{$name};
my $responseRef = $hash->{fhem}->{api}->getWeather;
@ -567,8 +571,27 @@ sub Weather_Set($@) {
Weather_GetUpdate($hash);
return undef;
}
elsif ( ( @a >= 2 ) && ( $a[1] eq "newLocation" ) ) {
if ( $hash->{API} eq 'DarkSkyAPI'
or $hash->{API} eq 'OpenWeatherMapAPI'
or $hash->{API} eq 'wundergroundAPI'
)
{
my ($lat,$long);
($lat,$long) = split(',',$a[2])
if ( defined($a[2]) and $a[2] );
($lat,$long) = split(',',$hash->{fhem}->{LOCATION})
unless ( defined($lat) and defined($long) );
$hash->{fhem}->{api}->setLocation($lat,$long);
Weather_DisarmTimer($hash);
Weather_GetUpdate($hash);
return undef;
}
else { return 'this API is not ' . $a[1] .' supported' }
}
else {
return "Unknown argument $cmd, choose one of update:noArg";
return "Unknown argument $cmd, choose one of update:noArg newLocation";
}
}
@ -649,7 +672,7 @@ sub Weather_Define($$) {
$hash->{NOTIFYDEV} = "global";
$hash->{fhem}->{interfaces} = "temperature;humidity;wind";
$hash->{LOCATION} = (
$hash->{fhem}->{LOCATION} = (
( defined($location) and $location )
? $location
: AttrVal( 'global', 'latitude', 'error' ) . ','
@ -665,8 +688,10 @@ sub Weather_Define($$) {
$hash->{MODEL} = $api;
$hash->{APIKEY} = $apikey;
$hash->{APIOPTIONS} = $apioptions;
$hash->{READINGS}->{current_date_time}->{TIME} = TimeNow();
$hash->{READINGS}->{current_date_time}->{VAL} = "none";
readingsSingleUpdate($hash,'current_date_time',TimeNow(),0);
readingsSingleUpdate($hash,'current_date_time','none',0);
#$hash->{READINGS}->{current_date_time}->{TIME} = TimeNow();
#$hash->{READINGS}->{current_date_time}->{VAL} = "none";
$hash->{fhem}->{allowCache} = 1;
readingsSingleUpdate( $hash, 'state', 'Initialized', 1 );
@ -677,7 +702,7 @@ sub Weather_Define($$) {
{
devName => $hash->{NAME},
apikey => $hash->{APIKEY},
location => $hash->{LOCATION},
location => $hash->{fhem}->{LOCATION},
apioptions => $hash->{APIOPTIONS},
language => $hash->{LANG}
}
@ -1034,10 +1059,19 @@ sub WeatherCheckOptions($@) {
<a name="Weatherset"></a>
<b>Set </b>
<ul>
<code>set &lt;name&gt; update</code><br><br>
<li>
<code>set &lt;name&gt; update</code><br><br>
Forces the retrieval of the weather data. The next automatic retrieval is scheduled to occur
<code>interval</code> seconds later.<br><br>
Forces the retrieval of the weather data. The next automatic retrieval is scheduled to occur
<code>interval</code> seconds later.
</li>
<li>
<code>set &lt;name&gt; newLocation latitude,longitude</code><br><br>
set a new temporary location.
the value pair Latitude Longitude is separated by a comma.
if no value is entered (empty value), the location detected by definition is automatically taken.<br><br>
</li>
</ul>
<br>
@ -1207,11 +1241,20 @@ sub WeatherCheckOptions($@) {
<a name="Weatherset"></a>
<b>Set </b>
<ul>
<code>set &lt;name&gt; update</code><br><br>
<li>
<code>set &lt;name&gt; update</code><br><br>
Erzwingt eine Abfrage der Wetterdaten. Die darauffolgende Abfrage
wird gem&auml;&szlig; dem eingestellten
Intervall <code>interval</code> Sekunden sp&auml;ter durchgef&uuml;hrt.<br><br>
Erzwingt eine Abfrage der Wetterdaten. Die darauffolgende Abfrage
wird gem&auml;&szlig; dem eingestellten
Intervall <code>interval</code> Sekunden sp&auml;ter durchgef&uuml;hrt.
</li>
<li>
<code>set &lt;name&gt; newLocation latitude,longitude</code><br><br>
Gibt die M&ouml;glichkeit eine neue tempor&auml;re Location zu setzen.
Das Wertepaar Latitude Longitude wird durch ein Komma getrennt &uuml;bergeben.
Wird kein Wert mitgegebn (leere &Uuml;bergabe) wird automatisch die per Definition erkannte Location genommen<br><br>
</li>
</ul>
<br>

File diff suppressed because one or more lines are too long

View File

@ -32,6 +32,15 @@
# https://api.openweathermap.org/data/2.5/forecast?lat=[lat]&lon=[long]&APPID=[API] Forecast
# https://openweathermap.org/weather-conditions Icons und Conditions ID's
package OpenWeatherMapAPI;
use strict;
use warnings;
use FHEM::Meta;
use Data::Dumper;
FHEM::Meta::Load(__PACKAGE__);
use version 0.50; our $VERSION = $main::packages{OpenWeatherMapAPI}{META}{version};
package OpenWeatherMapAPI::Weather;
use strict;
use warnings;
@ -116,7 +125,6 @@ eval "use Encode qw(encode_utf8);1" or $missingModul .= "Encode ";
# use Data::Dumper; # for Debug only
## API URL
use constant URL => 'https://api.openweathermap.org/data/2.5/';
use constant VERSION => '0.4.0';
## URL . 'weather?' for current data
## URL . 'forecast?' for forecast data
@ -237,6 +245,15 @@ sub setRetrieveData {
return 0;
}
sub setLocation {
my ($self,$lat,$long) = @_;
$self->{lat} = $lat;
$self->{long} = $long;
return 0;
}
sub getFetchTime {
my $self = shift;
@ -253,12 +270,19 @@ sub _RetrieveDataFromOpenWeatherMap($) {
my $self = shift;
# retrieve data from cache
if ( $self->{endpoint} eq 'none' ) {
if ( ( time() - $self->{fetchTime} ) < $self->{cachemaxage} ) {
return _CallWeatherCallbackFn($self);
}
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}
unless ( $self->{cached}->{lat} == $self->{lat} );
$self->{cached}->{long} = $self->{long}
unless ( $self->{cached}->{long} == $self->{long} );
my $paramRef = {
timeout => 15,
self => $self,
@ -582,7 +606,7 @@ sub _CreateForecastRef($) {
long => $self->{long},
apiMaintainer =>
'Leon Gaultier (<a href=https://forum.fhem.de/index.php?action=profile;u=13684>CoolTux</a>)',
apiVersion => VERSION,
apiVersion => version->parse(OpenWeatherMapAPI->VERSION())->normal,
}
);
@ -611,3 +635,51 @@ sub strftimeWrapper(@) {
##############################################################################
1;
=pod
=encoding utf8
=for :application/json;q=META.json OpenWeatherMapAPI.pm
{
"abstract": "Weather API for Weather OpenWeatherMap",
"x_lang": {
"de": {
"abstract": "Wetter API für OpenWeatherMap"
}
},
"version": "v1.0.0",
"author": [
"Marko Oldenburg <leongaultier@gmail.com>"
],
"x_fhem_maintainer": [
"CoolTux"
],
"x_fhem_maintainer_github": [
"LeonGaultier"
],
"prereqs": {
"runtime": {
"requires": {
"FHEM::Meta": 0,
"HttpUtils": 0,
"strict": 0,
"warnings": 0,
"constant": 0,
"POSIX": 0,
"JSON::PP": 0
},
"recommends": {
"JSON": 0
},
"suggests": {
"JSON::XS": 0,
"Cpanel::JSON::XS": 0
}
}
}
}
=end :application/json;q=META.json
=cut

View File

@ -172,6 +172,15 @@ sub setRetrieveData {
return 0;
}
sub setLocation {
my ($self,$lat,$long) = @_;
$self->{lat} = $lat;
$self->{long} = $long;
return 0;
}
sub getFetchTime {
my $self = shift;
@ -188,10 +197,19 @@ sub _RetrieveDataFromWU($) {
my $self = shift;
# retrieve data from cache
if ( ( time() - $self->{fetchTime} ) < $self->{cachemaxage} ) {
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}
unless ( $self->{cached}->{lat} == $self->{lat} );
$self->{cached}->{long} = $self->{long}
unless ( $self->{cached}->{long} == $self->{long} );
my $paramRef = {
timeout => 15,
self => $self,