From b4c5586ce79d14b3d0df6ba3e4f77a0331efe3e4 Mon Sep 17 00:00:00 2001 From: Philipp Date: Thu, 20 Mar 2025 03:11:11 +0100 Subject: [PATCH] fixed define bug - better error handling if no token or device code set --- 98_TadoAPI.pm | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/98_TadoAPI.pm b/98_TadoAPI.pm index e990cb4..2c96fed 100644 --- a/98_TadoAPI.pm +++ b/98_TadoAPI.pm @@ -104,8 +104,8 @@ sub TadoAPI_Define { my ( $user, $homeID ) = @a; Log3 $name, 3, "TadoAPI_Define $name: called "; - $hash->{STATE} = "defined"; - $hash->{DEF} = "no device_code set"; + + defined $user ? ($hash->{STATE} = "defined") : ($hash->{DEF} = "no_device_code_set"); # Initialize the device return $@ unless ( FHEM::Meta::SetInternals($hash) ); @@ -121,7 +121,7 @@ sub TadoAPI_Define { return TadoAPI_Catch($@) if $@; } - if ( defined($user) && $user ne "no device_code set" ) { + if ( defined($user) && $user ne "no_device_code_set" ) { TadoAPI_CheckStatus($hash); TadoAPI_NewTokenRequest($hash); @@ -140,7 +140,7 @@ sub TadoAPI_Define { } } else { - $hash->{STATE} = "no device_code set"; + $hash->{STATE} = "no_device_code_set"; } return; @@ -494,12 +494,12 @@ sub TadoAPI_RegisterNewDevice { . "RegisterNewDevice: decode_json failed, invalid json. error: $@ "; } else { - Log3 $name, 5, + Log3 $name, 3, "TadoAPI $name" . ": " - . "New Device - Please go to " + . "New Device - Please go to URL: " . $decoded_data->{'verification_uri_complete'}; - $hash->{STATE} = "API-reachable"; + $hash->{STATE} = "OK"; return ($decoded_data->{'verification_uri_complete'}, $decoded_data->{'device_code'}); } @@ -512,9 +512,27 @@ sub TadoAPI_NewTokenRequest { my $name = $hash->{NAME}; my $device_code = $hash->{TADO_USER}; my $tokenFileName = $tokenFile . "_" . $name; + my $Token = undef; Log3 $name, 5, "TadoAPI $name" . ": " . "calling NewTokenRequest()"; + # Check if 'refresh_token' exists or a new token is needed + my $TOKENFILE; + eval { + open( $TOKENFILE, q{<}, $tokenFileName ) or do { + return; + }; + $Token = decode_json(<$TOKENFILE>) }; + close($TOKENFILE); + + if (exists $Token->{'refresh_token'}) { + Log3 $name, 3, "TadoAPI $name" . ": " . "Refresh token exists - OK\n"; + return; + } else { + Log3 $name, 3, "TadoAPI $name" . ": " . "No Refresh token - NewTokenRequest start\n"; + } + + my $data = { client_id => $client_id, device_code => $device_code, @@ -566,7 +584,7 @@ sub TadoAPI_NewTokenRequest { "TadoAPI $name" . ": " . "Retrived new authentication token successfully. Valid until " . localtime( $hash->{TOKEN_LIFETIME} ); - $hash->{STATE} = "API-reachable"; + $hash->{STATE} = "reachable"; # refresh FHEM device TadoAPI_UpdateFn($hash); return $decoded_data; @@ -642,7 +660,7 @@ sub TadoAPI_TokenRefresh { return; } else { #write token data in file - open( my $TOKENFILE, q{>}, $tokenFileName ) or do { + open( $TOKENFILE, q{>}, $tokenFileName ) or do { $apiStatus = 0; $hash->{STATE} = "Token open error"; return; @@ -939,7 +957,7 @@ sub TadoAPI_callback { if ( $param->{code} == 405 || $param->{code} == 400 ) { $apiStatus = 1; - $hash->{STATE} = "API-reachable"; + $hash->{STATE} = "reachable"; Log3 $name, 5, "TadoAPI $name" . ": " . "API is reachable. Callback Status: "