224 lines
6.0 KiB
Perl
224 lines
6.0 KiB
Perl
package FHEM::EaseeWallbox;
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Data::Dumper;
|
|
use utf8;
|
|
use Encode qw( encode_utf8 );
|
|
use HttpUtils;
|
|
|
|
# try to use JSON::MaybeXS wrapper
|
|
# for chance of better performance + open code
|
|
eval {
|
|
require JSON::MaybeXS;
|
|
import JSON::MaybeXS qw( decode_json encode_json );
|
|
1;
|
|
} or do {
|
|
|
|
# try to use JSON wrapper
|
|
# for chance of better performance
|
|
eval {
|
|
# JSON preference order
|
|
local $ENV{PERL_JSON_BACKEND} =
|
|
'Cpanel::JSON::XS,JSON::XS,JSON::PP,JSON::backportPP'
|
|
unless ( defined( $ENV{PERL_JSON_BACKEND} ) );
|
|
|
|
require JSON;
|
|
import JSON qw( decode_json encode_json );
|
|
1;
|
|
} or do {
|
|
|
|
# In rare cases, Cpanel::JSON::XS may
|
|
# be installed but JSON|JSON::MaybeXS not ...
|
|
eval {
|
|
require Cpanel::JSON::XS;
|
|
import Cpanel::JSON::XS qw(decode_json encode_json);
|
|
1;
|
|
} or do {
|
|
|
|
# In rare cases, JSON::XS may
|
|
# be installed but JSON not ...
|
|
eval {
|
|
require JSON::XS;
|
|
import JSON::XS qw(decode_json encode_json);
|
|
1;
|
|
} or do {
|
|
|
|
# Fallback to built-in JSON which SHOULD
|
|
# be available since 5.014 ...
|
|
eval {
|
|
require JSON::PP;
|
|
import JSON::PP qw(decode_json encode_json);
|
|
1;
|
|
} or do {
|
|
|
|
# Fallback to JSON::backportPP in really rare cases
|
|
require JSON::backportPP;
|
|
import JSON::backportPP qw(decode_json encode_json);
|
|
1;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
# 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);
|
|
|
|
## Import der FHEM Funktionen
|
|
#-- Run before package compilation
|
|
BEGIN {
|
|
# Import from main context
|
|
GP_Import(
|
|
qw(
|
|
readingFnAttributes
|
|
)
|
|
);
|
|
}
|
|
|
|
## Datapoint, all behind API URI
|
|
my %dpoints = (
|
|
getOAuthToken => 'accounts/login',
|
|
getRefreshToken => 'accounts/refresh_token',
|
|
getProfile => 'accounts/profile',
|
|
getChargingSession => 'chargers/#ChargerID#/sessions/ongoing',
|
|
getChargers => 'accounts/chargers',
|
|
getProducts => 'accounts/products?userId=#UserId#',
|
|
getChargerSite => 'chargers/#ChargerID#/site',
|
|
getChargerDetails => 'chargers/#ChargerID#/details',
|
|
getChargerConfiguration => 'chargers/#ChargerID#/config',
|
|
getChargerSessionsMonthly => 'sessions/charger/#ChargerID#/monthly',
|
|
getChargerSessionsDaily => 'sessions/charger/#ChargerID#/daily',
|
|
getChargerState => 'chargers/#ChargerID#/state',
|
|
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',
|
|
);
|
|
|
|
#Private function to evaluate command-lists
|
|
# private funktionen beginnen immer mit _
|
|
|
|
#############################
|
|
sub getCmdList {
|
|
|
|
return $retVal;
|
|
}
|
|
|
|
sub Initialize {
|
|
my ($hash) = @_;
|
|
|
|
$hash->{DefFn} = \&Define;
|
|
$hash->{UndefFn} = \&Undef;
|
|
$hash->{SetFn} = \&Set;
|
|
$hash->{GetFn} = \&Get;
|
|
$hash->{AttrFn} = \&Attr;
|
|
$hash->{ReadFn} = \&Read;
|
|
$hash->{WriteFn} = \&Write;
|
|
|
|
# Da dies kein 2 stuffiges Modul ist brauchst Du das hier nicht
|
|
$hash->{Clients} = ':EaseeWallbox:';
|
|
$hash->{MatchList} = { '1:EaseeWallbox' => '^EaseeWallbox;.*' };
|
|
|
|
$hash->{AttrList} =
|
|
'expertMode:yes,no '
|
|
. 'ledStuff:yes,no '
|
|
. 'SmartCharging:true,false '
|
|
. $readingFnAttributes;
|
|
|
|
Log 3, "EaseeWallbox module initialized.";
|
|
|
|
return; # Jede Funktion muss mit einem return enden
|
|
}
|
|
|
|
sub Define {
|
|
my ( $hash, $def ) = @_;
|
|
|
|
# set API URI as Internal Key
|
|
$hash->{APIURI} = 'https://api.easee.cloud/api/';
|
|
|
|
return;
|
|
}
|
|
|
|
sub Undef {
|
|
my ( $hash, $arg ) = @_;
|
|
|
|
return;
|
|
}
|
|
|
|
sub Get {
|
|
my ( $hash, $name, @args ) = @_;
|
|
|
|
return;
|
|
}
|
|
|
|
sub Set {
|
|
my ( $hash, $name, @param ) = @_;
|
|
|
|
return;
|
|
}
|
|
|
|
sub WriteToCloudAPI {
|
|
my $hash = shift;
|
|
my $dpoint = shift;
|
|
|
|
# ...
|
|
# ...
|
|
# $method ist GET oder POST
|
|
# bei POST ist $payload gleich data
|
|
|
|
::HttpUtils_NonblockingGet(
|
|
{
|
|
url => $hash->{URL} . $dpoints{$dpoint},
|
|
timeout => 15,
|
|
incrementalTimeout => 1,
|
|
hash => $hash,
|
|
dpoint => $dpoint,
|
|
device_id => $deviceId,
|
|
data => $payload,
|
|
method => $method,
|
|
header => $header,
|
|
callback => \&ResponseHandling
|
|
}
|
|
);
|
|
|
|
return;
|
|
}
|
|
|
|
sub ResponseHandling {
|
|
my $param = shift;
|
|
my $err = shift;
|
|
my $data = shift;
|
|
|
|
# Nach Auswertung von err kannst Du anhand von $param->{dpoint} eine Auswertung der Daten machen
|
|
|
|
#...
|
|
#...
|
|
|
|
return;
|
|
}
|
|
|
|
1;
|
|
|
|
=pod
|
|
=begin html
|
|
|
|
|
|
=end html
|
|
|
|
=cut
|