easee/patch.txt
2022-03-24 22:53:15 +01:00

1426 lines
59 KiB
Plaintext

commit d4ae8fcdbfb41def3e4d62ad90c1bb8f4045df7b
Author: Marko Oldenburg <fhemdevelopment@cooltux.net>
Date: Mon Mar 21 10:13:34 2022 +0100
fix multiple variablen declaration and code rewrite
diff --git a/98_EaseeWallbox.pm b/98_EaseeWallbox.pm
index 2c0a6a3..e6711af 100644
--- a/98_EaseeWallbox.pm
+++ b/98_EaseeWallbox.pm
@@ -1,5 +1,6 @@
package FHEM::EaseeWallbox;
-use GPUtils qw(GP_Import GP_Export);
+
+# use GPUtils qw(GP_Import GP_Export); hast Du auch weiter unten stehen
use strict;
use warnings;
@@ -69,7 +70,9 @@ eval {
# Import von Funktionen und/oder Variablen aus der FHEM main
# man kann ::Funktionaname wählen und sich so den Import schenken. Variablen sollten aber
# sauber importiert werden
-use GPUtils qw(GP_Import);
+# use GPUtils qw(GP_Import);
+use GPUtils qw(GP_Import GP_Export)
+ ; # da Du beide Funktionen aus dem package verwendest
## Import der FHEM Funktionen
#-- Run before package compilation
@@ -104,18 +107,17 @@ GP_Export(
)
);
-
my %gets = (
- update => "noArg",
- health => "noArg",
+ update => "noArg",
+ health => "noArg",
charger => "noArg",
);
my %sets = (
enabled => "",
- disabled => "",
+ disabled => "",
enableSmartButton => "true,false",
- authorizationRequired => "true,false",
+ authorizationRequired => "true,false",
startCharging => "",
stopCharging => "",
pauseCharging => "",
@@ -135,7 +137,6 @@ my %sets = (
deactivateTimer => "",
);
-
## Datapoint, all behind API URI
my %dpoints = (
getOAuthToken => 'accounts/login',
@@ -153,17 +154,19 @@ my %dpoints = (
getCurrentSession => 'chargers/#ChargerID#/sessions/ongoing',
setCableLockState => 'chargers/#ChargerID#/commands/lock_state',
setReboot => 'chargers/#ChargerID#/commands/reboot',
- setUpdateFirmware => 'chargers/#ChargerID#/commands/update_firmware',
- setEnableSmartCharging => 'chargers/#ChargerID#/commands/smart_charging',
- setStartCharging => 'chargers/#ChargerID#/commands/start_charging',
- setStopCharging => 'chargers/#ChargerID#/commands/stop_charging',
- setPauseCharging => 'chargers/#ChargerID#/commands/pause_charging',
- setResumeCharging => 'chargers/#ChargerID#/commands/resume_charging',
- setToggleCharging => 'chargers/#ChargerID#/commands/toggle_charging',
- setOverrideChargingSchedule => 'chargers/#ChargerID#/commands/override_schedule',
- setPairRFIDTag => 'chargers/#ChargerID#/commands/set_rfid_pairing_mode_async',
- changeChargerSettings => 'chargers/#ChargerID#/settings',
- setChargingPrice => 'sites/#SiteID#/price',
+ setUpdateFirmware => 'chargers/#ChargerID#/commands/update_firmware',
+ setEnableSmartCharging => 'chargers/#ChargerID#/commands/smart_charging',
+ setStartCharging => 'chargers/#ChargerID#/commands/start_charging',
+ setStopCharging => 'chargers/#ChargerID#/commands/stop_charging',
+ setPauseCharging => 'chargers/#ChargerID#/commands/pause_charging',
+ setResumeCharging => 'chargers/#ChargerID#/commands/resume_charging',
+ setToggleCharging => 'chargers/#ChargerID#/commands/toggle_charging',
+ setOverrideChargingSchedule =>
+ 'chargers/#ChargerID#/commands/override_schedule',
+ setPairRFIDTag =>
+ 'chargers/#ChargerID#/commands/set_rfid_pairing_mode_async',
+ changeChargerSettings => 'chargers/#ChargerID#/settings',
+ setChargingPrice => 'sites/#SiteID#/price',
);
my %reasonsForNoCurrent = (
0 => 'OK', #charger is allocated current
@@ -174,8 +177,8 @@ my %reasonsForNoCurrent = (
5 => 'WaitingInQueue',
6 => 'WaitingInFully'
, #charged queue (charger assumes one of: EV uses delayed charging, EV charging complete)
- 7 => 'IllegalGridType',
- 8 => 'PrimaryUnitHasNotReceivedCurrentRequestFromSecondaryUnit',
+ 7 => 'IllegalGridType',
+ 8 => 'PrimaryUnitHasNotReceivedCurrentRequestFromSecondaryUnit',
50 => 'SecondaryUnitNotRequestingCurrent', #no car connected...
51 => 'MaxChargerCurrentTooLow',
52 => 'MaxDynamicChargerCurrentTooLow',
@@ -201,32 +204,31 @@ my %operationModes = (
);
my %commandCodes = (
- 1 => "Reboot",
- 2 => "Poll single observation",
- 3 => "Poll all observations",
- 4 => "Upgrade Firmware",
- 5 => "Download settings",
- 7 => "Scan Wifi",
- 11 => "Set smart charging",
- 23 => "Abort charging",
- 25 => "Start Charging",
- 26 => "Stop Charging",
- 29 => "Set enabled",
- 30 => "Set cable lock",
- 11 => "Set smart charging",
- 40 => "Set lightstripe brightness",
- 43 => "Add keys",
- 44 => "Clear keys",
- 48 => "Pause/Resume/Toggle Charging",
- 60 => "Add schedule",
- 61 => "Cear Schedule",
- 62 => "Get Schedule",
- 63 => "Override Schedule",
- 64 => "Purge Schedule",
- 69 => "Set RFID Pairing Mode",
+ 1 => "Reboot",
+ 2 => "Poll single observation",
+ 3 => "Poll all observations",
+ 4 => "Upgrade Firmware",
+ 5 => "Download settings",
+ 7 => "Scan Wifi",
+ 11 => "Set smart charging",
+ 23 => "Abort charging",
+ 25 => "Start Charging",
+ 26 => "Stop Charging",
+ 29 => "Set enabled",
+ 30 => "Set cable lock",
+ 11 => "Set smart charging",
+ 40 => "Set lightstripe brightness",
+ 43 => "Add keys",
+ 44 => "Clear keys",
+ 48 => "Pause/Resume/Toggle Charging",
+ 60 => "Add schedule",
+ 61 => "Cear Schedule",
+ 62 => "Get Schedule",
+ 63 => "Override Schedule",
+ 64 => "Purge Schedule",
+ 69 => "Set RFID Pairing Mode",
);
-
#Private function to evaluate command-lists
# private funktionen beginnen immer mit _
@@ -238,14 +240,16 @@ sub _GetCmdList {
my $name = $hash->{NAME};
#return, if cmd is valid
- return undef if ( defined($cmd) and defined( $cmdArray{$cmd} ) );
+ return if ( defined($cmd) and defined( $cmdArray{$cmd} ) );
#response for gui or the user, if command is invalid
my $retVal;
foreach my $mySet ( keys %cmdArray ) {
#append set-command
- $retVal = $retVal . " " if ( defined($retVal) );
+ $retVal = $retVal . " "
+ if ( defined($retVal) )
+ ; # Macht denke ich keinen Sinn da durch my $retVal bereits $retVal definiert ist
$retVal = $retVal . $mySet;
#get options
@@ -253,18 +257,21 @@ sub _GetCmdList {
#append option, if valid
$retVal = $retVal . ":" . $myOpt
- if ( defined($myOpt) and ( length($myOpt) > 0 ) );
+ if ( defined($myOpt) and ( length($myOpt) > 0 ) );
$myOpt = "" if ( !defined($myOpt) );
- #Log3 ($name, 5, "parse cmd-table - Set:$mySet, Option:$myOpt, RetVal:$retVal");
+#Log3 ($name, 5, "parse cmd-table - Set:$mySet, Option:$myOpt, RetVal:$retVal");
}
if ( !defined($retVal) ) {
- $retVal = "error while parsing set-table";
+ return "error while parsing set-table";
}
- else {
- $retVal = "Unknown argument $cmd, choose one of " . $retVal;
- }
- return $retVal;
+
+ return "Unknown argument $cmd, choose one of " . $retVal;
+
+ # versuche wo wenig wie möglich if else zu verwenden.
+ # else {
+ # $retVal = "Unknown argument $cmd, choose one of " . $retVal;
+ # }
}
sub Initialize {
@@ -285,7 +292,7 @@ sub Initialize {
. $readingFnAttributes;
#Log3, 'EaseeWallbox', 3, "EaseeWallbox module initialized.";
- return;
+ return;
}
sub Define {
@@ -300,22 +307,23 @@ sub Define {
my $errmsg = '';
- # Check parameter(s) - Must be min 4 in total (counts strings not purly parameter, interval is optional)
+# Check parameter(s) - Must be min 4 in total (counts strings not purly parameter, interval is optional)
if ( int(@param) < 4 ) {
$errmsg = return
- "syntax error: define <name> EaseeWallbox <username> <password> [Interval]";
+"syntax error: define <name> EaseeWallbox <username> <password> [Interval]";
Log3 $name, 1, "EaseeWallbox $name: " . $errmsg;
return $errmsg;
}
#Check if the username is an email address
- if ( $param[2] =~ /^.+@.+$/ ) {
+ if ( $param[2] =~ /^.+@.+$/x )
+ { # Regular expression without "/x" flag. See page 236 of PBP (RegularExpressions::RequireExtendedFormatting)
my $username = $param[2];
$hash->{Username} = $username;
}
else {
- $errmsg
- = "specify valid email address within the field username. Format: define <name> EaseeWallbox <username> <password> [interval]";
+ $errmsg =
+"specify valid email address within the field username. Format: define <name> EaseeWallbox <username> <password> [interval]";
Log3 $name, 1, "EaseeWallbox $name: " . $errmsg;
return $errmsg;
}
@@ -342,12 +350,13 @@ sub Define {
#If not an integer abort with failure.
my $interval = 60;
if ( defined $param[4] ) {
- if ( $param[4] =~ /^\d+$/ ) {
+ if ( $param[4] =~ /^\d+$/x )
+ { # Regular expression without "/x" flag. See page 236 of PBP (RegularExpressions::RequireExtendedFormatting)
$interval = $param[4];
}
else {
- $errmsg
- = "Specify valid integer value for interval. Whole numbers > 5 only. Format: define <name> EaseeWallbox <username> <password> [interval]";
+ $errmsg =
+"Specify valid integer value for interval. Whole numbers > 5 only. Format: define <name> EaseeWallbox <username> <password> [interval]";
Log3 $name, 1, "EaseeWallbox $name: " . $errmsg;
return $errmsg;
}
@@ -359,25 +368,31 @@ sub Define {
readingsSingleUpdate( $hash, 'state', 'Undefined', 0 );
#Initial load of data
- WriteToCloudAPI($hash, 'getChargers', 'GET');
+ WriteToCloudAPI( $hash, 'getChargers', 'GET' );
+
+ Log3 $name, 1,
+ sprintf( "EaseeWallbox_Define %s: Starting timer with interval %s",
+ $name, InternalVal( $name, 'INTERVAL', undef ) );
+ InternalTimer( gettimeofday() + InternalVal( $name, 'INTERVAL', undef ),
+ "FHEM::EaseeWallbox::UpdateDueToTimer", $hash )
+ if ( defined $hash );
- Log3 $name, 1, sprintf("EaseeWallbox_Define %s: Starting timer with interval %s", $name, InternalVal($name,'INTERVAL', undef));
- InternalTimer(gettimeofday()+ InternalVal($name,'INTERVAL', undef), "FHEM::EaseeWallbox::UpdateDueToTimer", $hash) if (defined $hash);
- return undef;
+ ## return; sollte es nicht geben, ein return; ist per see mit Rückgabe undef
+ return;
}
sub Undef {
my ( $hash, $arg ) = @_;
RemoveInternalTimer($hash);
- return undef;
+ return;
}
sub Get {
my ( $hash, $name, @args ) = @_;
return '"get EaseeWallbox" needs at least one argument'
- if ( int(@args) < 1 );
+ if ( int(@args) < 1 );
my $opt = shift @args;
@@ -386,10 +401,10 @@ sub Get {
return $cmdTemp if ( defined($cmdTemp) );
$hash->{LOCAL} = 1;
- WriteToCloudAPI($hash, 'getChargers', 'GET') if $opt eq "charger";
- RefreshData($hash) if $opt eq "update";
+ WriteToCloudAPI( $hash, 'getChargers', 'GET' ) if $opt eq "charger";
+ RefreshData($hash) if $opt eq "update";
delete $hash->{LOCAL};
- return undef;
+ return;
}
sub Set {
@@ -397,31 +412,40 @@ sub Set {
return '"set $name" needs at least one argument' if ( int(@param) < 1 );
- my $opt = shift @param;
- my $value = join( "", @param );
+ my $opt = shift @param;
+ $value = join( "", @param );
+ my %message;
#create response, if cmd is wrong or gui asks
my $cmdTemp = _GetCmdList( $hash, $opt, \%sets );
return $cmdTemp if ( defined($cmdTemp) );
if ( $opt eq "deactivateTimer" ) {
+
+# Cascading if-elsif chain. See pages 117,118 of PBP (ControlStructures::ProhibitCascadingIfElse) kann man anders machen. Später machen wir das
RemoveInternalTimer($hash);
Log3 $name, 1,
- "EaseeWallbox_Set $name: Stopped the timer to automatically update readings";
+"EaseeWallbox_Set $name: Stopped the timer to automatically update readings";
readingsSingleUpdate( $hash, 'state', 'Initialized', 0 );
- return undef;
+ return;
}
- elsif ( $opt eq "activateTimer" ) {
+ elsif ( $opt eq "activateTimer" ) {
+
#Update once manually and then start the timer
RemoveInternalTimer($hash);
$hash->{LOCAL} = 1;
RefreshData($hash);
- delete $hash->{LOCAL};
- InternalTimer(gettimeofday()+ InternalVal($name,'INTERVAL', undef), "FHEM::EaseeWallbox::UpdateDueToTimer", $hash);
- readingsSingleUpdate($hash,'state','Started',0);
- Log3 $name, 1, sprintf("EaseeWallbox_Set %s: Updated readings and started timer to automatically update readings with interval %s", $name, InternalVal($name,'INTERVAL', undef));
+ delete $hash->{LOCAL};
+ InternalTimer( gettimeofday() + InternalVal( $name, 'INTERVAL', undef ),
+ "FHEM::EaseeWallbox::UpdateDueToTimer", $hash );
+ readingsSingleUpdate( $hash, 'state', 'Started', 0 );
+ Log3 $name, 1,
+ sprintf(
+"EaseeWallbox_Set %s: Updated readings and started timer to automatically update readings with interval %s",
+ $name, InternalVal( $name, 'INTERVAL', undef ) );
}
- elsif ( $opt eq "interval" ) {
+ elsif ( $opt eq "interval" )
+ { # interval wird immer über Attribut gesetzt. Also in die Funktion AttrFn aus Initialize
my $interval = shift @param;
$interval = 60 unless defined($interval);
@@ -430,154 +454,174 @@ sub Set {
Log3 $name, 1, "EaseeWallbox_Set $name: Set interval to" . $interval;
$hash->{INTERVAL} = $interval;
}
- elsif ( $opt eq "cableLock" ) {
- my %message;
+ elsif ( $opt eq "cableLock" ) {
+
$message{'state'} = $value;
- WriteToCloudAPI($hash, 'setCableLockState', 'POST', \%message)
- }
+ WriteToCloudAPI( $hash, 'setCableLockState', 'POST', \%message );
+ }
elsif ( $opt eq "pricePerKWH" ) {
- my %message;
+
$message{'currencyId'} = "EUR";
$message{'vat'} = "19";
$message{'costPerKWh'} = shift @param;
- WriteToCloudAPI($hash, 'setChargingPrice', 'POST', \%message)
- }
+ WriteToCloudAPI( $hash, 'setChargingPrice', 'POST', \%message );
+ }
elsif ( $opt eq "pairRfidTag" ) {
my $timeout = shift @param;
- #if (defined $timeout and /^\d+$/) { print "is a whole number\n" }
- $timeout = '60' if not defined $timeout or $timeout = '';
- my %message;
+
+ #if (defined $timeout and /^\d+$/) { print "is a whole number\n" }
+ $timeout = '60' if not defined $timeout or $timeout = '';
+
$message{'timeout'} = "60";
- WriteToCloudAPI($hash, 'setPairRFIDTag', 'POST', \%message)
- }
+ WriteToCloudAPI( $hash, 'setPairRFIDTag', 'POST', \%message );
+ }
elsif ( $opt eq "enableSmartCharging" ) {
- my %message;
+
$message{'smartCharging'} = shift @param;
- WriteToCloudAPI($hash, 'changeChargerSettings', 'POST', \%message)
- }
+ WriteToCloudAPI( $hash, 'changeChargerSettings', 'POST', \%message );
+ }
elsif ( $opt eq "enabled" ) {
- my %message;
+
$message{'enabled'} = "true";
- WriteToCloudAPI($hash, 'changeChargerSettings', 'POST', \%message)
- }
+ WriteToCloudAPI( $hash, 'changeChargerSettings', 'POST', \%message );
+ }
elsif ( $opt eq "disabled" ) {
- my %message;
+
$message{'enabled'} = "false";
- WriteToCloudAPI($hash, 'changeChargerSettings', 'POST', \%message)
- }
+ WriteToCloudAPI( $hash, 'changeChargerSettings', 'POST', \%message );
+ }
elsif ( $opt eq "authorizationRequired" ) {
- my %message;
+
$message{'authorizationRequired'} = shift @param;
- WriteToCloudAPI($hash, 'changeChargerSettings', 'POST', \%message)
- }
+ WriteToCloudAPI( $hash, 'changeChargerSettings', 'POST', \%message );
+ }
elsif ( $opt eq "enableSmartButton" ) {
- my %message;
+
$message{'smartButtonEnabled'} = shift @param;
- WriteToCloudAPI($hash, 'changeChargerSettings', 'POST', \%message)
- }
+ WriteToCloudAPI( $hash, 'changeChargerSettings', 'POST', \%message );
+ }
elsif ( $opt eq "ledStripBrightness" ) {
- my %message;
+
$message{'ledStripBrightness'} = shift @param;
- WriteToCloudAPI($hash, 'changeChargerSettings', 'POST', \%message)
- }
- else
- {
- $hash->{LOCAL} = 1;
- WriteToCloudAPI($hash, 'setStartCharging', 'POST') if $opt eq "startCharging";
- WriteToCloudAPI($hash, 'setStopCharging', 'POST') if $opt eq 'stopCharging';
- WriteToCloudAPI($hash, 'setPauseCharging', 'POST') if $opt eq 'pauseCharging';
- WriteToCloudAPI($hash, 'setResumeCharging', 'POST') if $opt eq 'resumeCharging';
- WriteToCloudAPI($hash, 'setToggleCharging', 'POST') if $opt eq 'toggleCharging';
- WriteToCloudAPI($hash, 'setUpdateFirmware', 'POST') if $opt eq 'updateFirmware';
- WriteToCloudAPI($hash, 'setOverrideChargingSchedule', 'POST') if $opt eq 'overrideChargingSchedule';
- WriteToCloudAPI($hash, 'setReboot', 'POST') if $opt eq 'reboot';
- _loadToken($hash) if $opt eq 'refreshToken';
+ WriteToCloudAPI( $hash, 'changeChargerSettings', 'POST', \%message );
+ }
+ else {
+ $hash->{LOCAL} = 1;
+ WriteToCloudAPI( $hash, 'setStartCharging', 'POST' )
+ if $opt eq "startCharging";
+ WriteToCloudAPI( $hash, 'setStopCharging', 'POST' )
+ if $opt eq 'stopCharging';
+ WriteToCloudAPI( $hash, 'setPauseCharging', 'POST' )
+ if $opt eq 'pauseCharging';
+ WriteToCloudAPI( $hash, 'setResumeCharging', 'POST' )
+ if $opt eq 'resumeCharging';
+ WriteToCloudAPI( $hash, 'setToggleCharging', 'POST' )
+ if $opt eq 'toggleCharging';
+ WriteToCloudAPI( $hash, 'setUpdateFirmware', 'POST' )
+ if $opt eq 'updateFirmware';
+ WriteToCloudAPI( $hash, 'setOverrideChargingSchedule', 'POST' )
+ if $opt eq 'overrideChargingSchedule';
+ WriteToCloudAPI( $hash, 'setReboot', 'POST' ) if $opt eq 'reboot';
+ _loadToken($hash) if $opt eq 'refreshToken';
delete $hash->{LOCAL};
}
- readingsSingleUpdate( $hash, 'state', 'Initialized', 0 );
- return undef;
+ readingsSingleUpdate( $hash, 'state', 'Initialized', 0 )
+ ; # Die Modulinstanz ist doch nicht erst bei einem set Initialized, das ist doch schon nach dem define. Wenn dann ist hier ein status ala "processing setter" oder so.
+ return;
}
sub Attr {
my ( $cmd, $name, $attrName, $attrVal ) = @_;
+
+ # hier kannst Du das setzen des Intervals umsetzen
return;
}
-sub RefreshData{
- my $hash = shift;
- my $name = $hash->{NAME};
- WriteToCloudAPI($hash, 'getChargerSite', 'GET');
- WriteToCloudAPI($hash, 'getChargerState', 'GET');
- WriteToCloudAPI($hash, 'getCurrentSession', 'GET');
- WriteToCloudAPI($hash, 'getChargerConfiguration', 'GET');
- WriteToCloudAPI($hash, 'getChargerSessionsMonthly', 'GET');
- WriteToCloudAPI($hash, 'getChargerSessionsDaily', 'GET');
+sub RefreshData {
+ my $hash = shift;
+ my $name = $hash->{NAME};
+ WriteToCloudAPI( $hash, 'getChargerSite', 'GET' );
+ WriteToCloudAPI( $hash, 'getChargerState', 'GET' );
+ WriteToCloudAPI( $hash, 'getCurrentSession', 'GET' );
+ WriteToCloudAPI( $hash, 'getChargerConfiguration', 'GET' );
+ WriteToCloudAPI( $hash, 'getChargerSessionsMonthly', 'GET' );
+ WriteToCloudAPI( $hash, 'getChargerSessionsDaily', 'GET' );
+
+ return; # immer mit einem return eine funktion beenden
}
-sub UpdateDueToTimer($) {
+sub UpdateDueToTimer {
my ($hash) = @_;
my $name = $hash->{NAME};
- #local allows call of function without adding new timer.
- #must be set before call ($hash->{LOCAL} = 1) and removed after (delete $hash->{LOCAL};)
+#local allows call of function without adding new timer.
+#must be set before call ($hash->{LOCAL} = 1) and removed after (delete $hash->{LOCAL};)
if ( !$hash->{LOCAL} ) {
RemoveInternalTimer($hash);
+
#Log3 "Test", 1, Dumper($hash);
- InternalTimer(
- gettimeofday() + InternalVal( $name, 'INTERVAL', undef ), "FHEM::EaseeWallbox::UpdateDueToTimer", $hash );
+ InternalTimer( gettimeofday() + InternalVal( $name, 'INTERVAL', undef ),
+ "FHEM::EaseeWallbox::UpdateDueToTimer", $hash );
}
- RefreshData($hash);
+
+ return RefreshData($hash);
}
sub WriteToCloudAPI {
- my $hash = shift;
- my $dpoint = shift;
- my $method = shift;
+ my $hash = shift;
+ my $dpoint = shift;
+ my $method = shift;
my $message = shift;
- my $name = $hash->{NAME};
- my $url = $hash->{APIURI} . $dpoints{$dpoint};
+ my $name = $hash->{NAME};
+ my $url = $hash->{APIURI} . $dpoints{$dpoint};
#########
# CHANGE THIS
my $payload;
- $payload = encode_json \%$message if defined $message;
+ $payload = encode_json \%$message if defined $message;
my $deviceId = "WC1";
- if ( not defined $hash ) {
- my $msg = "Error on EaseeWallbox_WriteToCloudAPI. Missing hash variable";
+ if ( not defined $hash ) {
+ my $msg =
+ "Error on EaseeWallbox_WriteToCloudAPI. Missing hash variable";
Log3 'EaseeWallbox', 1, $msg;
return $msg;
}
#Check if chargerID is required in URL and replace or alert.
- if ( $url =~ m/#ChargerID#/ ) {
+ if ( $url =~ m/#ChargerID#/x )
+ { # Regular expression without "/x" flag. See page 236 of PBP (RegularExpressions::RequireExtendedFormatting)
my $chargerId = ReadingsVal( $name, 'charger_id', undef );
if ( not defined $chargerId ) {
- my $error = "Error on EaseeWallbox_WriteToCloudAPI. Missing charger_id. Please ensure basic data is available.";
+ my $error =
+"Error on EaseeWallbox_WriteToCloudAPI. Missing charger_id. Please ensure basic data is available.";
Log3 'EaseeWallbox', 1, $error;
return $error;
}
- $url =~ s/#ChargerID#/$chargerId/g;
+ $url =~ s/#ChargerID#/$chargerId/xg
+ ; # Regular expression without "/x" flag. See page 236 of PBP (RegularExpressions::RequireExtendedFormatting)
}
#Check if siteID is required in URL and replace or alert.
- if ( $url =~ m/#SiteID#/ ) {
+ if ( $url =~ m/#SiteID#/x )
+ { # Regular expression without "/x" flag. See page 236 of PBP (RegularExpressions::RequireExtendedFormatting)
my $siteId = ReadingsVal( $name, 'site_id', undef );
if ( not defined $siteId ) {
- my $error = "Error on EaseeWallbox_WriteToCloudAPI. Missing site_id. Please ensure basic data is available.";
+ my $error =
+"Error on EaseeWallbox_WriteToCloudAPI. Missing site_id. Please ensure basic data is available.";
Log3 'EaseeWallbox', 1, $error;
return $error;
}
- $url =~ s/#SiteID#/$siteId/g;
+ $url =~ s/#SiteID#/$siteId/xg
+ ; # Regular expression without "/x" flag. See page 236 of PBP (RegularExpressions::RequireExtendedFormatting)
}
my $CurrentTokenData = _loadToken($hash);
- my $header =
- {
- "Content-Type" => "application/json;charset=UTF-8",
- "Authorization" =>
- "$CurrentTokenData->{'tokenType'} $CurrentTokenData->{'accessToken'}"
- };
+ my $header = {
+ "Content-Type" => "application/json;charset=UTF-8",
+ "Authorization" =>
+ "$CurrentTokenData->{'tokenType'} $CurrentTokenData->{'accessToken'}"
+ };
# $method ist GET oder POST
# bei POST ist $payload gleich data
@@ -603,288 +647,409 @@ sub ResponseHandling {
my $param = shift;
my $err = shift;
my $data = shift;
- my $hash = $param->{hash};
- my $name = $hash->{NAME};
+ my $hash = $param->{hash};
+ my $name = $hash->{NAME};
Log3 $name, 4, "Callback received." . $param->{url};
- if ( $err ne "" ) # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
+ if ( $err ne "" ) # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
{
- Log3 $name, 3,"error while requesting ". $param->{url}. " - $err"; # Eintrag fürs Log
+ Log3 $name, 3,
+ "error while requesting "
+ . $param->{url}
+ . " - $err"; # Eintrag fürs Log
readingsSingleUpdate( $hash, "lastResponse", "ERROR $err", 1 );
- return undef;
+ return;
}
my $code = $param->{code};
- if ($code eq 404 and $param->{dpoint} eq 'getCurrentSession'){
- readingsDelete($hash, 'session_energy' );
- readingsDelete($hash, 'session_start' );
- readingsDelete($hash, 'session_end' );
- readingsDelete($hash, 'session_chargeDurationInSeconds' );
- readingsDelete($hash, 'session_firstEnergyTransfer' );
- readingsDelete($hash, 'session_lastEnergyTransfer' );
- readingsDelete($hash, 'session_pricePerKWH' );
- readingsDelete($hash, 'session_chargingCost' );
- readingsDelete($hash, 'session_id' );
- return undef;
+ if ( $code == 404 and $param->{dpoint} eq 'getCurrentSession' )
+ { # Entweder == dann number z.B. 404 oder wenn eq dann String also '404'
+ readingsDelete( $hash, 'session_energy' );
+ readingsDelete( $hash, 'session_start' );
+ readingsDelete( $hash, 'session_end' );
+ readingsDelete( $hash, 'session_chargeDurationInSeconds' );
+ readingsDelete( $hash, 'session_firstEnergyTransfer' );
+ readingsDelete( $hash, 'session_lastEnergyTransfer' );
+ readingsDelete( $hash, 'session_pricePerKWH' );
+ readingsDelete( $hash, 'session_chargingCost' );
+ readingsDelete( $hash, 'session_id' );
+ return;
}
- if ($code >= 400){
- Log3 $name, 3,"HTTPS error while requesting ". $param->{url}. " - $code"; # Eintrag fürs Log
- readingsSingleUpdate( $hash, "lastResponse", "ERROR: HTTP Code $code", 1 );
- return undef;
+ if ( $code >= 400 ) {
+ Log3 $name, 3,
+ "HTTPS error while requesting "
+ . $param->{url}
+ . " - $code"; # Eintrag fürs Log
+ readingsSingleUpdate( $hash, "lastResponse", "ERROR: HTTP Code $code",
+ 1 );
+ return;
}
Log3 $name, 3,
- "Received non-blocking data from EaseeWallbox regarding current session ";
+ "Received non-blocking data from EaseeWallbox regarding current session ";
Log3 $name, 4, "FHEM -> EaseeWallbox: " . $param->{url};
Log3 $name, 4, "FHEM -> EaseeWallbox: " . $param->{message}
- if ( defined $param->{message} );
+ if ( defined $param->{message} );
Log3 $name, 4, "EaseeWallbox -> FHEM: " . $data;
Log3 $name, 5, '$err: ' . $err;
Log3 $name, 5, "method: " . $param->{method};
Log3 $name, 2, "Something gone wrong"
- if ( $data =~ "/EaseeWallboxMode/" );
-
- my $d;
- eval {
- my $d = decode_json($data);
- Log3 $name, 5, 'Decoded: ' . Dumper($d);
- Log3 $name, 5, 'Ref of d: ' . ref($d);
-
- if ( defined $d and $d ne '' and ref($d) eq "HASH" or (ref($d) eq "ARRAY" and $d gt 0)) {
- if($param->{dpoint} eq 'getChargers')
- {
- my $site = $d->[0];
- my $circuit = $site->{circuits}->[0];
- my $charger = $circuit->{chargers}->[0];
-
- readingsBeginUpdate($hash);
- my $chargerId = $charger->{id};
- readingsBulkUpdate( $hash, "site_id", $site->{id} );
- readingsBulkUpdate( $hash, "site_key", $site->{siteKey} );
- readingsBulkUpdate( $hash, "charger_id", $chargerId );
- readingsBulkUpdate( $hash, "charger_name", $charger->{name} );
- readingsBulkUpdate( $hash, "lastResponse", 'OK - getReaders', 1);
- readingsEndUpdate( $hash, 1 );
- WriteToCloudAPI($hash, 'getChargerConfiguration', 'GET');
- return;
- }
+ if ( $data =~ "/EaseeWallboxMode/" );
- if($param->{dpoint} eq 'getChargerSessionsDaily')
- {
- Log3 $name, 5, 'Evaluating getChargerSessionsDaily';
- my @x = $d;
- my @a = (-5..-1);
- readingsBeginUpdate($hash);
- for(@a){
- Log3 $name, 5, 'laeuft noch: '. $_;
- readingsBulkUpdate( $hash, "daily_".($_ +1)."_energy", sprintf("%.2f",$d->[$_]->{'totalEnergyUsage'}) );
- readingsBulkUpdate( $hash, "daily_".($_ +1)."_cost", sprintf("%.2f",$d->[$_]->{'totalCost'}) );
- }
- readingsEndUpdate( $hash, 1 );
- return;
- }
+ my $decoded_json;
- if($param->{dpoint} eq 'getChargerSessionsMonthly')
- {
- Log3 $name, 5, 'Evaluating getChargerSessionsMonthly';
- my @x = $d;
- my @a = (-6..-1);
- readingsBeginUpdate($hash);
- for(@a){
- Log3 $name, 5, 'laeuft noch: '. $_;
- readingsBulkUpdate( $hash, "monthly_".($_ +1)."_energy", sprintf("%.2f",$d->[$_]->{'totalEnergyUsage'}) );
- readingsBulkUpdate( $hash, "monthly_".($_ +1)."_cost", sprintf("%.2f",$d->[$_]->{'totalCost'}) );
- }
- readingsEndUpdate( $hash, 1 );
- return;
- }
+ eval { $decoded_json = decode_json($data) }; # statt eval ist es empfohlen catch try zu verwenden. Machen wir später
+ if ($@) {
+ Log3 $name, 3, "GardenaSmartBridge ($name) - JSON error while request";
+ }
+ Log3 $name, 5, 'Decoded: ' . Dumper($decoded_json);
+ Log3 $name, 5, 'Ref of d: ' . ref($decoded_json);
- if($param->{dpoint} eq 'getChargerConfiguration')
- {
- readingsBeginUpdate($hash);
- readingsBulkUpdate( $hash, "isEnabled", $d->{isEnabled} );
- readingsBulkUpdate( $hash, "isCablePermanentlyLocked", $d->{lockCablePermanently} );
- readingsBulkUpdate($hash, "isAuthorizationRequired", $d->{authorizationRequired});
- readingsBulkUpdate( $hash, "isRemoteStartRequired", $d->{remoteStartRequired} );
- readingsBulkUpdate( $hash, "isSmartButtonEnabled", $d->{smartButtonEnabled} );
- readingsBulkUpdate( $hash, "wiFiSSID", $d->{wiFiSSID} );
- readingsBulkUpdate( $hash, "phaseModeId", $d->{phaseMode} );
- readingsBulkUpdate( $hash, "phaseMode",$phaseModes{ $d->{phaseMode} } );
- readingsBulkUpdate($hash, "isLocalAuthorizationRequired",$d->{localAuthorizationRequired});
- readingsBulkUpdate( $hash, "maxChargerCurrent", $d->{maxChargerCurrent} );
- readingsBulkUpdate( $hash, "ledStripBrightness", $d->{ledStripBrightness} );
- #readingsBulkUpdate( $hash, "charger_offlineChargingMode",
- # $d->{offlineChargingMode} );
- #readingsBulkUpdate( $hash, "charger_circuitMaxCurrentP1",
- # $d->{circuitMaxCurrentP1} );
- #readingsBulkUpdate( $hash, "charger_circuitMaxCurrentP2",
- # $d->{circuitMaxCurrentP2} );
- #readingsBulkUpdate( $hash, "charger_circuitMaxCurrentP3",
- # $d->{circuitMaxCurrentP3} );
- #readingsBulkUpdate( $hash, "charger_enableIdleCurrent",
- # $d->{enableIdleCurrent} );
- #readingsBulkUpdate(
- # $hash,
- # "charger_limitToSinglePhaseCharging",
- # $d->{limitToSinglePhaseCharging}
- #);
-
- #readingsBulkUpdate( $hash, "charger_localNodeType",
- # $d->{localNodeType} );
-
- #readingsBulkUpdate( $hash, "charger_localRadioChannel",
- # $d->{localRadioChannel} );
- #readingsBulkUpdate( $hash, "charger_localShortAddress",
- # $d->{localShortAddress} );
- #readingsBulkUpdate(
- # $hash,
- # "charger_localParentAddrOrNumOfNodes",
- # $d->{localParentAddrOrNumOfNodes}
- #);
- #readingsBulkUpdate(
- # $hash,
- # "charger_localPreAuthorizeEnabled",
- # $d->{localPreAuthorizeEnabled}
- #);
- #readingsBulkUpdate(
- # $hash,
- # "charger_allowOfflineTxForUnknownId",
- # $d->{allowOfflineTxForUnknownId}
- #);
- #readingsBulkUpdate( $hash, "chargingSchedule",
- # $d->{chargingSchedule} );
- readingsBulkUpdate( $hash, "lastResponse", 'OK - getChargerConfig', 1);
- readingsEndUpdate( $hash, 1 );
- return undef;
- }
+ my $value;
- if($param->{dpoint} eq 'getCurrentSession')
- {
- readingsBeginUpdate($hash);
- readingsBulkUpdate( $hash, "session_energy", sprintf("%.2f",$d->{sessionEnergy}) );
- my $value = defined $d->{sessionStart} ? _transcodeDate($d->{sessionStart}) : 'N/A';
- readingsBulkUpdate( $hash, "session_start", $value );
- my $value = defined $d->{sessionEnd} ? _transcodeDate($d->{sessionEnd}) : 'N/A';
- readingsBulkUpdate( $hash, "session_end", $value );
- readingsBulkUpdate( $hash, "session_chargeDurationInSeconds", $d->{chargeDurationInSeconds} );
- my $value = defined $d->{firstEnergyTransferPeriodStart} ? _transcodeDate($d->{firstEnergyTransferPeriodStart}) : 'N/A';
- readingsBulkUpdate( $hash, "session_firstEnergyTransfer", $value );
- my $value = defined $d->{lastEnergyTransferPeriodStart} ? _transcodeDate($d->{lastEnergyTransferPeriodStart}) : 'N/A';
- readingsBulkUpdate( $hash, "session_lastEnergyTransfer", $value );
- readingsBulkUpdate( $hash, "session_pricePerKWH", $d->{pricePrKwhIncludingVat} );
- readingsBulkUpdate( $hash, "session_chargingCost", sprintf("%.2f",$d->{costIncludingVat}) );
- readingsBulkUpdate( $hash, "session_id", $d->{sessionId} );
- readingsBulkUpdate( $hash, "lastResponse", 'OK - getCurrentSession', 1);
- readingsEndUpdate( $hash, 1 );
- return undef;
- }
+ if ( defined $decoded_json
+ and $decoded_json ne ''
+ and ref($decoded_json) eq "HASH"
+ or ( ref($decoded_json) eq "ARRAY" and $decoded_json > 0 ) )
+ {
+ if ( $param->{dpoint} eq 'getChargers' ) {
+ Processing_DpointGetChargers( $hash, $decode_json );
+ return;
+ }
- if($param->{dpoint} eq 'getChargerSite')
- {
- readingsBeginUpdate($hash);
- readingsBulkUpdate( $hash, "cost_perKWh", $d->{costPerKWh} );
- readingsBulkUpdate( $hash, "cost_perKwhExcludeVat", $d->{costPerKwhExcludeVat} );
- readingsBulkUpdate( $hash, "cost_vat", $d->{vat} );
- readingsBulkUpdate( $hash, "cost_currency", $d->{currencyId} );
- #readingsBulkUpdate( $hash, "site_ratedCurrent", $d->{ratedCurrent} );
- #readingsBulkUpdate( $hash, "site_createdOn", $d->{createdOn} );
- #readingsBulkUpdate( $hash, "site_updatedOn", $d->{updatedOn} );
- readingsBulkUpdate( $hash, "lastResponse", 'OK - getChargerSite', 1);
- readingsEndUpdate( $hash, 1 );
- return undef;
- }
+ if ( $param->{dpoint} eq 'getChargerSessionsDaily' ) {
+ Processing_DpointGetChargerSessionsDaily( $hash, $decode_json );
+ return;
+ }
- if($param->{dpoint} eq 'getChargerState')
- {
- readingsBeginUpdate($hash);
- readingsBulkUpdate( $hash, "operationModeCode", $d->{chargerOpMode} );
- readingsBulkUpdate( $hash, "operationMode", $operationModes{ $d->{chargerOpMode} } );
- readingsBulkUpdate( $hash, "power", sprintf("%.2f",$d->{totalPower}) );
- readingsBulkUpdate( $hash, "kWhInSession", sprintf("%.2f",$d->{sessionEnergy}) );
- readingsBulkUpdate( $hash, "phase", $d->{outputPhase} );
- readingsBulkUpdate( $hash, "latestPulse", _transcodeDate($d->{latestPulse}) );
- readingsBulkUpdate( $hash, "current", $d->{outputCurrent} );
- readingsBulkUpdate( $hash, "dynamicCurrent", $d->{dynamicChargerCurrent} );
- readingsBulkUpdate( $hash, "reasonCodeForNoCurrent", $d->{reasonForNoCurrent} );
- readingsBulkUpdate( $hash, "reasonForNoCurrent", $reasonsForNoCurrent{ $d->{reasonForNoCurrent} } );
- readingsBulkUpdate( $hash, "errorCode", $d->{errorCode} );
- readingsBulkUpdate( $hash, "fatalErrorCode", $d->{fatalErrorCode} );
- readingsBulkUpdate( $hash, "lifetimeEnergy", sprintf("%.2f",$d->{lifetimeEnergy}) );
- readingsBulkUpdate( $hash, "online", $d->{isOnline} );
- readingsBulkUpdate( $hash, "voltage", sprintf("%.2f",$d->{voltage}) );
- readingsBulkUpdate( $hash, "wifi_rssi", $d->{wiFiRSSI} );
- readingsBulkUpdate( $hash, "wifi_apEnabled", $d->{wiFiAPEnabled} );
- readingsBulkUpdate( $hash, "cell_rssi", $d->{cellRSSI} );
- readingsBulkUpdate( $hash, "lastResponse", 'OK - getChargerState', 1);
- readingsEndUpdate( $hash, 1 );
- return undef;
+ # Und so weiter und so weiter mit den einzelnen Funktionen !!!
+
+ if ( $param->{dpoint} eq 'getChargerSessionsMonthly' ) {
+ Log3 $name, 5, 'Evaluating getChargerSessionsMonthly';
+ my @x = $decoded_json;
+ my @a = ( -6 .. -1 );
+ readingsBeginUpdate($hash);
+ for (@a) {
+ Log3 $name, 5, 'laeuft noch: ' . $_;
+ readingsBulkUpdate(
+ $hash,
+ "monthly_" . ( $_ + 1 ) . "_energy",
+ sprintf(
+ "%.2f", $decoded_json->[$_]->{'totalEnergyUsage'}
+ )
+ );
+ readingsBulkUpdate(
+ $hash,
+ "monthly_" . ( $_ + 1 ) . "_cost",
+ sprintf( "%.2f", $decoded_json->[$_]->{'totalCost'} )
+ );
}
+ readingsEndUpdate( $hash, 1 );
+ return;
+ }
- $d = $d->[0] if ref($d) eq "ARRAY";
- readingsSingleUpdate( $hash, "lastResponse", 'OK - Action: '. $commandCodes{$d->{commandId}}, 1 ) if defined $d->{commandId};
- readingsSingleUpdate( $hash, "lastResponse", 'ERROR: '. $d->{title}.' ('.$d->{status}.')', 1 ) if defined $d->{status} and defined $d->{title};
- return undef;
- } else {
- readingsSingleUpdate( $hash, "lastResponse", 'OK - empty', 1);
- return undef;
+ if ( $param->{dpoint} eq 'getChargerConfiguration' ) {
+ readingsBeginUpdate($hash);
+ readingsBulkUpdate( $hash, "isEnabled",
+ $decoded_json->{isEnabled} );
+ readingsBulkUpdate( $hash, "isCablePermanentlyLocked",
+ $decoded_json->{lockCablePermanently} );
+ readingsBulkUpdate( $hash, "isAuthorizationRequired",
+ $decoded_json->{authorizationRequired} );
+ readingsBulkUpdate( $hash, "isRemoteStartRequired",
+ $decoded_json->{remoteStartRequired} );
+ readingsBulkUpdate( $hash, "isSmartButtonEnabled",
+ $decoded_json->{smartButtonEnabled} );
+ readingsBulkUpdate( $hash, "wiFiSSID", $decoded_json->{wiFiSSID} );
+ readingsBulkUpdate( $hash, "phaseModeId",
+ $decoded_json->{phaseMode} );
+ readingsBulkUpdate( $hash, "phaseMode",
+ $phaseModes{ $decoded_json->{phaseMode} } );
+ readingsBulkUpdate(
+ $hash,
+ "isLocalAuthorizationRequired",
+ $decoded_json->{localAuthorizationRequired}
+ );
+ readingsBulkUpdate( $hash, "maxChargerCurrent",
+ $decoded_json->{maxChargerCurrent} );
+ readingsBulkUpdate( $hash, "ledStripBrightness",
+ $decoded_json->{ledStripBrightness} );
+
+ #readingsBulkUpdate( $hash, "charger_offlineChargingMode",
+ # $decoded_json->{offlineChargingMode} );
+ #readingsBulkUpdate( $hash, "charger_circuitMaxCurrentP1",
+ # $decoded_json->{circuitMaxCurrentP1} );
+ #readingsBulkUpdate( $hash, "charger_circuitMaxCurrentP2",
+ # $decoded_json->{circuitMaxCurrentP2} );
+ #readingsBulkUpdate( $hash, "charger_circuitMaxCurrentP3",
+ # $decoded_json->{circuitMaxCurrentP3} );
+ #readingsBulkUpdate( $hash, "charger_enableIdleCurrent",
+ # $decoded_json->{enableIdleCurrent} );
+ #readingsBulkUpdate(
+ # $hash,
+ # "charger_limitToSinglePhaseCharging",
+ # $decoded_json->{limitToSinglePhaseCharging}
+ #);
+
+ #readingsBulkUpdate( $hash, "charger_localNodeType",
+ # $decoded_json->{localNodeType} );
+
+ #readingsBulkUpdate( $hash, "charger_localRadioChannel",
+ # $decoded_json->{localRadioChannel} );
+ #readingsBulkUpdate( $hash, "charger_localShortAddress",
+ # $decoded_json->{localShortAddress} );
+ #readingsBulkUpdate(
+ # $hash,
+ # "charger_localParentAddrOrNumOfNodes",
+ # $decoded_json->{localParentAddrOrNumOfNodes}
+ #);
+ #readingsBulkUpdate(
+ # $hash,
+ # "charger_localPreAuthorizeEnabled",
+ # $decoded_json->{localPreAuthorizeEnabled}
+ #);
+ #readingsBulkUpdate(
+ # $hash,
+ # "charger_allowOfflineTxForUnknownId",
+ # $decoded_json->{allowOfflineTxForUnknownId}
+ #);
+ #readingsBulkUpdate( $hash, "chargingSchedule",
+ # $decoded_json->{chargingSchedule} );
+ readingsBulkUpdate( $hash, "lastResponse",
+ 'OK - getChargerConfig', 1 );
+ readingsEndUpdate( $hash, 1 );
+ return;
+ }
+
+ if ( $param->{dpoint} eq 'getCurrentSession' ) {
+ readingsBeginUpdate($hash);
+ readingsBulkUpdate( $hash, "session_energy",
+ sprintf( "%.2f", $decoded_json->{sessionEnergy} ) );
+ $value =
+ defined $decoded_json->{sessionStart}
+ ? _transcodeDate( $decoded_json->{sessionStart} )
+ : 'N/A';
+ readingsBulkUpdate( $hash, "session_start", $value );
+ $value =
+ defined $decoded_json->{sessionEnd}
+ ? _transcodeDate( $decoded_json->{sessionEnd} )
+ : 'N/A';
+ readingsBulkUpdate( $hash, "session_end", $value );
+ readingsBulkUpdate(
+ $hash,
+ "session_chargeDurationInSeconds",
+ $decoded_json->{chargeDurationInSeconds}
+ );
+ $value =
+ defined $decoded_json->{firstEnergyTransferPeriodStart}
+ ? _transcodeDate(
+ $decoded_json->{firstEnergyTransferPeriodStart} )
+ : 'N/A';
+ readingsBulkUpdate( $hash, "session_firstEnergyTransfer", $value );
+ $value =
+ defined $decoded_json->{lastEnergyTransferPeriodStart}
+ ? _transcodeDate( $decoded_json->{lastEnergyTransferPeriodStart} )
+ : 'N/A';
+ readingsBulkUpdate( $hash, "session_lastEnergyTransfer", $value );
+ readingsBulkUpdate( $hash, "session_pricePerKWH",
+ $decoded_json->{pricePrKwhIncludingVat} );
+ readingsBulkUpdate( $hash, "session_chargingCost",
+ sprintf( "%.2f", $decoded_json->{costIncludingVat} ) );
+ readingsBulkUpdate( $hash, "session_id",
+ $decoded_json->{sessionId} );
+ readingsBulkUpdate( $hash, "lastResponse",
+ 'OK - getCurrentSession', 1 );
+ readingsEndUpdate( $hash, 1 );
+ return;
}
- };
+
+ if ( $param->{dpoint} eq 'getChargerSite' ) {
+ readingsBeginUpdate($hash);
+ readingsBulkUpdate( $hash, "cost_perKWh",
+ $decoded_json->{costPerKWh} );
+ readingsBulkUpdate( $hash, "cost_perKwhExcludeVat",
+ $decoded_json->{costPerKwhExcludeVat} );
+ readingsBulkUpdate( $hash, "cost_vat", $decoded_json->{vat} );
+ readingsBulkUpdate( $hash, "cost_currency",
+ $decoded_json->{currencyId} );
+
+#readingsBulkUpdate( $hash, "site_ratedCurrent", $decoded_json->{ratedCurrent} );
+#readingsBulkUpdate( $hash, "site_createdOn", $decoded_json->{createdOn} );
+#readingsBulkUpdate( $hash, "site_updatedOn", $decoded_json->{updatedOn} );
+ readingsBulkUpdate( $hash, "lastResponse",
+ 'OK - getChargerSite', 1 );
+ readingsEndUpdate( $hash, 1 );
+ return;
+ }
+
+ if ( $param->{dpoint} eq 'getChargerState' ) {
+ readingsBeginUpdate($hash);
+ readingsBulkUpdate( $hash, "operationModeCode",
+ $decoded_json->{chargerOpMode} );
+ readingsBulkUpdate( $hash, "operationMode",
+ $operationModes{ $decoded_json->{chargerOpMode} } );
+ readingsBulkUpdate( $hash, "power",
+ sprintf( "%.2f", $decoded_json->{totalPower} ) );
+ readingsBulkUpdate( $hash, "kWhInSession",
+ sprintf( "%.2f", $decoded_json->{sessionEnergy} ) );
+ readingsBulkUpdate( $hash, "phase", $decoded_json->{outputPhase} );
+ readingsBulkUpdate( $hash, "latestPulse",
+ _transcodeDate( $decoded_json->{latestPulse} ) );
+ readingsBulkUpdate( $hash, "current",
+ $decoded_json->{outputCurrent} );
+ readingsBulkUpdate( $hash, "dynamicCurrent",
+ $decoded_json->{dynamicChargerCurrent} );
+ readingsBulkUpdate( $hash, "reasonCodeForNoCurrent",
+ $decoded_json->{reasonForNoCurrent} );
+ readingsBulkUpdate( $hash, "reasonForNoCurrent",
+ $reasonsForNoCurrent{ $decoded_json->{reasonForNoCurrent} } );
+ readingsBulkUpdate( $hash, "errorCode",
+ $decoded_json->{errorCode} );
+ readingsBulkUpdate( $hash, "fatalErrorCode",
+ $decoded_json->{fatalErrorCode} );
+ readingsBulkUpdate( $hash, "lifetimeEnergy",
+ sprintf( "%.2f", $decoded_json->{lifetimeEnergy} ) );
+ readingsBulkUpdate( $hash, "online", $decoded_json->{isOnline} );
+ readingsBulkUpdate( $hash, "voltage",
+ sprintf( "%.2f", $decoded_json->{voltage} ) );
+ readingsBulkUpdate( $hash, "wifi_rssi", $decoded_json->{wiFiRSSI} );
+ readingsBulkUpdate( $hash, "wifi_apEnabled",
+ $decoded_json->{wiFiAPEnabled} );
+ readingsBulkUpdate( $hash, "cell_rssi", $decoded_json->{cellRSSI} );
+ readingsBulkUpdate( $hash, "lastResponse",
+ 'OK - getChargerState', 1 );
+ readingsEndUpdate( $hash, 1 );
+ return;
+ }
+
+ $decoded_json = $decoded_json->[0] if ref($decoded_json) eq "ARRAY";
+ readingsSingleUpdate( $hash, "lastResponse",
+ 'OK - Action: ' . $commandCodes{ $decoded_json->{commandId} }, 1 )
+ if defined $decoded_json->{commandId};
+ readingsSingleUpdate(
+ $hash,
+ "lastResponse",
+ 'ERROR: '
+ . $decoded_json->{title} . ' ('
+ . $decoded_json->{status} . ')',
+ 1
+ )
+ if defined $decoded_json->{status} and defined $decoded_json->{title};
+ return;
+ }
+ else {
+ readingsSingleUpdate( $hash, "lastResponse", 'OK - empty', 1 );
+ return;
+ }
if ($@) {
- readingsSingleUpdate( $hash, "lastResponse", 'ERROR while deconding response: '. $@, 1 );
+ readingsSingleUpdate( $hash, "lastResponse",
+ 'ERROR while deconding response: ' . $@, 1 );
Log3 $name, 5, 'Failure decoding: ' . $@;
- }
+ }
return;
}
+sub Processing_DpointGetChargers {
+ my $hash = shift;
+ my $decoded_json = shift;
+
+ my $site = $decoded_json->[0];
+ my $circuit = $site->{circuits}->[0];
+ my $charger = $circuit->{chargers}->[0];
+
+ readingsBeginUpdate($hash);
+ my $chargerId = $charger->{id};
+ readingsBulkUpdate( $hash, "site_id", $site->{id} );
+ readingsBulkUpdate( $hash, "site_key", $site->{siteKey} );
+ readingsBulkUpdate( $hash, "charger_id", $chargerId );
+ readingsBulkUpdate( $hash, "charger_name", $charger->{name} );
+ readingsBulkUpdate( $hash, "lastResponse", 'OK - getReaders', 1 );
+ readingsEndUpdate( $hash, 1 );
+
+ WriteToCloudAPI( $hash, 'getChargerConfiguration', 'GET' );
+
+ return;
+}
+
+sub Processing_DpointGetChargerSessionsDaily {
+ my $hash = shift;
+ my $decoded_json = shift;
+
+ my $name = $hash->{NAME};
+
+ Log3 $name, 5, 'Evaluating getChargerSessionsDaily';
+
+ my @x = $decoded_json;
+ my @a = ( -5 .. -1 );
+
+ readingsBeginUpdate($hash);
+ for (@a) {
+ Log3 $name, 5, 'laeuft noch: ' . $_;
+ readingsBulkUpdate(
+ $hash,
+ "daily_" . ( $_ + 1 ) . "_energy",
+ sprintf( "%.2f", $decoded_json->[$_]->{'totalEnergyUsage'} )
+ );
+ readingsBulkUpdate(
+ $hash,
+ "daily_" . ( $_ + 1 ) . "_cost",
+ sprintf( "%.2f", $decoded_json->[$_]->{'totalCost'} )
+ );
+ }
+
+ readingsEndUpdate( $hash, 1 );
+
+ return;
+}
sub _loadToken {
my $hash = shift;
my $name = $hash->{NAME};
my $tokenLifeTime = $hash->{TOKEN_LIFETIME};
$tokenLifeTime = 0 if ( !defined $tokenLifeTime || $tokenLifeTime eq '' );
- my $Token = undef;
+ my $token;
- $Token = $hash->{'.TOKEN'};
+ $token = $hash->{'.TOKEN'};
if ( $@ || $tokenLifeTime < gettimeofday() ) {
Log3 $name, 5,
- "EaseeWallbox $name" . ": "
- . "Error while loading: $@ ,requesting new one"
- if $@;
+ "EaseeWallbox $name" . ": "
+ . "Error while loading: $@ ,requesting new one"
+ if $@;
Log3 $name, 5,
- "EaseeWallbox $name" . ": "
- . "Token is expired, requesting new one"
- if $tokenLifeTime < gettimeofday();
- $Token = _newTokenRequest($hash);
+ "EaseeWallbox $name" . ": " . "Token is expired, requesting new one"
+ if $tokenLifeTime < gettimeofday();
+ $token = _newTokenRequest($hash);
}
else {
Log3 $name, 5,
- "EaseeWallbox $name" . ": "
- . "Token expires at "
- . localtime($tokenLifeTime);
+ "EaseeWallbox $name" . ": "
+ . "Token expires at "
+ . localtime($tokenLifeTime);
# if token is about to expire, refresh him
if ( ( $tokenLifeTime - 3700 ) < gettimeofday() ) {
Log3 $name, 5,
- "EaseeWallbox $name" . ": "
- . "Token will expire soon, refreshing";
- $Token = _tokenRefresh($hash);
+ "EaseeWallbox $name" . ": "
+ . "Token will expire soon, refreshing";
+ $token = _tokenRefresh($hash);
}
}
- return $Token if $Token;
+
+ $token = $token ? $token : undef;
+ return $token;
}
sub _newTokenRequest {
- my $hash = shift;
- my $name = $hash->{NAME};
- my $password
- = _decrypt( InternalVal( $name, 'Password', undef ) );
+ my $hash = shift;
+ my $name = $hash->{NAME};
+ my $password = _decrypt( InternalVal( $name, 'Password', undef ) );
my $username = InternalVal( $name, 'Username', undef );
Log3 $name, 5, "EaseeWallbox $name" . ": " . "calling NewTokenRequest()";
@@ -910,17 +1075,17 @@ sub _newTokenRequest {
if ( $err ne "" ) {
Log3 $name, 3,
- "EaseeWallbox $name" . ": "
- . "NewTokenRequest: Error while requesting "
- . $param->{url}
- . " - $err";
+ "EaseeWallbox $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, "EaseeWallbox $name" . ": "
- . "NewTokenRequest: decode_json failed, invalid json. error: $@ ";
+ . "NewTokenRequest: decode_json failed, invalid json. error: $@ ";
}
else {
#write token data in hash
@@ -930,15 +1095,17 @@ sub _newTokenRequest {
# token lifetime management
if ( defined($decoded_data) ) {
- $hash->{TOKEN_LIFETIME}
- = gettimeofday() + $decoded_data->{'expiresIn'};
+ $hash->{TOKEN_LIFETIME} =
+ gettimeofday() + $decoded_data->{'expiresIn'};
}
$hash->{TOKEN_LIFETIME_HR} = localtime( $hash->{TOKEN_LIFETIME} );
Log3 $name, 5,
- "EaseeWallbox $name" . ": "
- . "Retrived new authentication token successfully. Valid until "
- . localtime( $hash->{TOKEN_LIFETIME} );
- $hash->{STATE} = "reachable";
+ "EaseeWallbox $name" . ": "
+ . "Retrived new authentication token successfully. Valid until "
+ . localtime( $hash->{TOKEN_LIFETIME} );
+
+# $hash->{STATE} = "reachable"; # niemals $hash->{STATE} über demn Hash direkt zuweisen
+ readingsSingleUpdate( $hash, 'state', 'reachable', 1 );
return $decoded_data;
}
}
@@ -976,11 +1143,13 @@ sub _tokenRefresh {
if ( $err ne "" ) {
Log3 $name, 3,
- "EaseeWallbox $name" . ": "
- . "TokenRefresh: Error in token retrival while requesting "
- . $param->{url}
- . " - $err";
- $hash->{STATE} = "error";
+ "EaseeWallbox $name" . ": "
+ . "TokenRefresh: Error in token retrival while requesting "
+ . $param->{url}
+ . " - $err";
+
+ # $hash->{STATE} = "error";
+ readingsSingleUpdate( $hash, 'state', 'error', 1 );
}
elsif ( $returnData ne "" ) {
@@ -989,10 +1158,12 @@ sub _tokenRefresh {
if ($@) {
Log3 $name, 3,
- "EaseeWallbox $name" . ": "
- . "TokenRefresh: decode_json failed, invalid json. error:$@\n"
- if $@;
- $hash->{STATE} = "error";
+ "EaseeWallbox $name" . ": "
+ . "TokenRefresh: decode_json failed, invalid json. error:$@\n"
+ if $@;
+
+ # $hash->{STATE} = "error";
+ readingsSingleUpdate( $hash, 'state', 'error', 1 );
}
else {
#write token data in file
@@ -1002,26 +1173,30 @@ sub _tokenRefresh {
}
# token lifetime management
- $hash->{TOKEN_LIFETIME}
- = gettimeofday() + $decoded_data->{'expires_in'};
+ $hash->{TOKEN_LIFETIME} =
+ gettimeofday() + $decoded_data->{'expires_in'};
$hash->{TOKEN_LIFETIME_HR} = localtime( $hash->{TOKEN_LIFETIME} );
Log3 $name, 5,
- "EaseeWallbox $name" . ": "
- . "TokenRefresh: Refreshed authentication token successfully. Valid until "
- . localtime( $hash->{TOKEN_LIFETIME} );
- $hash->{STATE} = "reachable";
+ "EaseeWallbox $name" . ": "
+ . "TokenRefresh: Refreshed authentication token successfully. Valid until "
+ . localtime( $hash->{TOKEN_LIFETIME} );
+
+ # $hash->{STATE} = "reachable";
+ readingsSingleUpdate( $hash, 'state', 'reachable', 1 );
return $decoded_data;
}
}
return;
}
-sub _encrypt($) {
+sub _encrypt {
my ($decoded) = @_;
my $key = getUniqueId();
my $encoded;
- return $decoded if ( $decoded =~ /crypt:/ );
+ return $decoded
+ if ( $decoded =~ /crypt:/x )
+ ; # Regular expression without "/x" flag. See page 236 of PBP (RegularExpressions::RequireExtendedFormatting)
for my $char ( split //, $decoded ) {
my $encode = chop($key);
@@ -1032,16 +1207,21 @@ sub _encrypt($) {
return 'crypt:' . $encoded;
}
-sub _decrypt($) {
+sub _decrypt {
my ($encoded) = @_;
my $key = getUniqueId();
my $decoded;
- return $encoded if ( $encoded !~ /crypt:/ );
+ return $encoded
+ if ( $encoded !~ /crypt:/x )
+ ; # Regular expression without "/x" flag. See page 236 of PBP (RegularExpressions::RequireExtendedFormatting)
- $encoded = $1 if ( $encoded =~ /crypt:(.*)/ );
+ $encoded = $1
+ if ( $encoded =~ /crypt:(.*)/x )
+ ; # Regular expression without "/x" flag. See page 236 of PBP (RegularExpressions::RequireExtendedFormatting)
- for my $char ( map { pack( 'C', hex($_) ) } ( $encoded =~ /(..)/g ) ) {
+ for my $char ( map { pack( 'C', hex($_) ) } ( $encoded =~ /(..)/xg ) )
+ { # Regular expression without "/x" flag. See page 236 of PBP (RegularExpressions::RequireExtendedFormatting)
my $decode = chop($key);
$decoded .= chr( ord($char) ^ ord($decode) );
$key = $decode . $key;
@@ -1052,18 +1232,20 @@ sub _decrypt($) {
1;
-sub _transcodeDate{
- my $datestr = shift;
+sub _transcodeDate {
+ my $datestr = shift;
Log3 'EaseeWallbox', 5, 'date to parse: ' . $datestr;
- my $strp = DateTime::Format::Strptime->new(on_error=>'croak',
- pattern => '%Y-%m-%dT%H:%M:%S%z');
+ my $strp = DateTime::Format::Strptime->new(
+ on_error => 'croak',
+ pattern => '%Y-%m-%dT%H:%M:%S%z'
+ );
my $dt = $strp->parse_datetime($datestr);
$dt->set_time_zone('Europe/Berlin');
+
return $dt->strftime('%Y-%m-%d %H:%M:%S');
}
-
-
+1; # Ein Modul muss immer mit 1; enden
=pod
=begin html