diff --git a/73_GardenaSmartBridge.pm b/FHEM/73_GardenaSmartBridge.pm similarity index 94% rename from 73_GardenaSmartBridge.pm rename to FHEM/73_GardenaSmartBridge.pm index df1431c..bd15158 100644 --- a/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,8 +232,8 @@ sub Define { $hash->{BRIDGE} = 1; $hash->{URL} = AttrVal( $name, 'gardenaBaseURL', - 'https://sg-api.dss.husqvarnagroup.net' ) - . '/sg-1'; + 'https://smart.gardena.com' ) + . '/v1'; $hash->{VERSION} = version->parse($VERSION)->normal; $hash->{INTERVAL} = 60; $hash->{NOTIFYDEV} = "global,$name"; @@ -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"; @@ -958,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"; @@ -1122,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' ) { @@ -1376,7 +1398,7 @@ sub DeletePassword { ], "release_status": "stable", "license": "GPL_2", - "version": "v2.0.3", + "version": "v2.1.0", "author": [ "Marko Oldenburg " ], diff --git a/74_GardenaSmartDevice.pm b/FHEM/74_GardenaSmartDevice.pm similarity index 100% rename from 74_GardenaSmartDevice.pm rename to FHEM/74_GardenaSmartDevice.pm diff --git a/controls_GardenaSmartDevice.txt b/controls_GardenaSmartDevice.txt new file mode 100644 index 0000000..d788541 --- /dev/null +++ b/controls_GardenaSmartDevice.txt @@ -0,0 +1,2 @@ +UPD 2021-03-10_18:43:05 43062 FHEM/73_GardenaSmartBridge.pm +UPD 2020-05-01_22:05:14 45622 FHEM/74_GardenaSmartDevice.pm diff --git a/hooks/pre-commit b/hooks/pre-commit new file mode 100755 index 0000000..deda783 --- /dev/null +++ b/hooks/pre-commit @@ -0,0 +1,40 @@ +#!/usr/bin/perl -w + +use File::Basename; +use POSIX qw(strftime); +use strict; + +my @filenames = ( + 'FHEM/73_GardenaSmartBridge.pm', + 'FHEM/74_GardenaSmartDevice.pm', +); + +my $controlsfile = 'controls_GardenaSmartDevice.txt'; + +open(FH, ">$controlsfile") || return("Can't open $controlsfile: $!"); + +for my $filename (@filenames) { + my @statOutput = stat($filename); + + if (scalar @statOutput != 13) { + printf 'error: stat has unexpected return value for ' . $filename . "\n"; + next; + } + + my $mtime = $statOutput[9]; + my $date = POSIX::strftime("%Y-%m-%d", localtime($mtime)); + my $time = POSIX::strftime("%H:%M:%S", localtime($mtime)); + my $filetime = $date."_".$time; + + my $filesize = $statOutput[7]; + + printf FH 'UPD ' . $filetime . ' ' . $filesize . ' ' .$filename . "\n"; +} + +close(FH); + +system("git add $controlsfile"); + +print 'Create controls File succesfully' . "\n"; + +exit 0;