initial token creation was missing

This commit is contained in:
Philipp Wo 2025-03-19 15:25:16 +01:00
parent fecb5a1fa0
commit 78905b02d4

View File

@ -58,7 +58,6 @@ my %gets = (
"getZoneDevices" => "noArg", "getZoneDevices" => "noArg",
"getZoneInfo" => "noArg", "getZoneInfo" => "noArg",
"getGeo" => "", "getGeo" => "",
"getDeviceCode" => "noArg", "getDeviceCode" => "noArg",
"getMobileDevices" => "noArg" "getMobileDevices" => "noArg"
); );
@ -89,7 +88,7 @@ sub TadoAPI_Init {
my @args = split( "[ \t][ \t]*", $def ); my @args = split( "[ \t][ \t]*", $def );
my $u = my $u =
"wrong syntax: define <name> TadoAPI <username>"; "wrong syntax: define <name> TadoAPI <device_code>";
return $u if ( int(@args) < 2 ); return $u if ( int(@args) < 2 );
return; return;
} }
@ -106,6 +105,7 @@ sub TadoAPI_Define {
my ( $user, $homeID ) = @a; my ( $user, $homeID ) = @a;
Log3 $name, 3, "TadoAPI_Define $name: called "; Log3 $name, 3, "TadoAPI_Define $name: called ";
$hash->{STATE} = "defined"; $hash->{STATE} = "defined";
$hash->{DEF} = "no device_code set";
# Initialize the device # Initialize the device
return $@ unless ( FHEM::Meta::SetInternals($hash) ); return $@ unless ( FHEM::Meta::SetInternals($hash) );
@ -121,9 +121,9 @@ sub TadoAPI_Define {
return TadoAPI_Catch($@) if $@; return TadoAPI_Catch($@) if $@;
} }
if ( defined($user) ) { if ( defined($user) && $user ne "no device_code set" ) {
TadoAPI_CheckStatus($hash); TadoAPI_CheckStatus($hash);
TadoAPI_LoadToken($hash); TadoAPI_NewTokenRequest($hash);
# start the status update timer # start the status update timer
RemoveInternalTimer($hash); RemoveInternalTimer($hash);
@ -317,16 +317,6 @@ sub TadoAPI_Get {
last; 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 { $cmd eq "getZoneDevices" and do {
Log3 $name, 3, "TadoAPI $name" . ": " . "processing ($cmd)"; Log3 $name, 3, "TadoAPI $name" . ": " . "processing ($cmd)";
my @devArr = TadoAPI_GetTadoDevices($hash); my @devArr = TadoAPI_GetTadoDevices($hash);
@ -468,8 +458,8 @@ sub TadoAPI_LoadToken {
sub TadoAPI_RegisterNewDevice { sub TadoAPI_RegisterNewDevice {
my $hash = shift; my $hash = shift;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $device_code = $hash->{TADO_USER};
my $tokenFileName = $tokenFile . "_" . $name; my $tokenFileName = $tokenFile . "_" . $name;
my $data = { my $data = {
client_id => $client_id, client_id => $client_id,
@ -497,7 +487,7 @@ sub TadoAPI_RegisterNewDevice {
. " - $err"; . " - $err";
} }
elsif ( $returnData ne "" ) { 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) }; my $decoded_data = eval { decode_json($returnData) };
if ($@) { if ($@) {
Log3 $name, 3, "TadoAPI $name" . ": " Log3 $name, 3, "TadoAPI $name" . ": "
@ -516,6 +506,76 @@ sub TadoAPI_RegisterNewDevice {
return; 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 { sub TadoAPI_TokenRefresh {
my $hash = shift; my $hash = shift;
@ -534,6 +594,8 @@ sub TadoAPI_TokenRefresh {
$Token = decode_json(<$TOKENFILE>) }; $Token = decode_json(<$TOKENFILE>) };
close($TOKENFILE); close($TOKENFILE);
my $data = { my $data = {
client_id => $client_id, client_id => $client_id,
scope => $scope, scope => $scope,
@ -581,7 +643,7 @@ sub TadoAPI_TokenRefresh {
#write token data in file #write token data in file
open( my $TOKENFILE, q{>}, $tokenFileName ) or do { open( my $TOKENFILE, q{>}, $tokenFileName ) or do {
$apiStatus = 0; $apiStatus = 0;
$hash->{STATE} = "Token error"; $hash->{STATE} = "Token open error";
return; return;
}; };
print $TOKENFILE $returnData . "\n"; print $TOKENFILE $returnData . "\n";
@ -871,7 +933,7 @@ sub TadoAPI_callback {
my $hash = $param->{hash}; my $hash = $param->{hash};
my $name = $hash->{NAME}; my $name = $hash->{NAME};
$param->{code} = 0 unless defined $param->{code}; $param->{code} = 0 unless defined $param->{code};
if ( $param->{code} == 405 || $param->{code} == 400 ) { if ( $param->{code} == 405 || $param->{code} == 400 ) {