From 78905b02d4bcc1ed647c3ff7d15a8c2a7fa08ebb Mon Sep 17 00:00:00 2001 From: Philipp Date: Wed, 19 Mar 2025 15:25:16 +0100 Subject: [PATCH] initial token creation was missing --- 98_TadoAPI.pm | 98 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 80 insertions(+), 18 deletions(-) diff --git a/98_TadoAPI.pm b/98_TadoAPI.pm index b8b0476..4f7753f 100644 --- a/98_TadoAPI.pm +++ b/98_TadoAPI.pm @@ -58,7 +58,6 @@ my %gets = ( "getZoneDevices" => "noArg", "getZoneInfo" => "noArg", "getGeo" => "", - "getDeviceCode" => "noArg", "getMobileDevices" => "noArg" ); @@ -89,7 +88,7 @@ sub TadoAPI_Init { my @args = split( "[ \t][ \t]*", $def ); my $u = - "wrong syntax: define TadoAPI "; + "wrong syntax: define TadoAPI "; return $u if ( int(@args) < 2 ); return; } @@ -106,6 +105,7 @@ sub TadoAPI_Define { my ( $user, $homeID ) = @a; Log3 $name, 3, "TadoAPI_Define $name: called "; $hash->{STATE} = "defined"; + $hash->{DEF} = "no device_code set"; # Initialize the device return $@ unless ( FHEM::Meta::SetInternals($hash) ); @@ -121,9 +121,9 @@ sub TadoAPI_Define { return TadoAPI_Catch($@) if $@; } - if ( defined($user) ) { + if ( defined($user) && $user ne "no device_code set" ) { TadoAPI_CheckStatus($hash); - TadoAPI_LoadToken($hash); + TadoAPI_NewTokenRequest($hash); # start the status update timer RemoveInternalTimer($hash); @@ -317,16 +317,6 @@ sub TadoAPI_Get { last; }; - # only for testing - $cmd eq "getXTest" and do { - Log3 $name, 5, "TadoAPI $name" . ": " . "processing ($cmd)"; - my $zoneName = TadoAPI_GetZoneNameById( $hash, $value ); - $zoneName = "wrong Zone ID" unless $zoneName; - $message = "Name: " . $zoneName; - Log3 $name, 3, "TadoAPI $name" . ": " . "$cmd finished\n"; - last; - }; - $cmd eq "getZoneDevices" and do { Log3 $name, 3, "TadoAPI $name" . ": " . "processing ($cmd)"; my @devArr = TadoAPI_GetTadoDevices($hash); @@ -468,8 +458,8 @@ sub TadoAPI_LoadToken { sub TadoAPI_RegisterNewDevice { my $hash = shift; my $name = $hash->{NAME}; - my $device_code = $hash->{TADO_USER}; my $tokenFileName = $tokenFile . "_" . $name; + my $data = { client_id => $client_id, @@ -497,7 +487,7 @@ sub TadoAPI_RegisterNewDevice { . " - $err"; } elsif ( $returnData ne "" ) { - Log3 $name, 5, "url " . $param->{url} . " - returned: $returnData"; + Log3 $name, 5, "Device registration URL: " . $param->{url} . " - returned: $returnData"; my $decoded_data = eval { decode_json($returnData) }; if ($@) { Log3 $name, 3, "TadoAPI $name" . ": " @@ -516,6 +506,76 @@ sub TadoAPI_RegisterNewDevice { return; } +sub TadoAPI_NewTokenRequest { + my $hash = shift; + my $name = $hash->{NAME}; + my $device_code = $hash->{TADO_USER}; + my $tokenFileName = $tokenFile . "_" . $name; + + Log3 $name, 5, "TadoAPI $name" . ": " . "calling NewTokenRequest()"; + + my $data = { + client_id => $client_id, + device_code => $device_code, + grant_type => 'urn:ietf:params:oauth:grant-type:device_code' + }; + + my $param = { + url => $AuthURL, + method => 'POST', + timeout => 5, + hash => $hash, + data => $data + }; + + #Log3 $name, 5, 'Blocking GET: ' . Dumper($param); + Log3 $name, $reqDebug, "TadoAPI $name" . ": " . "Request NEW Token from: $AuthURL"; + my ( $err, $returnData ) = HttpUtils_BlockingGet($param); + + if ( $err ne "" ) { + Log3 $name, 3, + "TadoAPI $name" . ": " + . "NewTokenRequest: Error while requesting " + . $param->{url} + . " - $err"; + } + elsif ( $returnData ne "" ) { + Log3 $name, 5, "url " . $param->{url} . " returned: $returnData"; + my $decoded_data = eval { decode_json($returnData) }; + if ($@) { + Log3 $name, 3, "TadoAPI $name" . ": " + . "NewTokenRequest: decode_json failed, invalid json. error: $@ "; + } + else { + #write token data in file + open( my $TOKENFILE, q{>}, $tokenFileName ) or do { + $apiStatus = 0; + $hash->{STATE} = "Token error"; + return; + }; + print $TOKENFILE $returnData . "\n"; + close($TOKENFILE); + + # token lifetime management + if ( defined($decoded_data->{'expires_in'}) ){ + $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"; + # refresh FHEM device + TadoAPI_UpdateFn($hash); + return $decoded_data; + } + } + return; +} + + + sub TadoAPI_TokenRefresh { my $hash = shift; @@ -534,6 +594,8 @@ sub TadoAPI_TokenRefresh { $Token = decode_json(<$TOKENFILE>) }; close($TOKENFILE); + + my $data = { client_id => $client_id, scope => $scope, @@ -581,7 +643,7 @@ sub TadoAPI_TokenRefresh { #write token data in file open( my $TOKENFILE, q{>}, $tokenFileName ) or do { $apiStatus = 0; - $hash->{STATE} = "Token error"; + $hash->{STATE} = "Token open error"; return; }; print $TOKENFILE $returnData . "\n"; @@ -871,7 +933,7 @@ sub TadoAPI_callback { my $hash = $param->{hash}; my $name = $hash->{NAME}; - + $param->{code} = 0 unless defined $param->{code}; if ( $param->{code} == 405 || $param->{code} == 400 ) {