From 78d6e34d2ced56ca0060fde29a4b44fd0393976b Mon Sep 17 00:00:00 2001 From: moises Date: Thu, 13 Jun 2024 10:50:20 +0000 Subject: [PATCH] 38_netatmo: improved disconnect handling on auth failure git-svn-id: https://svn.fhem.de/fhem/trunk@28966 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/38_netatmo.pm | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/fhem/FHEM/38_netatmo.pm b/fhem/FHEM/38_netatmo.pm index 88e9d55e1..ac84b3847 100644 --- a/fhem/FHEM/38_netatmo.pm +++ b/fhem/FHEM/38_netatmo.pm @@ -822,7 +822,7 @@ netatmo_refreshToken($;$) if( defined($hash->{access_token}) && defined($hash->{expires_at}) ) { my ($seconds) = gettimeofday(); - return undef if( $seconds < $hash->{expires_at} - 300 ); + return undef if( $seconds < $hash->{expires_at} - 600 ); } Log3 $name, 3, "$name: refreshing token"; @@ -842,6 +842,7 @@ netatmo_refreshToken($;$) } if( !$hash->{helper}{refresh_token} ) { + Log3 $name, 1, "$name: No refresh token found"; netatmo_getToken($hash); return undef; } @@ -1085,6 +1086,7 @@ netatmo_parseDev($$$) my ($param,$err,$data) = @_; my $hash = $param->{hash}; my $name = $hash->{NAME}; + my $iohash = $hash->{IODev}; my $json = eval { JSON->new->utf8(0)->decode($data) }; if($@) @@ -1096,6 +1098,9 @@ netatmo_parseDev($$$) my $found = 0; if( ref($json) eq "HASH" && $json->{error} ){ Log3 $name, 2, "$name: dev hash error: ".Dumper($json->{error}); + if($json->{error} =~ /Access token expired/){ + netatmo_refreshAppToken( $iohash, defined($iohash->{access_token_app}) ); + } return undef; } elsif ( ref($json) ne "HASH" ){ Log3 $name, 2, "$name: dev hash json error: ".Dumper($json); @@ -2724,6 +2729,13 @@ netatmo_poll($) return undef; } + my $iohash = $hash->{IODev}; + my $ioname = $iohash->{NAME}; + if(defined($ioname) && IsDisabled($ioname)) { + return undef; + } + + # my $resolve = inet_aton($hash->{helper}{apiserver}); # if(!defined($resolve)) # { @@ -2903,10 +2915,11 @@ netatmo_dispatch($$$) $hash->{status} = $json->{error}; Log3 $name, 2, "$name: json message error: ".$json->{error}; readingsSingleUpdate( $hash, "active", $hash->{status}, 1 ) if($hash->{status} ne "no data"); - if($json->{error} eq "invalid_grant"){ + if($param->{type} eq "token" && $json->{error} eq "invalid_grant"){ $hash->{status} = "error"; $hash->{network} = "disconnected" if($hash->{SUBTYPE} eq "ACCOUNT"); - delete($hash->{refresh_token}); + $attr{$name}{disable} = "1" if($hash->{SUBTYPE} eq "ACCOUNT"); + Log3 $name, 2, "$name: invalid refresh ticket, disabling module"; } return undef; } @@ -3329,7 +3342,7 @@ netatmo_parseToken($$) my $name = $hash->{NAME}; my $had_token = $hash->{access_token}; - my $old_refresh = $hash->{refresh_token}; + my $old_refresh = $hash->{helper}{refresh_token}; if( $json->{access_token} ) { $hash->{access_token} = $json->{access_token}; @@ -3354,13 +3367,14 @@ netatmo_parseToken($$) } netatmo_getDevices($hash) if( !$had_token ); - + RemoveInternalTimer($hash, "netatmo_refreshTokenTimer"); InternalTimer($hash->{expires_at}, "netatmo_refreshTokenTimer", $hash); } else { $hash->{expires_at} = int(gettimeofday()); $hash->{STATE} = "Error" if( !$hash->{access_token} ); Log3 $name, 1, "$name: token error ".Dumper($json); - InternalTimer(gettimeofday()+600, "netatmo_refreshTokenTimer", $hash); + RemoveInternalTimer($hash, "netatmo_refreshTokenTimer"); + InternalTimer(gettimeofday()+300, "netatmo_refreshTokenTimer", $hash); } } @@ -3378,12 +3392,14 @@ netatmo_parseAppToken($$) $hash->{expires_at_app} = int(gettimeofday()); $hash->{expires_at_app} += int($json->{expires_in}*0.8); + RemoveInternalTimer($hash, "netatmo_refreshAppTokenTimer"); InternalTimer($hash->{expires_at_app}, "netatmo_refreshAppTokenTimer", $hash); } else { $hash->{expires_at_app} = int(gettimeofday()); $hash->{STATE} = "Error" if( !$hash->{access_token_app} ); Log3 $name, 1, "$name: app token error ".Dumper($json); - InternalTimer(gettimeofday()+600, "netatmo_refreshAppTokenTimer", $hash); + RemoveInternalTimer($hash, "netatmo_refreshAppTokenTimer"); + InternalTimer(gettimeofday()+300, "netatmo_refreshAppTokenTimer", $hash); } } @@ -6755,7 +6771,7 @@ sub netatmo_weatherIcon() Notes: