no homeID for define required

This commit is contained in:
Philipp Wo 2019-11-20 06:13:26 +01:00
parent de68eebfc0
commit 5f35ab1c38
2 changed files with 76 additions and 30 deletions

View File

@ -45,9 +45,10 @@ my $debug = 0;
my $header = {};
my $data = {};
my $TokenData = {};
# helpers
my $apiStatus = 1;
my $tokenLock = 0;
#####################################
#Request data for HTTP Request & Response
@ -110,10 +111,10 @@ sub TadoAPI_Define($$)
my $tokenFileName = $tokenFile."_".$name;
return "Invalid number of arguments: "
. "define <name> TadoAPI <username> <homeID> [<mobileID>]"
if ( int(@a) < 2 );
. "define <name> TadoAPI <username> [<homeID>]"
if ( int(@a) < 1 );
my ( $user, $homeID, $mobileID ) = @a;
my ( $user, $homeID ) = @a;
Log3 $name, 3, "TadoAPI_Define $name: called ";
$hash->{STATE}="defined";
@ -123,15 +124,7 @@ sub TadoAPI_Define($$)
$hash->{TADO_USER} = $user;
$hash->{TOKEN_FILE} = $tokenFileName;
if ( defined($homeID) && $homeID ne "" ) {
$attr{$name}{homeID} = $homeID;
}
if ( defined($mobileID) && $mobileID ne "" ) {
$main::attr{$a[0]}{"mobileID"}= $mobileID;
}
my @args = ($homeID, $mobileID);
my @args = ($homeID);
if ($main::init_done) {
# do something?
@ -139,10 +132,21 @@ sub TadoAPI_Define($$)
return TadoAPI_Catch($@) if $@;
}
TadoAPI_LoadToken($hash);
# start the status update timer
RemoveInternalTimer($hash);
InternalTimer( gettimeofday() + 10, "TadoAPI_Update", $hash, 0 );
if ( defined($homeID) && $homeID ne "" ) {
$attr{$name}{homeID} = $homeID;
} else{
my $id = TadoAPI_GetHomeId($hash);
if ( defined($id) && $id ne "" ) {
$attr{$name}{homeID} = $id;
}
}
return undef;
}
@ -284,7 +288,7 @@ sub TadoAPI_Get(@) {
$cmd eq "getXTest" and do {
Log3 $name, 3, "TadoAPI $name" . ": " . "processing ($cmd)" if $debug;
TadoAPI_ZoneRequest($hash);
TadoAPI_GetHomeId($hash);
Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n";
last;
};
@ -408,20 +412,24 @@ sub TadoAPI_LoadToken(@){
open(TOKENFILE, '<', $tokenFileName) or die("ERROR: $!");
$Token = decode_json(<TOKENFILE>)};
if($@ || $tokenLifeTime < gettimeofday()){
Log3 $name, 3, "TadoAPI $name" . ": " . "Error while loading: $@" if $debug && $@;
Log3 $name, 3, "TadoAPI $name" . ": " . "Token expired, requesting new one" if $debug && $tokenLifeTime < gettimeofday();
TadoAPI_NewTokenRequest($hash);
}else{
Log3 $name, 3, "TadoAPI $name" . ": " . "Token expires at " . localtime($tokenLifeTime) if $debug;
# if token is about to expire, refresh him
if (($tokenLifeTime-15) < gettimeofday()){
Log3 $name, 3, "TadoAPI $name" . ": " . "Token will expire soon, refreshing" if $debug;
TadoAPI_TokenRefresh($hash);
if (!$tokenLock){
$tokenLock = 1;
if($@ || $tokenLifeTime < gettimeofday()){
Log3 $name, 3, "TadoAPI $name" . ": " . "Error while loading: $@" if $debug && $@;
Log3 $name, 3, "TadoAPI $name" . ": " . "Token expired, requesting new one" if $debug && $tokenLifeTime < gettimeofday();
TadoAPI_NewTokenRequest($hash);
}else{
Log3 $name, 3, "TadoAPI $name" . ": " . "Token expires at " . localtime($tokenLifeTime) if $debug;
# if token is about to expire, refresh him
if (($tokenLifeTime-15) < gettimeofday()){
Log3 $name, 3, "TadoAPI $name" . ": " . "Token will expire soon, refreshing" if $debug;
TadoAPI_TokenRefresh($hash);
}
}
close(TOKENFILE);
$tokenLock = 0;
return $Token;
}
close(TOKENFILE);
return $Token;
}
return undef;
}
@ -452,7 +460,7 @@ sub TadoAPI_NewTokenRequest(@) {
hash => $hash,
data => $data
};
Log3 $name, 3, "TadoAPI $name" . ": " . "Calling new token...";
HttpUtils_NonblockingGet($request);
}
@ -485,6 +493,7 @@ sub TadoAPI_TokenRefresh(@) {
data => $data
};
Log3 $name, 3, "TadoAPI $name" . ": " . "Calling refresh token...";
HttpUtils_NonblockingGet($request);
}
@ -531,7 +540,7 @@ sub Tado_StoreTokenCallback($)
# token lifetime management
$hash->{TOKEN_LIFETIME} = gettimeofday() + $TokenData->{'expires_in'};
$hash->{TOKEN_LIFETIME_HR} = localtime($hash->{TOKEN_LIFETIME});
Log3 $name, 3, "TadoAPI $name" . ": " . "Retrived new authentication token successfully. Valid until " . localtime($hash->{TOKEN_LIFETIME}); #if $debug;
Log3 $name, 3, "TadoAPI $name" . ": " . "Retrived new authentication token successfully. Valid until " . localtime($hash->{TOKEN_LIFETIME})if $debug;
$hash->{STATE}="reachable";
}
}
@ -1072,6 +1081,43 @@ sub TadoAPI_ReplaceUmlaute(@) {
return $string;
}
sub TadoAPI_GetHomeId(@){
# returns first home id only
my ($hash) = @_;
my $name = $hash->{NAME};
my $TokenData = TadoAPI_LoadToken($hash);
if(defined($TokenData))
{
my $param = {
url => $DataURL,
header => {"Content-Type"=>"application/json;charset=UTF-8","Authorization" => "$TokenData->{'token_type'} $TokenData->{'access_token'}"},
method => 'GET',
timeout => 2,
hash => $hash,
};
Log3 $name, 3, 'Blocking GET: ' . Dumper($param) if $debug;
my ($err, $data) = HttpUtils_BlockingGet($param);
if($err ne "")
{
Log3 $name, 3, "TadoAPI $name" . ": " . "GetHomeId: Error while requesting ".$param->{url}." - $err";
}
elsif($data ne "")
{
Log3 $name, 3, "url ".$param->{url}." returned: $data" if $debug;
my $decoded_data = eval { decode_json($data) };
if ($@){
Log3 $name, 3, "TadoAPI $name" . ": " . "GetHomeId: decode_json failed, invalid json. error:$@\n";
}else{
my $homes = $decoded_data->{'homes'};
return @$homes[0]->{'id'};
}
}
}
return undef;
}
sub TadoAPI_GetZoneCount(@) {
my ($hash) = @_;

View File

@ -18,7 +18,7 @@ Bin unter philipp@wolfmajer.at erreichbar.
In FHEM wird das Modul folgendermaßen definiert:
`define <name> TadoAPI <username> <homeID> [<mobileID>]`
`define <name> TadoAPI <username> [<homeID>]`
Das Passwort muss mit dem `set <name> <password>` Befehl (z.B. set myTado password 12345) gesetzt werden.