diff --git a/FHEM/73_GardenaSmartBridge.pm b/FHEM/73_GardenaSmartBridge.pm index 08ea97d..8c6a913 100644 --- a/FHEM/73_GardenaSmartBridge.pm +++ b/FHEM/73_GardenaSmartBridge.pm @@ -57,7 +57,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; @@ -194,6 +194,7 @@ sub Initialize { # Consumer $hash->{SetFn} = \&Set; + $hash->{GetFn} = \&Get; $hash->{DefFn} = \&Define; $hash->{UndefFn} = \&Undef; $hash->{DeleteFn} = \&Delete; @@ -394,6 +395,29 @@ sub Notify { return; } +sub Get { + my $hash = shift // return; + my $aArg = shift // return; + + my $name = shift @$aArg // return; + my $cmd = shift @$aArg + // return qq{"get $name" needs at least one argument}; + + if ( lc $cmd eq 'debug_devices_list' ) { + $hash->{helper}{debug_device_list} = 'get'; + #Log3 $name, 2, Dumper($hash->{helper}); + #Write($hash, undef, undef, undef, undef); + + return 'coming soon'; + } else { + my $list = ""; + $list .= " debug_devices_list:noArg" + if ( AttrVal( $name, "debugJSON", "none") ne "none" ); + + return "Unknown argument $cmd,choose one of $list"; + + } +} sub Set { my $hash = shift // return; @@ -425,11 +449,6 @@ sub Set { StorePassword( $hash, $name, $aArg->[0] ); } - elsif ( lc $cmd eq 'debug_devices_list' ) { - $hash->{helper}{debug_device_list} = 'set'; - Log3 $name, 2, Dumper($hash->{helper}); - Write($hash, undef, undef, undef, undef); - } elsif ( lc $cmd eq 'deleteaccountpassword' ) { return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); @@ -443,8 +462,6 @@ sub Set { if ( not defined( ReadPassword( $hash, $name ) ) ); $list .= " deleteAccountPassword:noArg" if ( defined( ReadPassword( $hash, $name ) ) ); - #$list .= " debug_devices_list:noArg" - # if ( AttrVal( $name, "debugJSON", "none") ne "none" ); return "Unknown argument $cmd, choose one of $list"; } @@ -452,13 +469,13 @@ sub Set { } sub Write { - my ( $hash, $payload, $deviceId, $abilities ) = @_; + my ( $hash, $payload, $deviceId, $abilities, $service_id ) = @_; my $name = $hash->{NAME}; my ( $session_id, $header, $uri, $method ); - ( $payload, $session_id, $header, $uri, $method, $deviceId, $abilities ) = - createHttpValueStrings( $hash, $payload, $deviceId, $abilities ); + ( $payload, $session_id, $header, $uri, $method, $deviceId, $service_id ) = + createHttpValueStrings( $hash, $payload, $deviceId, $abilities, $service_id ); HttpUtils_NonblockingGet( { @@ -498,7 +515,7 @@ sub ErrorHandling { my $dname = $dhash->{NAME}; - Log3 $name, 2, "GardenaSmartBridge ($name) - Request: $data"; + Log3 $name, 4, "GardenaSmartBridge ($name) - Request: $data"; my $decode_json = eval { decode_json($data) }; if ($@) { @@ -756,9 +773,9 @@ sub ResponseProcessing { return; } - elsif ( defined($hash->{helper}{debug_device_list} ) ) + elsif ( exists($hash->{helper}{debug_device_list} ) ) { - Log3 $name, 4, "Debug Devices List"; + Log3 $name, 4, 'Debug Devices List'; my $msg; $msg = "test krams"; @@ -772,7 +789,7 @@ sub ResponseProcessing { } - undef($hash->{helper}{debug_device_list}); + delete $hash->{helper}{debug_device_list}; return $msg; } elsif (defined( $decode_json->{devices} ) @@ -881,9 +898,8 @@ sub WriteReadings { $decode_json->{abilities}[0]{properties}[$properties] {name} . '-' . $t, $v - ) + ) if ($decode_json->{abilities}[0]{properties}[$properties]{name} !~ /ethernet_status|wifi_status/ ); - if ( ( $decode_json->{abilities}[0]{properties} @@ -911,7 +927,7 @@ sub WriteReadings { { #TODO: read valies if bridge connected to wifi readingsBulkUpdateIfChanged( $hash, - 'wifi_status-ssid', $v->{ssid} ) + 'wifi_status-ssid', $v->{ssid} ) if (ref($v->{ssid}) ne 'HASH'); readingsBulkUpdateIfChanged( $hash, 'wifi_status-mac', $v->{mac} ); @@ -1155,7 +1171,7 @@ sub ParseJSON { } sub createHttpValueStrings { - my ( $hash, $payload, $deviceId, $abilities ) = @_; + my ( $hash, $payload, $deviceId, $abilities, $service_id ) = @_; my $session_id = $hash->{helper}{session_id}; my $header = "Content-Type: application/json"; @@ -1192,15 +1208,31 @@ sub createHttpValueStrings { $method = 'PUT'; my $dhash = $modules{GardenaSmartDevice}{defptr}{$deviceId}; + $uri .= '/devices/' . $deviceId . '/settings/' - . $dhash->{helper}{STARTINGPOINTID} + . $service_id if ( defined($abilities) && defined($payload) && $abilities eq 'mower_settings' ); + } # park until next schedules or override + elsif (defined($abilities) + && defined($payload) + && $abilities eq 'mower_timer' ) + { + my $valve_id; + $method = 'PUT'; + + $uri .= + '/devices/' + . $deviceId + . '/abilities/' + . $abilities + . '/properties/mower_timer'; + } elsif (defined($abilities) && defined($payload) @@ -1317,7 +1349,7 @@ sub DeletePassword {
  • longitude - Längengrad des Grundstücks
  • name - Name of your Garden – Default „My Garden“
  • state - State of the Bridge
  • -
  • token - SessionID
  • +
  • token - SessionID


  • @@ -1419,7 +1451,7 @@ sub DeletePassword { ], "release_status": "stable", "license": "GPL_2", - "version": "v2.2.1", + "version": "v2.2.2", "author": [ "Marko Oldenburg " ], diff --git a/FHEM/74_GardenaSmartDevice.pm b/FHEM/74_GardenaSmartDevice.pm index 5412ee3..a60e8e0 100644 --- a/FHEM/74_GardenaSmartDevice.pm +++ b/FHEM/74_GardenaSmartDevice.pm @@ -63,7 +63,7 @@ use POSIX; use FHEM::Meta; use Time::Local; -use Data::Dumper; # only for debugging +#use Data::Dumper; # only for debugging # try to use JSON::MaybeXS wrapper # for chance of better performance + open code @@ -203,9 +203,11 @@ sub Define { my $deviceId = $aArg->[2]; my $category = $aArg->[3]; - $hash->{DEVICEID} = $deviceId; - $hash->{VERSION} = version->parse($VERSION)->normal; - $hash->{helper}{STARTINGPOINTID} = ''; + $hash->{DEVICEID} = $deviceId; + $hash->{VERSION} = version->parse($VERSION)->normal; + $hash->{helper}{STARTINGPOINTID} = ''; + $hash->{helper}{schedules_paused_until_id} = ''; + $hash->{helper}{eco_mode_id} = ''; CommandAttr( undef, "$name IODev $modules{GardenaSmartBridge}{defptr}{BRIDGE}->{NAME}" ) @@ -277,30 +279,53 @@ sub Set { my $payload; my $abilities = ''; - - ### mower + my $service_id = ''; + ### mower + # service_id (eco, parkuntilfurhternotice, startpoints) if ( lc $cmd eq 'parkuntilfurthernotice' ) { $payload = '"name":"park_until_further_notice"'; + if ( ReadingsVal( $name, 'mower_type-mainboard_version', '0.0' ) > '10.30' ) { + $payload = ' "settings":{"name":"schedules_paused_until","value":"2040-12-31T22:00:00.000Z","device":"'.$hash->{DEVICEID}.'"}'; + $abilities = 'mower_settings' ; + $service_id = $hash->{helper}{schedules_paused_until_id}; + } } - elsif ( lc $cmd eq 'parkuntilnexttimer' ) { + elsif ( lc $cmd eq 'parkuntilnexttimer' ) { $payload = '"name":"park_until_next_timer"'; - + if ( ReadingsVal( $name, 'mower_type-mainboard_version', '0.0' ) > '10.30' ){ + $payload = '"properties":{"name":"mower_timer","value":0}' ; + $abilities = 'mower_timer'; + } } elsif ( lc $cmd eq 'startresumeschedule' ) { $payload = '"name":"start_resume_schedule"'; - + if ( ReadingsVal( $name, 'mower_type-mainboard_version', '0.0' ) > '10.30' ) { + $payload = ' "settings":{"name":"schedules_paused_until","value":"","device":"'.$hash->{DEVICEID}.'"}'; + $abilities = 'mower_settings' ; + $service_id = $hash->{helper}{schedules_paused_until_id}; + } } elsif ( lc $cmd eq 'startoverridetimer' ) { $payload = '"name":"start_override_timer","parameters":{"duration":' . $aArg->[0] * 60 . '}'; + if ( ReadingsVal( $name, 'mower_type-mainboard_version', '0.0' ) > '10.30' ){ + $payload = '"properties":{"name":"mower_timer","value":'.$aArg->[0] * 60 .'}'; + $abilities = 'mower_timer'; + } } elsif ( lc $cmd eq 'startpoint' ) { my $err; - ( $err, $payload, $abilities ) = SetPredefinedStartPoints( $hash, $aArg ); + $service_id = $hash->{helper}{STARTINGPOINTID}; return $err if ( defined($err) ); } + elsif ( lc $cmd eq 'eco' ) { + $payload = '"settings": {"name": "eco_mode", "value": '.$aArg->[0].', "device": "'.$hash->{DEVICEID}.'"}'; + $abilities = 'mower_settings' if ( ReadingsVal( $name, 'mower_type-mainboard_version', '0.0' ) > '10.30' ); + $service_id = $hash->{helper}{eco_mode_id}; + #$abilities['service_id'] = $hash->{helper}{SCHEDULESID} if ( ReadingsVal( $name, 'mower_type-mainboard_version', '0.0' ) > '10.30' ); + } ### electronic_pressure_pump elsif ( lc $cmd eq 'pumptimer' ) { $payload = @@ -399,10 +424,10 @@ sub Set { return "Unknown argument $cmd, choose one of $list"; } - + $abilities = 'mower' if ( AttrVal( $name, 'model', 'unknown' ) eq 'mower' ) - && $abilities ne 'mower_settings'; + && ($abilities !~ /mower_settings|mower_timer/); $abilities = 'watering' if ( AttrVal( $name, 'model', 'unknown' ) eq 'ic24' || AttrVal( $name, 'model', 'unknown' ) eq 'watering_computer' ); @@ -414,7 +439,7 @@ sub Set { $hash->{helper}{deviceAction} = $payload; readingsSingleUpdate( $hash, "state", "send command to gardena cloud", 1 ); - IOWrite( $hash, $payload, $hash->{DEVICEID}, $abilities ); + IOWrite( $hash, $payload, $hash->{DEVICEID}, $abilities, $service_id ); Log3 $name, 4, "GardenaSmartBridge ($name) - IOWrite: $payload $hash->{DEVICEID} $abilities IODevHash=$hash->{IODev}"; @@ -573,7 +598,21 @@ sub WriteReadings { } while ( $abilities >= 0 ); do { + #Log3 $name, 1, "Settings pro Device : ".$decode_json->{settings}[$settings]{name}; + #Log3 $name, 1, " - KEIN ARRAY" if ( ref( $decode_json->{settings}[$settings]{value} ) ne "ARRAY"); + #Log3 $name, 1, " - IST ARRAY" if ( ref( $decode_json->{settings}[$settings]{value} ) eq "ARRAY"); + if ( $decode_json->{settings}[$settings]{name} eq 'schedules_paused_until' + || $decode_json->{settings}[$settings]{name} eq 'eco_mode' + ) + { + if ( $hash->{helper}{$decode_json->{settings}[$settings]{name}.'_id'} ne + $decode_json->{settings}[$settings]{id} ) + { + $hash->{helper}{$decode_json->{settings}[$settings]{name}.'_id'} = + $decode_json->{settings}[$settings]{id}; + } + } if ( ref( $decode_json->{settings}[$settings]{value} ) eq "ARRAY" && $decode_json->{settings}[$settings]{name} eq 'starting_points' ) { @@ -883,6 +922,7 @@ sub SetPredefinedStartPoints { $payload = '"settings": ' . encode_json($decode_json_settings); $abilities = 'mower_settings'; + #$abilities['service_id'] = $hash->{helper}{STARTINGPOINTID}; } else { return @@ -1213,7 +1253,7 @@ sub SetPredefinedStartPoints { ], "release_status": "stable", "license": "GPL_2", - "version": "v2.0.3", + "version": "v2.0.4", "author": [ "Marko Oldenburg " ],