mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-01-31 12:49:34 +00:00
contrib/98_openweathermap.pm: use HttpUtils for nonblocking transfers
git-svn-id: https://svn.fhem.de/fhem/trunk@9682 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
2029c07b2e
commit
928379fc24
@ -64,6 +64,10 @@
|
||||
#
|
||||
# 2014-03-22 added: added set command 'clear'
|
||||
#
|
||||
# 2015-10-26 added: support for stationByZip
|
||||
# modi: use HttpUtils instead of LWP::UA
|
||||
# for nonblocking http
|
||||
#
|
||||
|
||||
package main;
|
||||
|
||||
@ -71,16 +75,12 @@ use strict;
|
||||
use warnings;
|
||||
use POSIX;
|
||||
use XML::Simple;
|
||||
eval {require JSON};
|
||||
use HttpUtils;
|
||||
eval "use JSON";
|
||||
use feature qw/say switch/;
|
||||
|
||||
no if $] >= 5.017011, warnings => 'experimental';
|
||||
|
||||
require LWP::UserAgent; # test
|
||||
my $ua = LWP::UserAgent->new; # test
|
||||
$ua->timeout(10); # test
|
||||
$ua->env_proxy; # test
|
||||
|
||||
sub OWO_abs2rel($$$);
|
||||
sub OWO_isday($$);
|
||||
|
||||
@ -98,7 +98,7 @@ sub openweathermap_Initialize($) {
|
||||
|
||||
$hash->{AttrList} = "do_not_notify:0,1 ".
|
||||
"owoGetUrl owoSendUrl owoInterval:600,900,1800,3600 ".
|
||||
"owoApiKey owoProxy owoStation owoUser owoUseXml:1,0 ".
|
||||
"owoApiKey owoStation owoUser owoUseXml:1,0 ".
|
||||
"owoDebug:0,1 owoRaw:0,1 owoTimestamp:0,1 ".
|
||||
"owoSrc00 owoSrc01 owoSrc02 owoSrc03 owoSrc04 ".
|
||||
"owoSrc05 owoSrc06 owoSrc07 owoSrc08 owoSrc09 ".
|
||||
@ -136,6 +136,7 @@ sub OWO_Set($@){
|
||||
CommandDeleteReading(undef, "$name _.*");
|
||||
CommandDeleteReading(undef, "$name c_.*");
|
||||
CommandDeleteReading(undef, "$name g_.*");
|
||||
CommandDeleteReading(undef, "$name my_.*");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -245,12 +246,6 @@ sub OWO_Attr(@){
|
||||
break;
|
||||
}
|
||||
|
||||
when("owoProxy"){
|
||||
if($attrValue ne ""){
|
||||
$ua->proxy(['http'], $attrValue);
|
||||
}
|
||||
}
|
||||
|
||||
default {
|
||||
$attr{$name}{$attrName} = $attrValue;
|
||||
}
|
||||
@ -321,15 +316,17 @@ sub OWO_GetStatus($;$){
|
||||
my $sendString = $urlString."?".$dataString;
|
||||
if(AttrVal($name, "owoDebug",1) == 0){
|
||||
Log3($name, 4, "owo $name: sending: $dataString");
|
||||
$htmlDummy = $ua->post($sendString);
|
||||
Log3($name, 3, "owo $name: htmlResponse: ".$htmlDummy->status_line);
|
||||
my $ll = AttrVal($name,'verbose',2);
|
||||
$htmlDummy = GetFileFromURLQuiet($sendString,10,1,0,$ll);
|
||||
$htmlDummy //= "no answer";
|
||||
Log3($name, 3, "owo $name: htmlResponse: ".$htmlDummy); #->status_line);
|
||||
} else {
|
||||
Log3($name, 3, "owo $name: debug: $dataString");
|
||||
}
|
||||
|
||||
readingsBeginUpdate($hash);
|
||||
readingsBulkUpdate($hash, "_httpResponse_my", $htmlDummy->status_line) if $htmlDummy;
|
||||
readingsBulkUpdate($hash, "my_response", $htmlDummy->decoded_content) if $htmlDummy;
|
||||
readingsBulkUpdate($hash, "_httpResponse_my", $htmlDummy); #->status_line) if $htmlDummy;
|
||||
readingsBulkUpdate($hash, "my_response", $htmlDummy); #->decoded_content) if $htmlDummy;
|
||||
readingsBulkUpdate($hash, "state","active");
|
||||
if(AttrVal($name, "owoTimestamp", 0) == 1){
|
||||
readingsBulkUpdate($hash, "my_lastSent", time);
|
||||
@ -337,9 +334,9 @@ sub OWO_GetStatus($;$){
|
||||
readingsBulkUpdate($hash, "my_lastSent", localtime(time));
|
||||
}
|
||||
readingsEndUpdate($hash, 1);
|
||||
if(defined($htmlDummy)){
|
||||
CommandDeleteReading(undef, "$name my_.*") if $htmlDummy->is_error;
|
||||
}
|
||||
# if(defined($htmlDummy)){
|
||||
# CommandDeleteReading(undef, "$name my_.*") if $htmlDummy->is_error;
|
||||
# }
|
||||
}
|
||||
|
||||
##### end of send job
|
||||
@ -405,20 +402,13 @@ sub UpdateReadings($$$){
|
||||
my $xmlMode = AttrVal($name, "owoUseXml", "");
|
||||
$url .= "&mode=xml" if($xmlMode eq "1");
|
||||
$url .= "&APPID=".AttrVal($name, "owoApiKey", "");
|
||||
eval {$response = $ua->get("$url")};
|
||||
|
||||
#
|
||||
# error handling for not found stations (error 404 from server)
|
||||
#
|
||||
if($response->decoded_content =~ m/error/i){
|
||||
CommandDeleteReading(undef, "$name $prefix.*");
|
||||
readingsSingleUpdate($hash, "_httpResponse_".substr($prefix,0,1), $response->decoded_content, 1);
|
||||
return;
|
||||
}
|
||||
my $ll = AttrVal($name,'verbose',2);
|
||||
$response = GetFileFromURLQuiet($url,10,1,0,$ll);
|
||||
|
||||
if(defined($response)){
|
||||
if(AttrVal($name, "owoDebug", 1) == 1){
|
||||
Log3($name, 4, "owo $name: response:\n".$response->decoded_content);
|
||||
Log3($name, 4, "owo $name: response:\n".$response);
|
||||
}
|
||||
} else {
|
||||
Log3($name, 4, "owo $name: error: no response from server");
|
||||
@ -426,18 +416,18 @@ sub UpdateReadings($$$){
|
||||
}
|
||||
|
||||
CommandDeleteReading(undef, "$name $prefix.*");
|
||||
readingsSingleUpdate($hash, "_httpResponse_".substr($prefix,0,1), $response->status_line, 1);
|
||||
readingsSingleUpdate($hash, "_httpResponse_".substr($prefix,0,1), "data found", 1);
|
||||
|
||||
if($xmlMode eq "1" && $response->is_success){
|
||||
if($xmlMode eq "1" && $response){
|
||||
Log3($name, 4, "owo $name: decoding XML");
|
||||
my $xml = new XML::Simple;
|
||||
$jsonWeather = undef;
|
||||
$jsonWeather = $xml->XMLin($response->decoded_content, KeyAttr => 'current' );
|
||||
$jsonWeather = $xml->XMLin($response, KeyAttr => 'current' );
|
||||
|
||||
if(defined($jsonWeather)){
|
||||
readingsBeginUpdate($hash);
|
||||
if(AttrVal($name, "owoRaw", 0) == 1){
|
||||
readingsBulkUpdate($hash, $prefix."rawData", $response->decoded_content);
|
||||
readingsBulkUpdate($hash, $prefix."rawData", $response);
|
||||
}
|
||||
readingsBulkUpdate($hash, "_dataSource", "www.openweathermap.org");
|
||||
readingsBulkUpdate($hash, "_decodedWith", "XML");
|
||||
@ -467,15 +457,15 @@ sub UpdateReadings($$$){
|
||||
}
|
||||
}
|
||||
|
||||
if($xmlMode ne "1" && $response->is_success){
|
||||
if($xmlMode ne "1" && $response){
|
||||
Log3($name, 4, "owo $name: decoding JSON");
|
||||
my $json = JSON->new->allow_nonref;
|
||||
eval {$jsonWeather = $json->decode($response->decoded_content)}; warn $@ if $@;
|
||||
eval {$jsonWeather = $json->decode($response)}; warn $@ if $@;
|
||||
|
||||
if(defined($jsonWeather)){
|
||||
readingsBeginUpdate($hash);
|
||||
if(AttrVal($name, "owoRaw", 0) == 1){
|
||||
readingsBulkUpdate($hash, $prefix."rawData", $response->decoded_content);
|
||||
readingsBulkUpdate($hash, $prefix."rawData", $response);
|
||||
}
|
||||
if(AttrVal($name, "owoTimestamp", 0) == 1){
|
||||
readingsBulkUpdate($hash, $prefix."lastWx", $jsonWeather->{dt});
|
||||
|
Loading…
Reference in New Issue
Block a user