From d38e26c8e0d7317aea9913fac598ff3cd8093724 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 20 Apr 2021 21:41:01 +0200 Subject: [PATCH 01/15] change password storage to new Password Util package --- FHEM/46_TeslaPowerwall2AC.pm | 36 ++-- controls_TeslaPowerwall2AC.txt | 4 +- lib/FHEM/Tesla/Powerwall.pm | 295 +++++++++++++++++---------------- 3 files changed, 171 insertions(+), 164 deletions(-) diff --git a/FHEM/46_TeslaPowerwall2AC.pm b/FHEM/46_TeslaPowerwall2AC.pm index 7518b7f..2bc96e5 100644 --- a/FHEM/46_TeslaPowerwall2AC.pm +++ b/FHEM/46_TeslaPowerwall2AC.pm @@ -57,47 +57,39 @@ package FHEM::TeslaPowerwall2AC; use strict; use warnings; use FHEM::Meta; -use GPUtils qw(GP_Import GP_Export); +use GPUtils qw(GP_Export); require FHEM::Tesla::Powerwall; -## Import der FHEM Funktionen #-- Run before package compilation BEGIN { - # Import from main context - GP_Import( + #-- Export to main context with different name + GP_Export( qw( - readingFnAttributes - ) + Initialize + ) ); } -#-- Export to main context with different name -GP_Export( - qw( - Initialize - ) -); - sub Initialize { my $hash = shift; - $hash->{GetFn} = 'FHEM::Tesla::Powerwall::Get'; - $hash->{SetFn} = 'FHEM::Tesla::Powerwall::Set'; - $hash->{DefFn} = 'FHEM::Tesla::Powerwall::Define'; - $hash->{UndefFn} = 'FHEM::Tesla::Powerwall::Undef'; - $hash->{NotifyFn} = 'FHEM::Tesla::Powerwall::Notify'; - $hash->{RenameFn} = 'FHEM::Tesla::Powerwall::Rename'; + $hash->{GetFn} = \&FHEM::Tesla::Powerwall::Get; + $hash->{SetFn} = \&FHEM::Tesla::Powerwall::Set; + $hash->{DefFn} = \&FHEM::Tesla::Powerwall::Define; + $hash->{UndefFn} = \&FHEM::Tesla::Powerwall::Undef; + $hash->{NotifyFn} = \&FHEM::Tesla::Powerwall::Notify; + $hash->{RenameFn} = \&FHEM::Tesla::Powerwall::Rename; - $hash->{AttrFn} = 'FHEM::Tesla::Powerwall::Attr'; + $hash->{AttrFn} = \&FHEM::Tesla::Powerwall::Attr; $hash->{AttrList} = 'interval ' . 'disable:1 ' . 'devel:1 ' . 'emailaddr ' - . $readingFnAttributes; + . $::readingFnAttributes; $hash->{parseParams} = 1; @@ -207,7 +199,7 @@ sub Initialize { ], "release_status": "stable", "license": "GPL_2", - "version": "v1.2.0", + "version": "v1.2.1", "author": [ "Marko Oldenburg " ], diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index 0c5bff4..6db2de3 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1,2 +1,2 @@ -UPD 2021-03-27_18:40:42 6992 FHEM/46_TeslaPowerwall2AC.pm -UPD 2021-03-27_23:17:06 28859 lib/FHEM/Tesla/Powerwall.pm +UPD 2021-04-20_21:40:31 6866 FHEM/46_TeslaPowerwall2AC.pm +UPD 2021-04-20_21:40:44 30162 lib/FHEM/Tesla/Powerwall.pm diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Tesla/Powerwall.pm index 801528e..4b8f709 100644 --- a/lib/FHEM/Tesla/Powerwall.pm +++ b/lib/FHEM/Tesla/Powerwall.pm @@ -30,9 +30,9 @@ # $data = eval{decode_json($data)}; # # if($@){ -# Log3($SELF, 2, "$TYPE ($SELF) - error while request: $@"); +# ::Log3($SELF, 2, "$TYPE ($SELF) - error while request: $@"); # -# readingsSingleUpdate($hash, "state", "error", 1); +# ::readingsSingleUpdate($hash, "state", "error", 1); # # return; # } @@ -56,8 +56,10 @@ package FHEM::Tesla::Powerwall; use strict; use warnings; -use GPUtils qw(GP_Import GP_Export); +use GPUtils qw(GP_Export); use HttpUtils; +use FHEM::Core::Password::Utils qw(:ALL); + use Data::Dumper; # try to use JSON::MaybeXS wrapper @@ -135,30 +137,13 @@ if ($@) { #-- Run before package compilation BEGIN { - # Import from main context - GP_Import( + #-- Export to main context with different name + GP_Export( qw( - readingsSingleUpdate - readingsBulkUpdate - readingsBulkUpdateIfChanged - readingsBeginUpdate - readingsEndUpdate - setKeyValue - getKeyValue - getUniqueId - CommandAttr - defs - Log3 - readingFnAttributes - HttpUtils_NonblockingGet - AttrVal - ReadingsVal - IsDisabled - deviceEvents - init_done - gettimeofday - InternalTimer - RemoveInternalTimer) + Initialize + Timer_GetData + Write + ) ); } @@ -209,11 +194,31 @@ sub Define { $hash->{NOTIFYDEV} = qq(global,${name}); $hash->{actionQueue} = []; - CommandAttr( undef, $name . q{ room Tesla} ) - if ( AttrVal( $name, 'room', 'none' ) eq 'none' ); - Log3($name, 3, + ::CommandAttr( undef, $name . q{ room Tesla} ) + if ( ::AttrVal( $name, 'room', 'none' ) eq 'none' ); + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - defined TeslaPowerwall2AC Device with Host ${host} and Interval $hash->{INTERVAL})); + ### create password object to handle pass keystore + $hash->{helper}->{passObj} = FHEM::Core::Password::Utils->new(); + + if ( defined( ReadPassword( $hash, $name ) ) ) { + my ($passResp,$passErr); + ($passResp,$passErr) = $hash->{helper}->{passObj}->setStorePassword($name,ReadPassword( $hash, $name )); + + ::Log3($name, 1, +qq(TeslaPowerwall2AC \(${name}\) - error while saving the password - $passErr) + if ( !defined($passResp) + and defined($passErr) ); + + ::Log3($name, 1, +qq(TeslaPowerwall2AC \(${name}\) - password successfully saved) + if ( defined($passResp) + and !defined($passErr) ); + + DeletePassword($hash); + } + return; } @@ -221,25 +226,25 @@ sub Undef { my $hash = shift; my $name = shift; - RemoveInternalTimer($hash); - Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - Device ${name} deleted)); + ::RemoveInternalTimer($hash); + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - Device ${name} deleted)); return; } sub Attr { my ( $cmd, $name, $attrName, $attrVal ) = @_; - my $hash = $defs{$name}; + my $hash = $$::defs{$name}; if ( $attrName eq 'disable' ) { if ( $cmd eq 'set' && $attrVal eq '1' ) { - RemoveInternalTimer($hash); - readingsSingleUpdate( $hash, 'state', 'disabled', 1 ); - Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - disabled)); + ::RemoveInternalTimer($hash); + ::readingsSingleUpdate( $hash, 'state', 'disabled', 1 ); + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - disabled)); } elsif ( $cmd eq 'del' ) { - Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - enabled)); + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - enabled)); } } @@ -248,37 +253,37 @@ sub Attr { return 'check disabledForIntervals Syntax HH:MM-HH:MM or \'HH:MM-HH:MM HH:MM-HH:MM ...\'' unless ( $attrVal =~ /^((\d{2}:\d{2})-(\d{2}:\d{2})\s?)+$/ ); - Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - disabledForIntervals)); - readingsSingleUpdate( $hash, 'state', 'disabled', 1 ); + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - disabledForIntervals)); + ::readingsSingleUpdate( $hash, 'state', 'disabled', 1 ); } elsif ( $cmd eq 'del' ) { - Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - enabled)); - readingsSingleUpdate( $hash, 'state', 'active', 1 ); + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - enabled)); + ::readingsSingleUpdate( $hash, 'state', 'active', 1 ); } } if ( $attrName eq 'interval' ) { if ( $cmd eq 'set' ) { if ( $attrVal < 60 ) { - Log3($name, 3, + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - interval too small, please use something >= 60 (sec), default is 300 (sec))); return q{interval too small, please use something >= 60 (sec), default is 300 (sec)}; } else { - RemoveInternalTimer($hash); + ::RemoveInternalTimer($hash); $hash->{INTERVAL} = $attrVal; - Log3($name, 3, + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - set interval to ${attrVal})); Timer_GetData($hash); } } elsif ( $cmd eq 'del' ) { - RemoveInternalTimer($hash); + ::RemoveInternalTimer($hash); $hash->{INTERVAL} = 300; - Log3($name, 3, + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - set interval to default)); Timer_GetData($hash); } @@ -292,11 +297,11 @@ sub Notify { my $dev = shift; my $name = $hash->{NAME}; - return if ( IsDisabled($name) ); + return if ( ::IsDisabled($name) ); my $devname = $dev->{NAME}; my $devtype = $dev->{TYPE}; - my $events = deviceEvents( $dev, 1 ); + my $events = ::deviceEvents( $dev, 1 ); return if ( !$events ); Timer_GetData($hash) @@ -306,7 +311,7 @@ sub Notify { or grep /^DELETEATTR.$name.disable$/, @{$events} or grep /^DELETEATTR.$name.interval$/, @{$events} or grep /^DEFINED.$name$/, @{$events} ) - and $init_done + and $::init_done ); return; } @@ -359,7 +364,7 @@ sub Get { my $list = ''; $list .= 'statusSOE:noArg aggregates:noArg siteinfo:noArg sitemaster:noArg powerwalls:noArg registration:noArg status:noArg' - if( AttrVal($name,'emailaddr','none') ne 'none' + if( ::AttrVal($name,'emailaddr','none') ne 'none' && defined(ReadPassword($hash, $name)) && defined($hash->{TOKEN}) ); @@ -391,25 +396,49 @@ sub Set { } elsif ( lc $cmd eq 'setpassword' ) { return q{please set Attribut emailaddr first} - if ( AttrVal( $name, 'emailaddr', 'none' ) eq 'none' ); + if ( ::AttrVal( $name, 'emailaddr', 'none' ) eq 'none' ); return qq(usage: ${cmd} pass=) if ( scalar( @{$aArg} ) != 0 || scalar(keys %{$hArg}) != 1 ); + my ($passResp,$passErr); + ($passResp,$passErr) = $hash->{helper}->{passObj}->setStorePassword($name,$hArg->{'pass'}); + + return qq{error while saving the password - $passErr} + if ( !defined($passResp) + and defined($passErr) ); + + return q{password successfully saved} + if ( defined($passResp) + and !defined($passErr) ); - StorePassword( $hash, $name, $hArg->{'pass'} ); return Timer_GetData($hash); } elsif ( lc $cmd eq 'removepassword' ) { return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); - DeletePassword($hash); - return Timer_GetData($hash); + my ($passResp,$passErr); + ($passResp,$passErr) = $hash->{helper}->{passObj}->setStorePassword($name); + + return qq{error while saving the password - $passErr} + if ( !defined($passResp) + and defined($passErr) ); + + return q{password successfully removed} + if ( defined($passResp) + and !defined($passErr) ); } else { - my $list = ( defined(ReadPassword($hash, $name)) ? 'removePassword:noArg ' : 'setPassword '); + my $list = ( exists($hash->{helper}->{passObj}) + && exists($hash->{helper}->{passObj}) + && defined($hash->{helper}->{passObj}->getReadPassword($name)) + ? 'removePassword:noArg ' + : 'setPassword '); + $list .= 'powerwalls:run,stop' - if ( AttrVal( $name, 'devel', 0 ) == 1 - && defined(ReadPassword($hash, $name)) + if ( ::AttrVal( $name, 'devel', 0 ) == 1 + exists($hash->{helper}->{passObj}) + && exists($hash->{helper}->{passObj}) + && defined($hash->{helper}->{passObj}->getReadPassword($name)) && defined($hash->{TOKEN}) ); return 'Unknown argument ' . $cmd . ', choose one of ' . $list; @@ -425,18 +454,22 @@ sub Timer_GetData { my $hash = shift; my $name = $hash->{NAME}; - RemoveInternalTimer($hash); + ::RemoveInternalTimer($hash); if ( defined( $hash->{actionQueue} ) && scalar( @{ $hash->{actionQueue} } ) == 0 ) { - if ( !IsDisabled($name) ) { - return readingsSingleUpdate( $hash, 'state', + if ( !::IsDisabled($name) ) { + return ::readingsSingleUpdate( $hash, 'state', 'please set Attribut emailaddr first', 1 ) - if ( AttrVal( $name, 'emailaddr', 'none' ) eq 'none' ); - return readingsSingleUpdate( $hash, 'state', + if ( ::AttrVal( $name, 'emailaddr', 'none' ) eq 'none' ); + return ::readingsSingleUpdate( $hash, 'state', 'please set password first', 1 ) - if ( !defined( ReadPassword( $hash, $name ) ) ); + if ( !exists($hash->{helper}->{passObj}) + || ( exists($hash->{helper}->{passObj}) + && !defined($hash->{helper}->{passObj}->getReadPassword($name)) + ) + ); if ( !defined( $hash->{TOKEN}) ) { unshift( @{ $hash->{actionQueue} }, 'login' ); @@ -450,14 +483,14 @@ sub Timer_GetData { Write($hash); } else { - return readingsSingleUpdate( $hash, 'state', 'disabled', 1 ); + return ::readingsSingleUpdate( $hash, 'state', 'disabled', 1 ); } } - InternalTimer( gettimeofday() + $hash->{INTERVAL}, + ::InternalTimer( ::gettimeofday() + $hash->{INTERVAL}, 'Powerwall_Timer_GetData', $hash ); - Log3($name, 4, - qq(TeslaPowerwall2AC \(${name}\) - Call InternalTimer Timer_GetData)); + ::Log3($name, 4, + qq(TeslaPowerwall2AC \(${name}\) - Call ::InternalTimer Timer_GetData)); } sub Write { @@ -467,7 +500,7 @@ sub Write { my ( $uri, $method, $header, $data, $path ) = CreateUri( $hash, pop( @{ $hash->{actionQueue} } ) ); - readingsSingleUpdate( + ::readingsSingleUpdate( $hash, 'state', 'fetch data - ' @@ -476,7 +509,7 @@ sub Write { 1 ); - HttpUtils_NonblockingGet( + ::HttpUtils_NonblockingGet( { url => 'https://' . $uri, timeout => 5, @@ -490,7 +523,7 @@ sub Write { } ); - Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Send with URI: https://${uri})); + ::Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Send with URI: https://${uri})); } sub ErrorHandling { @@ -506,12 +539,12 @@ sub ErrorHandling { if ( defined($err) ) { if ( $err ne '' ) { - readingsBeginUpdate($hash); - readingsBulkUpdate( $hash, 'state', $err, 1 ); - readingsBulkUpdate( $hash, 'lastRequestError', $err, 1 ); - readingsEndUpdate( $hash, 1 ); + ::readingsBeginUpdate($hash); + ::readingsBulkUpdate( $hash, 'state', $err, 1 ); + ::readingsBulkUpdate( $hash, 'lastRequestError', $err, 1 ); + ::readingsEndUpdate( $hash, 1 ); - Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - RequestERROR: ${err})); + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - RequestERROR: ${err})); $hash->{actionQueue} = []; return; @@ -523,17 +556,17 @@ sub ErrorHandling { && $param->{code} != 200 ) { - readingsBeginUpdate($hash); - readingsBulkUpdate( $hash, 'state', $param->{code}, 1 ); + ::readingsBeginUpdate($hash); + ::readingsBulkUpdate( $hash, 'state', $param->{code}, 1 ); - readingsBulkUpdate( $hash, 'lastRequestError', $param->{code}, 1 ); + ::readingsBulkUpdate( $hash, 'lastRequestError', $param->{code}, 1 ); - Log3($name, 3, + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - RequestERROR: " . $param->{code})); - readingsEndUpdate( $hash, 1 ); + ::readingsEndUpdate( $hash, 1 ); - Log3($name, 5, + ::Log3($name, 5, qq(TeslaPowerwall2AC \(${name}\) - RequestERROR: received http code " . $param->{code} . " without any data after requesting)); @@ -544,10 +577,10 @@ sub ErrorHandling { if ( $data =~ m#{"code":(\d+),"error":"(.+)","message":"(.+)"}$# ) { - readingsBeginUpdate($hash); + ::readingsBeginUpdate($hash); - readingsBulkUpdate( $hash, 'state', $1, 1 ); - readingsBulkUpdate( + ::readingsBulkUpdate( $hash, 'state', $1, 1 ); + ::readingsBulkUpdate( $hash, 'lastRequestError', 'Path: ' @@ -560,15 +593,15 @@ sub ErrorHandling { 1 ); - readingsEndUpdate( $hash, 1 ); + ::readingsEndUpdate( $hash, 1 ); } #### End Error Handling - InternalTimer( gettimeofday() + 3, 'Powerwall_Write', $hash ) + ::InternalTimer( ::gettimeofday() + 3, 'Powerwall_Write', $hash ) if ( defined( $hash->{actionQueue} ) && scalar( @{ $hash->{actionQueue} } ) > 0 ); - Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Recieve JSON data: ${data})); + ::Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Recieve JSON data: ${data})); ResponseProcessing( $hash, $param->{setCmd}, $data ); } @@ -584,11 +617,11 @@ sub ResponseProcessing { $decode_json = eval { decode_json($json) }; if ($@) { - Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - error while request: $@)); - readingsBeginUpdate($hash); - readingsBulkUpdate( $hash, 'JSON Error', $@ ); - readingsBulkUpdate( $hash, 'state', 'JSON error' ); - readingsEndUpdate( $hash, 1 ); + ::Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - error while request: $@)); + ::readingsBeginUpdate($hash); + ::readingsBulkUpdate( $hash, 'JSON Error', $@ ); + ::readingsBulkUpdate( $hash, 'state', 'JSON error' ); + ::readingsEndUpdate( $hash, 1 ); return; } @@ -631,31 +664,31 @@ sub WriteReadings { my $name = $hash->{NAME}; - Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Write Readings)); + ::Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Write Readings)); - readingsBeginUpdate($hash); + ::readingsBeginUpdate($hash); while ( my ( $r, $v ) = each %{$readings} ) { - readingsBulkUpdate( $hash, $path . '-' . $r, $v ); + ::readingsBulkUpdate( $hash, $path . '-' . $r, $v ); } - readingsBulkUpdate( $hash, 'batteryLevel', + ::readingsBulkUpdate( $hash, 'batteryLevel', sprintf( "%.1f", $readings->{percentage} ) ) if ( defined( $readings->{percentage} ) ); - readingsBulkUpdate( + ::readingsBulkUpdate( $hash, 'batteryPower', sprintf( "%.1f", ( - ReadingsVal( $name, 'siteinfo-nominal_system_energy_kWh', 0 ) / + ::ReadingsVal( $name, 'siteinfo-nominal_system_energy_kWh', 0 ) / 100 - ) * ReadingsVal( $name, 'statussoe-percentage', 0 ) + ) * ::ReadingsVal( $name, 'statussoe-percentage', 0 ) ) ); - readingsBulkUpdateIfChanged( $hash, 'actionQueue', + ::readingsBulkUpdateIfChanged( $hash, 'actionQueue', scalar( @{ $hash->{actionQueue} } ) . ' entries in the Queue' ); - readingsBulkUpdateIfChanged( + ::readingsBulkUpdateIfChanged( $hash, 'state', ( defined( $hash->{actionQueue} ) @@ -667,7 +700,7 @@ sub WriteReadings { ) ); - readingsEndUpdate( $hash, 1 ); + ::readingsEndUpdate( $hash, 1 ); } sub ReadingsProcessing_Aggregates { @@ -891,9 +924,9 @@ sub CreateUri { $header = 'Content-Type: application/json'; $data = '{"username":"customer","password":"' - . ReadPassword( $hash, $name ) + . $hash->{helper}->{passObj}->getReadPassword($name) . '","email":"' - . AttrVal($name,'emailaddr','test@test.de') + . ::AttrVal($name,'emailaddr','test@test.de') . '","force_sm_off":false}' } elsif ( $path eq 'powerwallsstop' @@ -911,7 +944,7 @@ sub StorePassword { my $password = shift; my $index = $hash->{TYPE} . q{_} . $name . q{_passwd}; - my $key = getUniqueId() . $index; + my $key = ::getUniqueId() . $index; my $enc_pwd = q{}; if ( eval qq(use Digest::MD5;1) ) { @@ -927,7 +960,7 @@ sub StorePassword { $key = $encode . $key; } - my $err = setKeyValue( $index, $enc_pwd ); + my $err = ::setKeyValue( $index, $enc_pwd ); return qq(error while saving the password - ${err}) if ( defined($err) ); @@ -939,16 +972,16 @@ sub ReadPassword { my $name = shift; my $index = $hash->{TYPE} . q{_} . $name . q{_passwd}; - my $key = getUniqueId() . $index; + my $key = ::getUniqueId() . $index; my ( $password, $err ); - Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Read password from file)); + ::Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Read password from file)); - ( $err, $password ) = getKeyValue($index); + ( $err, $password ) = ::getKeyValue($index); if ( defined($err) ) { - Log3($name, 3, + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - unable to read password from file: ${err})); return; @@ -975,7 +1008,7 @@ qq(TeslaPowerwall2AC \(${name}\) - unable to read password from file: ${err})); } else { - Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - No password in file)); + ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - No password in file)); return; } @@ -987,7 +1020,7 @@ qq(TeslaPowerwall2AC \(${name}\) - unable to read password from file: ${err})); sub DeletePassword { my $hash = shift; - setKeyValue( $hash->{TYPE} . q{_} . $hash->{NAME} . q{_passwd}, undef ); + ::setKeyValue( $hash->{TYPE} . q{_} . $hash->{NAME} . q{_passwd}, undef ); return; } @@ -996,39 +1029,21 @@ sub Rename { my $new = shift; my $old = shift; - my $hash = $defs{$new}; + my ($passResp,$passErr); + ($passResp,$passErr) = $hash->{helper}->{passObj}->setRename($new,$old); + + ::Log3($name, 1, +qq(TeslaPowerwall2AC \(${name}\) - error while change the password hash after rename - $passErr) + if ( !defined($passResp) + and defined($passErr) ); - StorePassword( $hash, $new, ReadPassword( $hash, $old ) ); - setKeyValue( $hash->{TYPE} . q{_} . $old . q{_passwd}, undef ); + ::Log3($name, 1, +qq(TeslaPowerwall2AC \(${name}\) - change password hash after rename successfully) + if ( defined($passResp) + and !defined($passErr) ); return; } -# My little Helpers -sub PathTimestamp { - my $hash = shift; - my $path = shift // return; - - $hash->{helper}->{pathTimestamp}->{$path}->{TIME} = - gettimeofday(); -} - -sub PathTimeAge { - my $hash = shift; - my $path = shift; - - $hash->{helper}{updateTimeCallBattery} = 0 - if ( not defined( $hash->{helper}{updateTimeCallBattery} ) ); - my $UpdateTimeAge = gettimeofday() - $hash->{helper}{updateTimeCallBattery}; - - return $UpdateTimeAge; -} - -sub IsPathTimeAgeToOld { - my $hash = shift; - my $maxAge = shift; - - return ( CallBattery_UpdateTimeAge($hash) > $maxAge ? 1 : 0 ); -} 1; -- 2.45.2 From df3c1e66db70c30a28307778a04b0107ce53fecf Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 20 Apr 2021 21:51:01 +0200 Subject: [PATCH 02/15] fix multiple error messages --- controls_TeslaPowerwall2AC.txt | 2 +- lib/FHEM/Tesla/Powerwall.pm | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index 6db2de3..58e4331 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1,2 +1,2 @@ UPD 2021-04-20_21:40:31 6866 FHEM/46_TeslaPowerwall2AC.pm -UPD 2021-04-20_21:40:44 30162 lib/FHEM/Tesla/Powerwall.pm +UPD 2021-04-20_21:50:19 30167 lib/FHEM/Tesla/Powerwall.pm diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Tesla/Powerwall.pm index 4b8f709..31b48e9 100644 --- a/lib/FHEM/Tesla/Powerwall.pm +++ b/lib/FHEM/Tesla/Powerwall.pm @@ -207,12 +207,12 @@ qq(TeslaPowerwall2AC \(${name}\) - defined TeslaPowerwall2AC Device with Host ${ ($passResp,$passErr) = $hash->{helper}->{passObj}->setStorePassword($name,ReadPassword( $hash, $name )); ::Log3($name, 1, -qq(TeslaPowerwall2AC \(${name}\) - error while saving the password - $passErr) +qq(TeslaPowerwall2AC \(${name}\) - error while saving the password - $passErr)) if ( !defined($passResp) and defined($passErr) ); ::Log3($name, 1, -qq(TeslaPowerwall2AC \(${name}\) - password successfully saved) +qq(TeslaPowerwall2AC \(${name}\) - password successfully saved)) if ( defined($passResp) and !defined($passErr) ); @@ -436,7 +436,7 @@ sub Set { $list .= 'powerwalls:run,stop' if ( ::AttrVal( $name, 'devel', 0 ) == 1 - exists($hash->{helper}->{passObj}) + && exists($hash->{helper}->{passObj}) && exists($hash->{helper}->{passObj}) && defined($hash->{helper}->{passObj}->getReadPassword($name)) && defined($hash->{TOKEN}) ); -- 2.45.2 From 0c937e252ec59eff009127ff6c79bb74692cd8eb Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 20 Apr 2021 21:55:26 +0200 Subject: [PATCH 03/15] little bugfix --- controls_TeslaPowerwall2AC.txt | 2 +- lib/FHEM/Tesla/Powerwall.pm | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index 58e4331..7894423 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1,2 +1,2 @@ UPD 2021-04-20_21:40:31 6866 FHEM/46_TeslaPowerwall2AC.pm -UPD 2021-04-20_21:50:19 30167 lib/FHEM/Tesla/Powerwall.pm +UPD 2021-04-20_21:55:17 30201 lib/FHEM/Tesla/Powerwall.pm diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Tesla/Powerwall.pm index 31b48e9..8c96bcc 100644 --- a/lib/FHEM/Tesla/Powerwall.pm +++ b/lib/FHEM/Tesla/Powerwall.pm @@ -1028,17 +1028,19 @@ sub DeletePassword { sub Rename { my $new = shift; my $old = shift; + + my $hash = $::defs{$new}; my ($passResp,$passErr); ($passResp,$passErr) = $hash->{helper}->{passObj}->setRename($new,$old); - ::Log3($name, 1, -qq(TeslaPowerwall2AC \(${name}\) - error while change the password hash after rename - $passErr) + ::Log3($new, 1, +qq(TeslaPowerwall2AC \(${new}\) - error while change the password hash after rename - $passErr) if ( !defined($passResp) and defined($passErr) ); - ::Log3($name, 1, -qq(TeslaPowerwall2AC \(${name}\) - change password hash after rename successfully) + ::Log3($new, 1, +qq(TeslaPowerwall2AC \(${new}\) - change password hash after rename successfully) if ( defined($passResp) and !defined($passErr) ); -- 2.45.2 From a56755ffe9cbb076d74cc69deb201a6d8fc084c0 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 20 Apr 2021 21:57:03 +0200 Subject: [PATCH 04/15] fix syntax error line 1039, near "if" --- controls_TeslaPowerwall2AC.txt | 2 +- lib/FHEM/Tesla/Powerwall.pm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index 7894423..e00d6da 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1,2 +1,2 @@ UPD 2021-04-20_21:40:31 6866 FHEM/46_TeslaPowerwall2AC.pm -UPD 2021-04-20_21:55:17 30201 lib/FHEM/Tesla/Powerwall.pm +UPD 2021-04-20_21:56:45 30203 lib/FHEM/Tesla/Powerwall.pm diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Tesla/Powerwall.pm index 8c96bcc..7e5be6b 100644 --- a/lib/FHEM/Tesla/Powerwall.pm +++ b/lib/FHEM/Tesla/Powerwall.pm @@ -1035,12 +1035,12 @@ sub Rename { ($passResp,$passErr) = $hash->{helper}->{passObj}->setRename($new,$old); ::Log3($new, 1, -qq(TeslaPowerwall2AC \(${new}\) - error while change the password hash after rename - $passErr) +qq(TeslaPowerwall2AC \(${new}\) - error while change the password hash after rename - $passErr)) if ( !defined($passResp) and defined($passErr) ); ::Log3($new, 1, -qq(TeslaPowerwall2AC \(${new}\) - change password hash after rename successfully) +qq(TeslaPowerwall2AC \(${new}\) - change password hash after rename successfully)) if ( defined($passResp) and !defined($passErr) ); -- 2.45.2 From 9ab151268df81780d8fc6cbfcc73822e833c5275 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Tue, 20 Apr 2021 22:39:37 +0200 Subject: [PATCH 05/15] fix bug with changing hash's --- controls_TeslaPowerwall2AC.txt | 2 +- lib/FHEM/Tesla/Powerwall.pm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index e00d6da..ea70c6c 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1,2 +1,2 @@ UPD 2021-04-20_21:40:31 6866 FHEM/46_TeslaPowerwall2AC.pm -UPD 2021-04-20_21:56:45 30203 lib/FHEM/Tesla/Powerwall.pm +UPD 2021-04-20_22:39:25 30202 lib/FHEM/Tesla/Powerwall.pm diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Tesla/Powerwall.pm index 7e5be6b..9decf91 100644 --- a/lib/FHEM/Tesla/Powerwall.pm +++ b/lib/FHEM/Tesla/Powerwall.pm @@ -234,7 +234,7 @@ sub Undef { sub Attr { my ( $cmd, $name, $attrName, $attrVal ) = @_; - my $hash = $$::defs{$name}; + my $hash = $::defs{$name}; if ( $attrName eq 'disable' ) { if ( $cmd eq 'set' && $attrVal eq '1' ) { -- 2.45.2 From 013576915f7021b2e5d2abde1d1cac04558062d4 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 21 Apr 2021 10:01:12 +0200 Subject: [PATCH 06/15] change little code to manage passowrd store change version --- FHEM/46_TeslaPowerwall2AC.pm | 2 +- controls_TeslaPowerwall2AC.txt | 3 +-- lib/FHEM/Tesla/Powerwall.pm | 9 +++------ 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/FHEM/46_TeslaPowerwall2AC.pm b/FHEM/46_TeslaPowerwall2AC.pm index 2bc96e5..28bfb69 100644 --- a/FHEM/46_TeslaPowerwall2AC.pm +++ b/FHEM/46_TeslaPowerwall2AC.pm @@ -199,7 +199,7 @@ sub Initialize { ], "release_status": "stable", "license": "GPL_2", - "version": "v1.2.1", + "version": "v2.0.0", "author": [ "Marko Oldenburg " ], diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index ea70c6c..9936ea2 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1,2 +1 @@ -UPD 2021-04-20_21:40:31 6866 FHEM/46_TeslaPowerwall2AC.pm -UPD 2021-04-20_22:39:25 30202 lib/FHEM/Tesla/Powerwall.pm +UPD 2021-04-21_10:01:00 6866 FHEM/46_TeslaPowerwall2AC.pm diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Tesla/Powerwall.pm index 9decf91..0499033 100644 --- a/lib/FHEM/Tesla/Powerwall.pm +++ b/lib/FHEM/Tesla/Powerwall.pm @@ -365,7 +365,8 @@ sub Get { $list .= 'statusSOE:noArg aggregates:noArg siteinfo:noArg sitemaster:noArg powerwalls:noArg registration:noArg status:noArg' if( ::AttrVal($name,'emailaddr','none') ne 'none' - && defined(ReadPassword($hash, $name)) + && exists($hash->{helper}->{passObj}) + && defined($hash->{helper}->{passObj}->getReadPassword($name)) && defined($hash->{TOKEN}) ); return 'Unknown argument ' . $cmd . ', choose one of ' . $list; @@ -406,11 +407,9 @@ sub Set { if ( !defined($passResp) and defined($passErr) ); - return q{password successfully saved} + return Timer_GetData($hash) if ( defined($passResp) and !defined($passErr) ); - - return Timer_GetData($hash); } elsif ( lc $cmd eq 'removepassword' ) { return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); @@ -429,14 +428,12 @@ sub Set { else { my $list = ( exists($hash->{helper}->{passObj}) - && exists($hash->{helper}->{passObj}) && defined($hash->{helper}->{passObj}->getReadPassword($name)) ? 'removePassword:noArg ' : 'setPassword '); $list .= 'powerwalls:run,stop' if ( ::AttrVal( $name, 'devel', 0 ) == 1 - && exists($hash->{helper}->{passObj}) && exists($hash->{helper}->{passObj}) && defined($hash->{helper}->{passObj}->getReadPassword($name)) && defined($hash->{TOKEN}) ); -- 2.45.2 From 388c6f6a2f96c6ba2fb4fefb836e59111fe630cf Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Wed, 21 Apr 2021 10:32:08 +0200 Subject: [PATCH 07/15] change package name for password handling util --- lib/FHEM/Tesla/Powerwall.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Tesla/Powerwall.pm index 0499033..6898a1f 100644 --- a/lib/FHEM/Tesla/Powerwall.pm +++ b/lib/FHEM/Tesla/Powerwall.pm @@ -58,7 +58,7 @@ use strict; use warnings; use GPUtils qw(GP_Export); use HttpUtils; -use FHEM::Core::Password::Utils qw(:ALL); +use FHEM::Core::Authentication::Passwords qw(:ALL); use Data::Dumper; @@ -200,7 +200,7 @@ sub Define { qq(TeslaPowerwall2AC \(${name}\) - defined TeslaPowerwall2AC Device with Host ${host} and Interval $hash->{INTERVAL})); ### create password object to handle pass keystore - $hash->{helper}->{passObj} = FHEM::Core::Password::Utils->new(); + $hash->{helper}->{passObj} = FHEM::Core::Authentication::Passwords->new(); if ( defined( ReadPassword( $hash, $name ) ) ) { my ($passResp,$passErr); -- 2.45.2 From ad72e9a26da2f861d7a0a8eac0d23f629367895a Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Thu, 22 Apr 2021 08:41:02 +0200 Subject: [PATCH 08/15] remove no need password fn --- controls_TeslaPowerwall2AC.txt | 3 ++- lib/FHEM/Tesla/Powerwall.pm | 29 ----------------------------- 2 files changed, 2 insertions(+), 30 deletions(-) diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index 9936ea2..6177318 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1 +1,2 @@ -UPD 2021-04-21_10:01:00 6866 FHEM/46_TeslaPowerwall2AC.pm +UPD 2021-04-22_08:19:01 6866 FHEM/46_TeslaPowerwall2AC.pm +UPD 2021-04-22_08:24:27 29401 lib/FHEM/Tesla/Powerwall.pm diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Tesla/Powerwall.pm index 6898a1f..f5f6e9d 100644 --- a/lib/FHEM/Tesla/Powerwall.pm +++ b/lib/FHEM/Tesla/Powerwall.pm @@ -935,35 +935,6 @@ sub CreateUri { return ( $uri, $method, $header, $data, $path ); } -sub StorePassword { - my $hash = shift; - my $name = shift; - my $password = shift; - - my $index = $hash->{TYPE} . q{_} . $name . q{_passwd}; - my $key = ::getUniqueId() . $index; - my $enc_pwd = q{}; - - if ( eval qq(use Digest::MD5;1) ) { - - $key = Digest::MD5::md5_hex( unpack "H*", $key ); - $key .= Digest::MD5::md5_hex($key); - } - - for my $char ( split //, $password ) { - - my $encode = chop($key); - $enc_pwd .= sprintf( "%.2x", ord($char) ^ ord($encode) ); - $key = $encode . $key; - } - - my $err = ::setKeyValue( $index, $enc_pwd ); - return qq(error while saving the password - ${err}) - if ( defined($err) ); - - return q{password successfully saved}; -} - sub ReadPassword { my $hash = shift; my $name = shift; -- 2.45.2 From 7bdd6eeb7f5788a8d7b8b0a43c6e6e324c947253 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 23 Apr 2021 02:53:33 +0200 Subject: [PATCH 09/15] change create FHEM::Core::Authentication::Passwords object new modul API for FHEM::Core::Authentication::Passwords --- controls_TeslaPowerwall2AC.txt | 2 +- lib/FHEM/Tesla/Powerwall.pm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index 6177318..681f04f 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1,2 +1,2 @@ UPD 2021-04-22_08:19:01 6866 FHEM/46_TeslaPowerwall2AC.pm -UPD 2021-04-22_08:24:27 29401 lib/FHEM/Tesla/Powerwall.pm +UPD 2021-04-23_02:53:21 29414 lib/FHEM/Tesla/Powerwall.pm diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Tesla/Powerwall.pm index f5f6e9d..873cc2e 100644 --- a/lib/FHEM/Tesla/Powerwall.pm +++ b/lib/FHEM/Tesla/Powerwall.pm @@ -200,7 +200,7 @@ sub Define { qq(TeslaPowerwall2AC \(${name}\) - defined TeslaPowerwall2AC Device with Host ${host} and Interval $hash->{INTERVAL})); ### create password object to handle pass keystore - $hash->{helper}->{passObj} = FHEM::Core::Authentication::Passwords->new(); + $hash->{helper}->{passObj} = FHEM::Core::Authentication::Passwords->new($hash->{TYPE}); if ( defined( ReadPassword( $hash, $name ) ) ) { my ($passResp,$passErr); -- 2.45.2 From d3ea80edcf905378d0b10d1dcd401a6a7b2057f3 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 23 Apr 2021 05:36:05 +0200 Subject: [PATCH 10/15] change code syntax --- controls_TeslaPowerwall2AC.txt | 2 +- lib/FHEM/Tesla/Powerwall.pm | 87 +++++++++++++--------------------- 2 files changed, 33 insertions(+), 56 deletions(-) diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index 681f04f..62da8a9 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1,2 +1,2 @@ UPD 2021-04-22_08:19:01 6866 FHEM/46_TeslaPowerwall2AC.pm -UPD 2021-04-23_02:53:21 29414 lib/FHEM/Tesla/Powerwall.pm +UPD 2021-04-23_05:35:13 28927 lib/FHEM/Tesla/Powerwall.pm diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Tesla/Powerwall.pm index 873cc2e..5865872 100644 --- a/lib/FHEM/Tesla/Powerwall.pm +++ b/lib/FHEM/Tesla/Powerwall.pm @@ -56,7 +56,6 @@ package FHEM::Tesla::Powerwall; use strict; use warnings; -use GPUtils qw(GP_Export); use HttpUtils; use FHEM::Core::Authentication::Passwords qw(:ALL); @@ -133,28 +132,6 @@ if ($@) { } } -## Import der FHEM Funktionen -#-- Run before package compilation -BEGIN { - - #-- Export to main context with different name - GP_Export( - qw( - Initialize - Timer_GetData - Write - ) - ); -} - -#-- Export to main context with different name -GP_Export( - qw( - Initialize - Timer_GetData - Write - ) -); my %paths = ( 'statussoe' => 'system_status/soe', @@ -191,13 +168,13 @@ sub Define { $hash->{HOST} = $host; $hash->{INTERVAL} = 300; $hash->{VERSION} = version->parse($VERSION)->normal; - $hash->{NOTIFYDEV} = qq(global,${name}); + $hash->{NOTIFYDEV} = qq(global,$name); $hash->{actionQueue} = []; ::CommandAttr( undef, $name . q{ room Tesla} ) if ( ::AttrVal( $name, 'room', 'none' ) eq 'none' ); ::Log3($name, 3, -qq(TeslaPowerwall2AC \(${name}\) - defined TeslaPowerwall2AC Device with Host ${host} and Interval $hash->{INTERVAL})); +qq(TeslaPowerwall2AC ($name) - defined TeslaPowerwall2AC Device with Host $host and Interval $hash->{INTERVAL})); ### create password object to handle pass keystore $hash->{helper}->{passObj} = FHEM::Core::Authentication::Passwords->new($hash->{TYPE}); @@ -207,12 +184,12 @@ qq(TeslaPowerwall2AC \(${name}\) - defined TeslaPowerwall2AC Device with Host ${ ($passResp,$passErr) = $hash->{helper}->{passObj}->setStorePassword($name,ReadPassword( $hash, $name )); ::Log3($name, 1, -qq(TeslaPowerwall2AC \(${name}\) - error while saving the password - $passErr)) +qq(TeslaPowerwall2AC ($name) - error while saving the password - $passErr)) if ( !defined($passResp) and defined($passErr) ); ::Log3($name, 1, -qq(TeslaPowerwall2AC \(${name}\) - password successfully saved)) +qq(TeslaPowerwall2AC ($name) - password successfully saved)) if ( defined($passResp) and !defined($passErr) ); @@ -227,7 +204,7 @@ sub Undef { my $name = shift; ::RemoveInternalTimer($hash); - ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - Device ${name} deleted)); + ::Log3($name, 3, qq(TeslaPowerwall2AC ($name) - Device $name deleted)); return; } @@ -240,11 +217,11 @@ sub Attr { if ( $cmd eq 'set' && $attrVal eq '1' ) { ::RemoveInternalTimer($hash); ::readingsSingleUpdate( $hash, 'state', 'disabled', 1 ); - ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - disabled)); + ::Log3($name, 3, qq(TeslaPowerwall2AC ($name) - disabled)); } elsif ( $cmd eq 'del' ) { - ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - enabled)); + ::Log3($name, 3, qq(TeslaPowerwall2AC ($name) - enabled)); } } @@ -253,12 +230,12 @@ sub Attr { return 'check disabledForIntervals Syntax HH:MM-HH:MM or \'HH:MM-HH:MM HH:MM-HH:MM ...\'' unless ( $attrVal =~ /^((\d{2}:\d{2})-(\d{2}:\d{2})\s?)+$/ ); - ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - disabledForIntervals)); + ::Log3($name, 3, qq(TeslaPowerwall2AC ($name) - disabledForIntervals)); ::readingsSingleUpdate( $hash, 'state', 'disabled', 1 ); } elsif ( $cmd eq 'del' ) { - ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - enabled)); + ::Log3($name, 3, qq(TeslaPowerwall2AC ($name) - enabled)); ::readingsSingleUpdate( $hash, 'state', 'active', 1 ); } } @@ -267,7 +244,7 @@ sub Attr { if ( $cmd eq 'set' ) { if ( $attrVal < 60 ) { ::Log3($name, 3, -qq(TeslaPowerwall2AC \(${name}\) - interval too small, please use something >= 60 (sec), default is 300 (sec))); +qq(TeslaPowerwall2AC ($name) - interval too small, please use something >= 60 (sec), default is 300 (sec))); return q{interval too small, please use something >= 60 (sec), default is 300 (sec)}; @@ -276,7 +253,7 @@ q{interval too small, please use something >= 60 (sec), default is 300 (sec)}; ::RemoveInternalTimer($hash); $hash->{INTERVAL} = $attrVal; ::Log3($name, 3, - qq(TeslaPowerwall2AC \(${name}\) - set interval to ${attrVal})); + qq(TeslaPowerwall2AC ($name) - set interval to $attrVal)); Timer_GetData($hash); } } @@ -284,7 +261,7 @@ q{interval too small, please use something >= 60 (sec), default is 300 (sec)}; ::RemoveInternalTimer($hash); $hash->{INTERVAL} = 300; ::Log3($name, 3, - qq(TeslaPowerwall2AC \(${name}\) - set interval to default)); + qq(TeslaPowerwall2AC ($name) - set interval to default)); Timer_GetData($hash); } } @@ -321,7 +298,7 @@ sub Get { my $aArg = shift; my $name = shift @$aArg; - my $cmd = shift @$aArg // return qq(get ${name} needs at least one argument); + my $cmd = shift @$aArg // return qq(get $name needs at least one argument); my $arg; if ( $cmd eq 'statusSOE' ) { @@ -388,7 +365,7 @@ sub Set { my $hArg = shift; my $name = shift @$aArg; - my $cmd = shift @$aArg // return qq(set ${name} needs at least one argument); + my $cmd = shift @$aArg // return qq(set $name needs at least one argument); my $arg; @@ -398,7 +375,7 @@ sub Set { elsif ( lc $cmd eq 'setpassword' ) { return q{please set Attribut emailaddr first} if ( ::AttrVal( $name, 'emailaddr', 'none' ) eq 'none' ); - return qq(usage: ${cmd} pass=) if ( scalar( @{$aArg} ) != 0 + return qq(usage: $cmd pass=) if ( scalar( @{$aArg} ) != 0 || scalar(keys %{$hArg}) != 1 ); my ($passResp,$passErr); ($passResp,$passErr) = $hash->{helper}->{passObj}->setStorePassword($name,$hArg->{'pass'}); @@ -415,7 +392,7 @@ sub Set { return "usage: $cmd" if ( scalar( @{$aArg} ) != 0 ); my ($passResp,$passErr); - ($passResp,$passErr) = $hash->{helper}->{passObj}->setStorePassword($name); + ($passResp,$passErr) = $hash->{helper}->{passObj}->setDeletePassword($name); return qq{error while saving the password - $passErr} if ( !defined($passResp) @@ -485,9 +462,9 @@ sub Timer_GetData { } ::InternalTimer( ::gettimeofday() + $hash->{INTERVAL}, - 'Powerwall_Timer_GetData', $hash ); + \&FHEM::Tesla::Powerwall::Timer_GetData, $hash ); ::Log3($name, 4, - qq(TeslaPowerwall2AC \(${name}\) - Call ::InternalTimer Timer_GetData)); + qq(TeslaPowerwall2AC ($name) - Call ::InternalTimer Timer_GetData)); } sub Write { @@ -520,7 +497,7 @@ sub Write { } ); - ::Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Send with URI: https://${uri})); + ::Log3($name, 4, qq(TeslaPowerwall2AC ($name) - Send with URI: https://$uri)); } sub ErrorHandling { @@ -541,7 +518,7 @@ sub ErrorHandling { ::readingsBulkUpdate( $hash, 'lastRequestError', $err, 1 ); ::readingsEndUpdate( $hash, 1 ); - ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - RequestERROR: ${err})); + ::Log3($name, 3, qq(TeslaPowerwall2AC ($name) - RequestERROR: $err)); $hash->{actionQueue} = []; return; @@ -559,12 +536,12 @@ sub ErrorHandling { ::readingsBulkUpdate( $hash, 'lastRequestError', $param->{code}, 1 ); ::Log3($name, 3, - qq(TeslaPowerwall2AC \(${name}\) - RequestERROR: " . $param->{code})); + qq(TeslaPowerwall2AC ($name) - RequestERROR: " . $param->{code})); ::readingsEndUpdate( $hash, 1 ); ::Log3($name, 5, - qq(TeslaPowerwall2AC \(${name}\) - RequestERROR: received http code " + qq(TeslaPowerwall2AC ($name) - RequestERROR: received http code " . $param->{code} . " without any data after requesting)); @@ -594,11 +571,11 @@ sub ErrorHandling { } #### End Error Handling - ::InternalTimer( ::gettimeofday() + 3, 'Powerwall_Write', $hash ) + ::InternalTimer( ::gettimeofday() + 3, \&FHEM::Tesla::Powerwall::Write, $hash ) if ( defined( $hash->{actionQueue} ) && scalar( @{ $hash->{actionQueue} } ) > 0 ); - ::Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Recieve JSON data: ${data})); + ::Log3($name, 4, qq(TeslaPowerwall2AC ($name) - Recieve JSON data: $data)); ResponseProcessing( $hash, $param->{setCmd}, $data ); } @@ -614,7 +591,7 @@ sub ResponseProcessing { $decode_json = eval { decode_json($json) }; if ($@) { - ::Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - error while request: $@)); + ::Log3($name, 4, qq(TeslaPowerwall2AC ($name) - error while request: $@)); ::readingsBeginUpdate($hash); ::readingsBulkUpdate( $hash, 'JSON Error', $@ ); ::readingsBulkUpdate( $hash, 'state', 'JSON error' ); @@ -661,7 +638,7 @@ sub WriteReadings { my $name = $hash->{NAME}; - ::Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Write Readings)); + ::Log3($name, 4, qq(TeslaPowerwall2AC ($name) - Write Readings)); ::readingsBeginUpdate($hash); while ( my ( $r, $v ) = each %{$readings} ) { @@ -943,14 +920,14 @@ sub ReadPassword { my $key = ::getUniqueId() . $index; my ( $password, $err ); - ::Log3($name, 4, qq(TeslaPowerwall2AC \(${name}\) - Read password from file)); + ::Log3($name, 4, qq(TeslaPowerwall2AC ($name) - Read password from file)); ( $err, $password ) = ::getKeyValue($index); if ( defined($err) ) { ::Log3($name, 3, -qq(TeslaPowerwall2AC \(${name}\) - unable to read password from file: ${err})); +qq(TeslaPowerwall2AC ($name) - unable to read password from file: $err)); return; } @@ -976,7 +953,7 @@ qq(TeslaPowerwall2AC \(${name}\) - unable to read password from file: ${err})); } else { - ::Log3($name, 3, qq(TeslaPowerwall2AC \(${name}\) - No password in file)); + ::Log3($name, 3, qq(TeslaPowerwall2AC ($name) - No password in file)); return; } @@ -988,7 +965,7 @@ qq(TeslaPowerwall2AC \(${name}\) - unable to read password from file: ${err})); sub DeletePassword { my $hash = shift; - ::setKeyValue( $hash->{TYPE} . q{_} . $hash->{NAME} . q{_passwd}, undef ); + ::setKeyValue( $hash->{TYPE} . q(_) . $hash->{NAME} . q(_passwd), undef ); return; } @@ -1003,12 +980,12 @@ sub Rename { ($passResp,$passErr) = $hash->{helper}->{passObj}->setRename($new,$old); ::Log3($new, 1, -qq(TeslaPowerwall2AC \(${new}\) - error while change the password hash after rename - $passErr)) +qq(TeslaPowerwall2AC ($new) - error while change the password hash after rename - $passErr)) if ( !defined($passResp) and defined($passErr) ); ::Log3($new, 1, -qq(TeslaPowerwall2AC \(${new}\) - change password hash after rename successfully)) +qq(TeslaPowerwall2AC ($new) - change password hash after rename successfully)) if ( defined($passResp) and !defined($passErr) ); -- 2.45.2 From 4f2fe76c3978be6b55c0e5c80f399862057a4d4d Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 23 Apr 2021 07:00:33 +0200 Subject: [PATCH 11/15] add code remove information --- controls_TeslaPowerwall2AC.txt | 2 +- lib/FHEM/Tesla/Powerwall.pm | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index 62da8a9..c00238d 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1,2 +1,2 @@ UPD 2021-04-22_08:19:01 6866 FHEM/46_TeslaPowerwall2AC.pm -UPD 2021-04-23_05:35:13 28927 lib/FHEM/Tesla/Powerwall.pm +UPD 2021-04-23_07:00:19 29152 lib/FHEM/Tesla/Powerwall.pm diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Tesla/Powerwall.pm index 5865872..0aea94f 100644 --- a/lib/FHEM/Tesla/Powerwall.pm +++ b/lib/FHEM/Tesla/Powerwall.pm @@ -179,6 +179,8 @@ qq(TeslaPowerwall2AC ($name) - defined TeslaPowerwall2AC Device with Host $host ### create password object to handle pass keystore $hash->{helper}->{passObj} = FHEM::Core::Authentication::Passwords->new($hash->{TYPE}); + + ## kann nach einiger Zeit gelöscht werden genauso wie auch ReadPassword und DeletePassword if ( defined( ReadPassword( $hash, $name ) ) ) { my ($passResp,$passErr); ($passResp,$passErr) = $hash->{helper}->{passObj}->setStorePassword($name,ReadPassword( $hash, $name )); @@ -912,6 +914,7 @@ sub CreateUri { return ( $uri, $method, $header, $data, $path ); } +### Kann nach einiger Zeit entfernt werden sub ReadPassword { my $hash = shift; my $name = shift; @@ -960,8 +963,7 @@ qq(TeslaPowerwall2AC ($name) - unable to read password from file: $err)); return; } - - +#### kann nach einiger Zeit gelöscht werden, entferne auch Code aus der Define Fn sub DeletePassword { my $hash = shift; -- 2.45.2 From f6001925501ec809d836e634549b5c3e179f5ff6 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 23 Apr 2021 08:20:53 +0200 Subject: [PATCH 12/15] change directory structure --- controls_TeslaPowerwall2AC.txt | 3 +-- lib/FHEM/{ => Devices}/Tesla/Powerwall.pm | 0 2 files changed, 1 insertion(+), 2 deletions(-) rename lib/FHEM/{ => Devices}/Tesla/Powerwall.pm (100%) diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index c00238d..3ce5091 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1,2 +1 @@ -UPD 2021-04-22_08:19:01 6866 FHEM/46_TeslaPowerwall2AC.pm -UPD 2021-04-23_07:00:19 29152 lib/FHEM/Tesla/Powerwall.pm +UPD 2021-04-23_08:18:27 6866 FHEM/46_TeslaPowerwall2AC.pm diff --git a/lib/FHEM/Tesla/Powerwall.pm b/lib/FHEM/Devices/Tesla/Powerwall.pm similarity index 100% rename from lib/FHEM/Tesla/Powerwall.pm rename to lib/FHEM/Devices/Tesla/Powerwall.pm -- 2.45.2 From 72cf203925834e311af619933dbbe3b612631b52 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 23 Apr 2021 08:24:36 +0200 Subject: [PATCH 13/15] change modul package name and directory structure --- FHEM/46_TeslaPowerwall2AC.pm | 20 ++++++++++---------- controls_TeslaPowerwall2AC.txt | 2 +- lib/FHEM/Devices/Tesla/Powerwall.pm | 6 +++--- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/FHEM/46_TeslaPowerwall2AC.pm b/FHEM/46_TeslaPowerwall2AC.pm index 28bfb69..17a4ea2 100644 --- a/FHEM/46_TeslaPowerwall2AC.pm +++ b/FHEM/46_TeslaPowerwall2AC.pm @@ -59,7 +59,7 @@ use warnings; use FHEM::Meta; use GPUtils qw(GP_Export); -require FHEM::Tesla::Powerwall; +require FHEM::Devices::Tesla::Powerwall; #-- Run before package compilation BEGIN { @@ -67,8 +67,8 @@ BEGIN { #-- Export to main context with different name GP_Export( qw( - Initialize - ) + Initialize + ) ); } @@ -76,14 +76,14 @@ sub Initialize { my $hash = shift; - $hash->{GetFn} = \&FHEM::Tesla::Powerwall::Get; - $hash->{SetFn} = \&FHEM::Tesla::Powerwall::Set; - $hash->{DefFn} = \&FHEM::Tesla::Powerwall::Define; - $hash->{UndefFn} = \&FHEM::Tesla::Powerwall::Undef; - $hash->{NotifyFn} = \&FHEM::Tesla::Powerwall::Notify; - $hash->{RenameFn} = \&FHEM::Tesla::Powerwall::Rename; + $hash->{GetFn} = \&FHEM::Devices::Tesla::Powerwall::Get; + $hash->{SetFn} = \&FHEM::Devices::Tesla::Powerwall::Set; + $hash->{DefFn} = \&FHEM::Devices::Tesla::Powerwall::Define; + $hash->{UndefFn} = \&FHEM::Devices::Tesla::Powerwall::Undef; + $hash->{NotifyFn} = \&FHEM::Devices::Tesla::Powerwall::Notify; + $hash->{RenameFn} = \&FHEM::Devices::Tesla::Powerwall::Rename; - $hash->{AttrFn} = \&FHEM::Tesla::Powerwall::Attr; + $hash->{AttrFn} = \&FHEM::Devices::Tesla::Powerwall::Attr; $hash->{AttrList} = 'interval ' . 'disable:1 ' diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index 3ce5091..d9ec3b4 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1 +1 @@ -UPD 2021-04-23_08:18:27 6866 FHEM/46_TeslaPowerwall2AC.pm +UPD 2021-04-23_08:24:15 6944 FHEM/46_TeslaPowerwall2AC.pm diff --git a/lib/FHEM/Devices/Tesla/Powerwall.pm b/lib/FHEM/Devices/Tesla/Powerwall.pm index 0aea94f..61bf135 100644 --- a/lib/FHEM/Devices/Tesla/Powerwall.pm +++ b/lib/FHEM/Devices/Tesla/Powerwall.pm @@ -52,7 +52,7 @@ ## ## -package FHEM::Tesla::Powerwall; +package FHEM::Devices::Tesla::Powerwall; use strict; use warnings; @@ -464,7 +464,7 @@ sub Timer_GetData { } ::InternalTimer( ::gettimeofday() + $hash->{INTERVAL}, - \&FHEM::Tesla::Powerwall::Timer_GetData, $hash ); + \&FHEM::Devices::Tesla::Powerwall::Timer_GetData, $hash ); ::Log3($name, 4, qq(TeslaPowerwall2AC ($name) - Call ::InternalTimer Timer_GetData)); } @@ -573,7 +573,7 @@ sub ErrorHandling { } #### End Error Handling - ::InternalTimer( ::gettimeofday() + 3, \&FHEM::Tesla::Powerwall::Write, $hash ) + ::InternalTimer( ::gettimeofday() + 3, \&FHEM::Devices::Tesla::Powerwall::Write, $hash ) if ( defined( $hash->{actionQueue} ) && scalar( @{ $hash->{actionQueue} } ) > 0 ); -- 2.45.2 From 40df6515e44e1955a69ff39d183c1ca3aff640cd Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Fri, 23 Apr 2021 08:34:01 +0200 Subject: [PATCH 14/15] change pre-commit hook script after change package name and directory structure closes: #5 --- controls_TeslaPowerwall2AC.txt | 1 + hooks/pre-commit | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index d9ec3b4..adb1405 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1 +1,2 @@ UPD 2021-04-23_08:24:15 6944 FHEM/46_TeslaPowerwall2AC.pm +UPD 2021-04-23_08:23:08 29179 lib/FHEM/Devices/Tesla/Powerwall.pm diff --git a/hooks/pre-commit b/hooks/pre-commit index a7bf70a..3cdf247 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -5,7 +5,7 @@ use POSIX qw(strftime); use strict; my @filenames = ( 'FHEM/46_TeslaPowerwall2AC.pm', - 'lib/FHEM/Tesla/Powerwall.pm' + 'lib/FHEM/Devices/Tesla/Powerwall.pm' ); my $controlsfile = 'controls_TeslaPowerwall2AC.txt'; -- 2.45.2 From 819f553c5838f9d49c3864f15d2c5b8c6c5dde4d Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 5 Jul 2021 13:06:14 +0200 Subject: [PATCH 15/15] add sslargs in HttpUtils_NonblockingGet Call --- controls_TeslaPowerwall2AC.txt | 2 +- lib/FHEM/Devices/Tesla/Powerwall.pm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/controls_TeslaPowerwall2AC.txt b/controls_TeslaPowerwall2AC.txt index adb1405..1a458de 100644 --- a/controls_TeslaPowerwall2AC.txt +++ b/controls_TeslaPowerwall2AC.txt @@ -1,2 +1,2 @@ UPD 2021-04-23_08:24:15 6944 FHEM/46_TeslaPowerwall2AC.pm -UPD 2021-04-23_08:23:08 29179 lib/FHEM/Devices/Tesla/Powerwall.pm +UPD 2021-07-05_13:05:54 29269 lib/FHEM/Devices/Tesla/Powerwall.pm diff --git a/lib/FHEM/Devices/Tesla/Powerwall.pm b/lib/FHEM/Devices/Tesla/Powerwall.pm index 61bf135..6bd0b7b 100644 --- a/lib/FHEM/Devices/Tesla/Powerwall.pm +++ b/lib/FHEM/Devices/Tesla/Powerwall.pm @@ -494,6 +494,7 @@ sub Write { header => $header, hash => $hash, setCmd => $path, + sslargs => { SSL_hostname => 0, verify_hostname => 0, SSL_verify_mode => 0 }, doTrigger => 1, callback => \&ErrorHandling, } -- 2.45.2