From 36c96abaf8a93ac2f6aac18158a1d8f750c053e7 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 10 Mar 2021 18:43:14 +0100 Subject: [PATCH 1/2] add new API URL --- FHEM/73_GardenaSmartBridge.pm | 4 ++-- controls_GardenaSmartDevice.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/FHEM/73_GardenaSmartBridge.pm b/FHEM/73_GardenaSmartBridge.pm index 22e3131..64870e1 100644 --- a/FHEM/73_GardenaSmartBridge.pm +++ b/FHEM/73_GardenaSmartBridge.pm @@ -232,8 +232,8 @@ sub Define { $hash->{BRIDGE} = 1; $hash->{URL} = AttrVal( $name, 'gardenaBaseURL', - 'https://sg-api.dss.husqvarnagroup.net' ) - . '/sg-1'; + 'https://api.smart.gardena.dev' ) + . '/v1'; $hash->{VERSION} = version->parse($VERSION)->normal; $hash->{INTERVAL} = 60; $hash->{NOTIFYDEV} = "global,$name"; diff --git a/controls_GardenaSmartDevice.txt b/controls_GardenaSmartDevice.txt index 888a35a..d788541 100644 --- a/controls_GardenaSmartDevice.txt +++ b/controls_GardenaSmartDevice.txt @@ -1,2 +1,2 @@ -UPD 2021-03-10_18:38:26 43072 FHEM/73_GardenaSmartBridge.pm +UPD 2021-03-10_18:43:05 43062 FHEM/73_GardenaSmartBridge.pm UPD 2020-05-01_22:05:14 45622 FHEM/74_GardenaSmartDevice.pm From a86bb7822af099646b1640a6f0f70e10eb8547f4 Mon Sep 17 00:00:00 2001 From: Sebastian Schwaz Date: Fri, 26 Mar 2021 17:00:44 +0100 Subject: [PATCH 2/2] fix api --- FHEM/73_GardenaSmartBridge.pm | 89 +++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 41 deletions(-) diff --git a/FHEM/73_GardenaSmartBridge.pm b/FHEM/73_GardenaSmartBridge.pm index 64870e1..bd15158 100644 --- a/FHEM/73_GardenaSmartBridge.pm +++ b/FHEM/73_GardenaSmartBridge.pm @@ -28,7 +28,7 @@ # GNU General Public License for more details. # # -# $Id$ +# $Id: 73_GardenaSmartBridge.pm 22957 2020-10-12 07:01:56Z CoolTux $ # ############################################################################### ## @@ -56,7 +56,7 @@ package FHEM::GardenaSmartBridge; use GPUtils qw(GP_Import GP_Export); -# use Data::Dumper; #only for Debugging +#use Data::Dumper; #only for Debugging use strict; use warnings; @@ -232,7 +232,7 @@ sub Define { $hash->{BRIDGE} = 1; $hash->{URL} = AttrVal( $name, 'gardenaBaseURL', - 'https://api.smart.gardena.dev' ) + 'https://smart.gardena.com' ) . '/v1'; $hash->{VERSION} = version->parse($VERSION)->normal; $hash->{INTERVAL} = 60; @@ -315,12 +315,12 @@ sub Attr { } elsif ( $attrName eq 'gardenaBaseURL' ) { if ( $cmd eq 'set' ) { - $hash->{URL} = $attrVal . '/sg-1'; + $hash->{URL} = $attrVal; Log3 $name, 3, "GardenaSmartBridge ($name) - set gardenaBaseURL to: $attrVal"; } elsif ( $cmd eq 'del' ) { - $hash->{URL} = 'https://sg-api.dss.husqvarnagroup.net/sg-1'; + $hash->{URL} = 'https://smart.gardena.com/v1'; } } @@ -470,8 +470,8 @@ sub Write { "GardenaSmartBridge ($name) - Send with URL: $hash->{URL}$uri, HEADER: secret!, DATA: secret!, METHOD: $method" ); -# Log3($name, 3, -# "GardenaSmartBridge ($name) - Send with URL: $hash->{URL}$uri, HEADER: $header, DATA: $payload, METHOD: $method"); + # Log3($name, 3, + # "GardenaSmartBridge ($name) - Send with URL: $hash->{URL}$uri, HEADER: $header, DATA: $payload, METHOD: $method"); return; } @@ -490,6 +490,7 @@ sub ErrorHandling { my $dname = $dhash->{NAME}; + # Log3 $name, 4, Dumper($data); my $decode_json = eval { decode_json($data) }; if ($@) { Log3 $name, 3, "GardenaSmartBridge ($name) - JSON error while request"; @@ -710,12 +711,15 @@ sub ResponseProcessing { } } - # print Dumper $decode_json; + # print Dumper $decode_json; - if ( defined( $decode_json->{sessions} ) && $decode_json->{sessions} ) { + if ( defined( $decode_json->{data} ) && $decode_json->{data} + && ref($decode_json->{data}) eq 'HASH' + && !defined( $hash->{helper}->{user_id})) { - $hash->{helper}{session_id} = $decode_json->{sessions}{token}; - $hash->{helper}{user_id} = $decode_json->{sessions}{user_id}; + $hash->{helper}{session_id} = $decode_json->{data}{id}; + $hash->{helper}{user_id} = $decode_json->{data}{attributes}->{user_id}; + $hash->{helper}{refresh_tokebn} = $decode_json->{data}{attributes}->{refresh_token}; Write( $hash, undef, undef, undef ); Log3 $name, 3, "GardenaSmartBridge ($name) - fetch locations id"; @@ -794,11 +798,6 @@ sub ResponseProcessing { return; } - elsif ( defined($decode_json->{message}) - && $decode_json->{message} ) - { - WriteReadings( $hash, $decode_json ); - } Log3 $name, 3, "GardenaSmartBridge ($name) - no Match for processing data"; @@ -812,15 +811,6 @@ sub WriteReadings { # print Dumper $decode_json; my $name = $hash->{NAME}; - - - if ( defined($decode_json->{message}) - && $decode_json->{message} ) - { - readingsBeginUpdate($hash); - readingsBulkUpdateIfChanged( $hash, 'state', $decode_json->{message} ); - readingsEndUpdate( $hash, 1 ); - } if ( defined( $decode_json->{id} ) && $decode_json->{id} @@ -843,8 +833,7 @@ sub WriteReadings { } readingsBulkUpdateIfChanged( $hash, 'zones', - scalar( @{ $decode_json->{zones} } ) ) - if ( ref($decode_json->{zones}) eq 'ARRAY' ); + scalar( @{ $decode_json->{zones} } ) ); } elsif ($decode_json->{id} ne $hash->{helper}{locations_id} && ref( $decode_json->{abilities} ) eq 'ARRAY' @@ -973,16 +962,28 @@ sub getToken { if ( defined( $hash->{helper}{locations_id} ) && $hash->{helper}{locations_id} ); + # Write( + # $hash, + # '"sessions": {"email": "' + # . AttrVal( $name, 'gardenaAccountEmail', 'none' ) + # . '","password": "' + # . ReadPassword( $hash, $name ) . '"}', + # undef, + # undef + # ); + Write( - $hash, - '"sessions": {"email": "' - . AttrVal( $name, 'gardenaAccountEmail', 'none' ) - . '","password": "' - . ReadPassword( $hash, $name ) . '"}', - undef, - undef - ); + $hash, + '"data": {"type":"token", "attributes":{"username": "' + . AttrVal( $name, 'gardenaAccountEmail', 'none' ) + . '","password": "' + . ReadPassword( $hash, $name ) . '", "client_id":"smartgarden-jwt-client"}}', + undef, + undef + ); +Log3 $name, 4, '"data": {"type":"token", "attributes":{"username": "' . AttrVal( $name, 'gardenaAccountEmail', 'none' ) . '","password": "' + . ReadPassword( $hash, $name ) . '", "client_id":"smartgarden-jwt-client"}}'; Log3 $name, 3, "GardenaSmartBridge ($name) - send credentials to fetch Token and locationId"; @@ -1137,25 +1138,31 @@ sub createHttpValueStrings { my $header = "Content-Type: application/json"; my $uri = ''; my $method = 'POST'; - $header .= "\r\nX-Session: $session_id" - if ( defined( $hash->{helper}{session_id} ) ); + $header .= "\r\nAuthorization: Bearer $session_id" + if ( defined($hash->{helper}{session_id}) ); + $header .= "\r\nAuthorization-Provider: husqvarna" + if ( defined($hash->{helper}{session_id}) ); + + # $header .= "\r\nx-api-key: $session_id" + # if ( defined( $hash->{helper}{session_id} ) ); $payload = '{' . $payload . '}' if ( defined($payload) ); $payload = '{}' if ( !defined($payload) ); if ( $payload eq '{}' ) { $method = 'GET'; - $uri .= '/locations/?user_id=' . $hash->{helper}{user_id} + $payload = ''; + $uri .= '/locations/?locatioId=null&user_id=' . $hash->{helper}{user_id} if ( exists( $hash->{helper}{user_id} ) && !defined( $hash->{helper}{locations_id} ) ); readingsSingleUpdate( $hash, 'state', 'fetch locationId', 1 ) if ( !defined( $hash->{helper}{locations_id} ) ); - $uri .= '/sessions' if ( !defined( $hash->{helper}{session_id} ) ); + $uri .= '/auth/token' if ( !defined( $hash->{helper}{session_id} ) ); $uri .= '/devices' if (!defined($abilities) && defined( $hash->{helper}{locations_id} ) ); } - $uri .= '/sessions' if ( !defined( $hash->{helper}{session_id} ) ); + $uri .= '/auth/token' if ( !defined( $hash->{helper}{session_id} ) ); if ( defined( $hash->{helper}{locations_id} ) ) { if ( defined($abilities) && $abilities eq 'mower_settings' ) { @@ -1391,7 +1398,7 @@ sub DeletePassword { ], "release_status": "stable", "license": "GPL_2", - "version": "v2.0.4", + "version": "v2.1.0", "author": [ "Marko Oldenburg " ],