incremental timeout for updatefn

This commit is contained in:
Philipp Wo 2019-11-22 09:44:00 +01:00
parent 08c32cf0dc
commit 92cd323578
1 changed files with 121 additions and 155 deletions

View File

@ -170,21 +170,21 @@ sub TadoAPI_Set(@) {
} elsif( $cmd eq 'setZoneOverlay' ) {
Log3 $name, 5, "TadoAPI $name" . ": " . "processing ($cmd)";
return "Need at least two parameters (ZoneID, Setting)" if(@a < 4);
return "Need at least two parameters (ZoneID, Setting) - Setting: off=delete overlay; 0=heating power off; 1<=desired temperature (overlay)" if(@a < 4);
if( $a[3] eq "off" ) {
TadoAPI_SetZoneOverlayById($hash, $value, "off");
} elsif ($a[3] > 1) {
} elsif ($a[3] >= 0) {
TadoAPI_SetZoneOverlayById($hash, $value, $a[3]);
}
Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n";
} elsif( $cmd eq 'setAllOverlays' ) {
Log3 $name, 5, "TadoAPI $name" . ": " . "processing ($cmd)";
return "Need at least one parameter (Setting)" if(@a < 3);
return "Need at least one parameter (Setting) - Setting: off=delete overlay; 0=heating power off; 1<=desired temperature (overlay)" if(@a < 3);
if( $value eq "off" ) {
TadoAPI_SetAllOverlays($hash, "off");
} elsif ($value > 1) {
} elsif ($value >= 0) {
TadoAPI_SetAllOverlays($hash, $value);
}
Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n";
@ -379,7 +379,7 @@ sub TadoAPI_LoadToken(@){
}else{
Log3 $name, 5, "TadoAPI $name" . ": " . "Token expires at " . localtime($tokenLifeTime);
# if token is about to expire, refresh him
if(($tokenLifeTime-15) < gettimeofday()){
if(($tokenLifeTime-45) < gettimeofday()){
Log3 $name, 5, "TadoAPI $name" . ": " . "Token will expire soon, refreshing";
TadoAPI_TokenRefresh($hash);
}
@ -391,89 +391,116 @@ return undef;
}
sub TadoAPI_NewTokenRequest(@) {
my ($hash) = @_;
my $name = $hash->{NAME};
my $username = $hash->{TADO_USER};
my $password = TadoAPI_readPassword($name);
my $tokenFileName = $tokenFile."_".$name;
my ($hash) = @_;
my $name = $hash->{NAME};
my $username = $hash->{TADO_USER};
my $password = TadoAPI_readPassword($name);
my $tokenFileName = $tokenFile."_".$name;
Log3 $name, 5, "TadoAPI $name" . ": " . "calling NewTokenRequest()";
Log3 $name, 5, "TadoAPI $name" . ": " . "calling NewTokenRequest()";
$data = {
client_id => $client_id,
client_secret => $client_secret,
username => $username,
password => $password,
scope => $scope,
grant_type=>'password'
};
$data = {
client_id => $client_id,
client_secret => $client_secret,
username => $username,
password => $password,
scope => $scope,
grant_type=>'password'
};
my $param = {
url => $AuthURL,
method => 'POST',
timeout => 5,
hash => $hash,
data => $data
};
my $param = {
url => $AuthURL,
method => 'POST',
timeout => 5,
hash => $hash,
data => $data
};
Log3 $name, 5, 'Blocking GET: ' . Dumper($param);
my ($err, $data) = HttpUtils_BlockingGet($param);
Log3 $name, 5, 'Blocking GET: ' . Dumper($param);
my ($err, $data) = HttpUtils_BlockingGet($param);
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "NewTokenRequest: Error while requesting ".$param->{url}." - $err";
}
elsif($data ne "")
{
Log3 $name, 5, "url ".$param->{url}." returned: $data";
my $decoded_data = eval { decode_json($data) };
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "NewTokenRequest: decode_json failed, invalid json. error: $@ ";
}else{
#write token data in file
open(TOKENFILE,">$tokenFileName") or die("ERROR: $!");
print TOKENFILE $data . "\n";
close(TOKENFILE);
# token lifetime management
$hash->{TOKEN_LIFETIME} = gettimeofday() + $decoded_data->{'expires_in'};
$hash->{TOKEN_LIFETIME_HR} = localtime($hash->{TOKEN_LIFETIME});
Log3 $name, 5, "TadoAPI $name" . ": " . "Retrived new authentication token successfully. Valid until " . localtime($hash->{TOKEN_LIFETIME});
$hash->{STATE}="reachable";
}
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "NewTokenRequest: Error while requesting ".$param->{url}." - $err";
}
elsif($data ne "")
{
Log3 $name, 5, "url ".$param->{url}." returned: $data";
my $decoded_data = eval { decode_json($data) };
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "NewTokenRequest: decode_json failed, invalid json. error: $@ ";
}else{
#write token data in file
open(TOKENFILE,">$tokenFileName") or die("ERROR: $!");
print TOKENFILE $data . "\n";
close(TOKENFILE);
# token lifetime management
$hash->{TOKEN_LIFETIME} = gettimeofday() + $decoded_data->{'expires_in'};
$hash->{TOKEN_LIFETIME_HR} = localtime($hash->{TOKEN_LIFETIME});
Log3 $name, 5, "TadoAPI $name" . ": " . "Retrived new authentication token successfully. Valid until " . localtime($hash->{TOKEN_LIFETIME});
$hash->{STATE}="reachable";
}
}
}
sub TadoAPI_TokenRefresh(@) {
my ($hash) = @_;
my $name = $hash->{NAME};
my ($hash) = @_;
my $name = $hash->{NAME};
my $tokenFileName = $tokenFile."_".$name;
Log3 $name, 5, "TadoAPI $name" . ": " . "calling TokenRefresh()";
# load token
eval {
open(TOKENFILE, '<', $hash->{TOKEN_FILE}) or die("ERROR: $!");
$TokenData = decode_json(<TOKENFILE>)};
# load token
eval {
open(TOKENFILE, '<', $hash->{TOKEN_FILE}) or die("ERROR: $!");
$TokenData = decode_json(<TOKENFILE>)};
$data = {
client_id => $client_id,
client_secret => $client_secret,
scope => $scope,
grant_type=>'refresh_token',
refresh_token => $TokenData->{'refresh_token'}
};
$data = {
client_id => $client_id,
client_secret => $client_secret,
scope => $scope,
grant_type=>'refresh_token',
refresh_token => $TokenData->{'refresh_token'}
};
my $param = {
url => $AuthURL,
method => 'POST',
timeout => 5,
hash => $hash,
data => $data
};
my $request = {
url => $AuthURL,
method => 'POST',
timeout => 5,
callback => \&Tado_StoreTokenCallback,
hash => $hash,
data => $data
};
Log3 $name, 5, 'Blocking GET TokenRefresh: ' . Dumper($param);
my ($err, $data) = HttpUtils_BlockingGet($param);
Log3 $name, 3, "TadoAPI $name" . ": " . "Calling refresh token...";
HttpUtils_NonblockingGet($request);
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "TokenRefresh: Error in token retrival while requesting ".$param->{url}." - $err";
$hash->{STATE}="error";
}
elsif($data ne "")
{
Log3 $name, 5, "url ".$param->{url}." returned: $data";
my $decoded_data = eval{decode_json($data);};
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "TokenRefresh: decode_json failed, invalid json. error:$@\n" if $@;
$hash->{STATE}="error";
}else{
#write token data in file
open(TOKENFILE,">$tokenFileName") or die("ERROR: $!");
print TOKENFILE $data . "\n";
close(TOKENFILE);
# token lifetime management
$hash->{TOKEN_LIFETIME} = gettimeofday() + $decoded_data->{'expires_in'};
$hash->{TOKEN_LIFETIME_HR} = localtime($hash->{TOKEN_LIFETIME});
Log3 $name, 5, "TadoAPI $name" . ": " . "TokenRefresh: Refreshed authentication token successfully. Valid until " . localtime($hash->{TOKEN_LIFETIME});
$hash->{STATE}="reachable";
}
}
}
sub TadoAPI_Update(@){
@ -519,7 +546,19 @@ sub TadoAPI_SetZoneOverlayById(@){
if ($setting eq "off"){
$method = "DELETE";
Log3 $name, 3, "TadoAPI $name" . ": " . "Deleting Overlay for Zone $zoneID";
}elsif($setting > 10){
}elsif($setting == 0){
$method = "PUT";
$myjson = {
setting => {
type => "HEATING",
power => "OFF",
},
termination => {
type => "MANUAL"
},
};
$myjson = encode_json($myjson);
}elsif($setting > 0){
$method = "PUT";
$myjson = {
setting => {
@ -540,7 +579,7 @@ sub TadoAPI_SetZoneOverlayById(@){
url => $URL,
header => { "Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}" },
method => $method,
timeout => 3,
timeout => 5,
callback => \&Tado_UpdateZoneOverlayCallback,
hash => $hash,
setting => $setting,
@ -548,8 +587,7 @@ sub TadoAPI_SetZoneOverlayById(@){
data => $myjson
};
#Log3 $name, 3, 'NonBlocking Request: ' . Dumper($request);
Log3 $name, 5, 'NonBlocking Request: ' . Dumper($request);
HttpUtils_NonblockingGet($request);
}
@ -570,44 +608,8 @@ sub TadoAPI_SetAllOverlays(@){
my $myjson ="";
for (my $i=1; $i <= $zonecount; $i++) {
my $URL = $QueryURL . qq{/$homeID/zones/$i/overlay};
if ($setting eq "off"){
$method = "DELETE";
Log3 $name, 3, "TadoAPI $name" . ": " . "Deleting Overlay for Zone $i";
}elsif($setting > 10){
$method = "PUT";
$myjson = {
setting => {
type => "HEATING",
power => "ON",
temperature => {
celsius => $setting
},
},
termination => {
type => "MANUAL"
},
};
$myjson = encode_json($myjson);
}
my $request = {
url => $URL,
header => { "Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}" },
method => $method,
timeout => 10,
callback => \&Tado_UpdateZoneOverlayCallback,
hash => $hash,
setting => $setting,
zoneID => $i,
data => $myjson
};
HttpUtils_NonblockingGet($request);
TadoAPI_SetZoneOverlayById($hash, $i, $setting);
}
# finaly update readings
#TadoAPI_UpdateFn($hash);
}
}
@ -661,6 +663,7 @@ sub TadoAPI_UpdateFn(@){
header => { "Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}" },
method => 'GET',
timeout => 10,
incrementalTimout => 1,
hash => $hash,
callback => \&TadoAPI_UpdateAllZonesCallback
};
@ -668,26 +671,26 @@ sub TadoAPI_UpdateFn(@){
HttpUtils_NonblockingGet($request);
# mobile devices
$TokenData = TadoAPI_LoadToken($hash);
$URL=$QueryURL . qq{/$homeID/mobileDevices};
$request = {
url => $URL,
header => { "Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}" },
method => 'GET',
timeout => 5,
timeout => 6,
incrementalTimout => 1,
callback => \&TadoAPI_UpdateMobileReadingsCallback,
hash => $hash
};
HttpUtils_NonblockingGet($request);
# tado devices
$TokenData = TadoAPI_LoadToken($hash);
$URL=$QueryURL.qq{/$homeID/zones};
$request = {
url => $URL,
header => { "Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}" },
method => 'GET',
timeout => 8,
incrementalTimout => 1,
callback => \&TadoAPI_UpdateTadoDeviceInformationCallback,
hash => $hash
};
@ -758,43 +761,6 @@ sub TadoAPI_callback($){
return undef;
}
sub Tado_StoreTokenCallback($)
{
my ($param, $err, $data) = @_;
my $hash = $param->{hash};
my $name = $hash->{NAME};
my $tokenFileName = $hash->{TOKEN_FILE};
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "StoreTokenCallback: Error in token retrival while requesting ".$param->{url}." - $err";
$hash->{STATE}="error";
}
elsif($data ne "")
{
Log3 $name, 5, "url ".$param->{url}." returned: $data";
my $decoded_data = eval{decode_json($data);};
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "StoreTokenCallback: decode_json failed, invalid json. error:$@\n" if $@;
$hash->{STATE}="error";
}else{
#write token data in file
open(TOKENFILE,">$tokenFileName") or die("ERROR: $!");
print TOKENFILE $data . "\n";
close(TOKENFILE);
# token lifetime management
$hash->{TOKEN_LIFETIME} = gettimeofday() + $decoded_data->{'expires_in'};
$hash->{TOKEN_LIFETIME_HR} = localtime($hash->{TOKEN_LIFETIME});
Log3 $name, 5, "TadoAPI $name" . ": " . "StoreTokenCallback: Refreshed authentication token successfully. Valid until " . localtime($hash->{TOKEN_LIFETIME});
$hash->{STATE}="reachable";
}
}
}
sub Tado_UpdateZoneOverlayCallback($)
{
my ($param, $err, $data) = @_;