Skip to content

Commit 28823b9

Browse files
committed
Add EVBox model
1 parent 468260a commit 28823b9

File tree

5 files changed

+112
-1
lines changed

5 files changed

+112
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import DefaultOCPP16 from 'lib/ChargeStation/configurations/default-ocpp-16';
2+
import {
3+
EventTypes as e,
4+
EventTypes16 as e16,
5+
} from 'lib/ChargeStation/eventHandlers/event-types';
6+
import overrideSessionUid from 'lib/ChargeStation/eventHandlers/ocpp-16/evbox/override-session-uid';
7+
import { calculateCostsAndSendReceipt } from 'lib/ChargeStation/eventHandlers/ocpp-16/evbox/handle-session-stopped';
8+
import sendStatusNotificationFinishing from 'lib/ChargeStation/eventHandlers/ocpp-16/send-status-notification-finishing';
9+
import sendStatusNotificationAvailable from 'lib/ChargeStation/eventHandlers/ocpp-16/send-status-notification-available';
10+
import handleTransactionStoppedUI from 'lib/ChargeStation/eventHandlers/ocpp-16/handle-transaction-stopped-ui';
11+
import sendAuthorizeOrStartTransaction from 'lib/ChargeStation/eventHandlers/ocpp-16/send-authorize-or-start-transaction';
12+
13+
export default {
14+
...DefaultOCPP16,
15+
[e.SessionStartInitiated]: [
16+
overrideSessionUid,
17+
sendAuthorizeOrStartTransaction,
18+
],
19+
[e16.StopTransactionAccepted]: [
20+
sendStatusNotificationFinishing,
21+
sendStatusNotificationAvailable,
22+
calculateCostsAndSendReceipt,
23+
handleTransactionStoppedUI,
24+
],
25+
};

src/lib/ChargeStation/configurations/index.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import AlpitronicCCVOCPP16 from './alpitronic-ccv-ocpp-16';
44
import SichargeOCPP16 from './sicharge-ocpp-16';
55
import AdsTecOCPP16 from './ads-tec-ocpp-16';
66
import ETotemOCPP16 from './e-totem-ocpp-16';
7-
import MadicLafonOCPP16 from 'lib/ChargeStation/configurations/madic-lafon-ocpp-16';
7+
import MadicLafonOCPP16 from './madic-lafon-ocpp-16';
8+
import EVBoxOCPP16 from './evbox-ocpp-16';
89

910
const options = {
1011
'default-ocpp1.6': DefaultOCPP16,
@@ -14,6 +15,7 @@ const options = {
1415
'ads-tec-ocpp1.6': AdsTecOCPP16,
1516
'e-totem-ocpp1.6': ETotemOCPP16,
1617
'madic/lafon-ocpp1.6': MadicLafonOCPP16,
18+
'evbox-ocpp1.6': EVBoxOCPP16,
1719
};
1820

1921
export function getOCPPConfigurationOptions() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { ChargeStationEventHandler } from 'lib/ChargeStation/eventHandlers';
2+
import { AuthorizationType } from 'lib/settings';
3+
4+
const vendorId = 'com.g2mobility';
5+
const messageIdCardTxReport = 'CardTxReport';
6+
7+
export const calculateCostsAndSendReceipt: ChargeStationEventHandler = async (
8+
params
9+
) => {
10+
const { session, chargepoint } = params;
11+
12+
if (session.options.authorizationType !== AuthorizationType.CreditCard) {
13+
return; // session will stop the normal route
14+
}
15+
16+
// Calculations below are just general approximations of how costs may be applied.
17+
const costPerMinute = chargepoint.configuration.getVariableValue(
18+
'TariffCostCtrlr.EMVDefaultProfile.CostPerMinute'
19+
) as number;
20+
const costPerkWh = chargepoint.configuration.getVariableValue(
21+
'TariffCostCtrlr.EMVDefaultProfile.CostPerkWh'
22+
) as number;
23+
24+
const startTime = session.startTime;
25+
const stopTime = session.stopTime as Date;
26+
const durationMinutes =
27+
(stopTime.getTime() - startTime.getTime()) / 1000 / 60;
28+
29+
const durationCost = durationMinutes * costPerMinute;
30+
const kWhCost = session.kwhElapsed * costPerkWh;
31+
const sessionCost = durationCost + kWhCost;
32+
33+
chargepoint.writeCall('DataTransfer', {
34+
vendorId,
35+
messageId: messageIdCardTxReport,
36+
data: JSON.stringify({
37+
tx_ID: Number(session.transactionId),
38+
tx_Time: new Date().toISOString(),
39+
priceSchemeID: 'DEFAULT',
40+
costID: null,
41+
totalTaxedCost: Number(sessionCost.toFixed(2)),
42+
report: 'CARTE BANCAIRE',
43+
}),
44+
});
45+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { ChargeStationEventHandler } from 'lib/ChargeStation/eventHandlers';
2+
import { AuthorizationType } from 'lib/settings';
3+
4+
const overrideSessionUid: ChargeStationEventHandler = async (params) => {
5+
const { session, chargepoint } = params;
6+
if (session.options.authorizationType !== AuthorizationType.CreditCard) {
7+
return; // retain current idTag
8+
}
9+
10+
const prefix = chargepoint.configuration.getVariableValue(
11+
'AuthCtrlr.NFCPCCID.IdTagPrefix'
12+
) as string;
13+
14+
session.options.uid = `${prefix.replace('*', '')}${Math.floor(Math.random() * 999999)}`;
15+
session.options.skipAuthorize = true; // always skipped for card payment cases
16+
};
17+
18+
export default overrideSessionUid;

src/lib/settings.ts

+21
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ const isETotem = (settings: Settings) =>
5959
settings.chargePointModel === 'e-totem';
6060
const isMadicLafon = (settings: Settings) =>
6161
settings.chargePointModel === 'madic/lafon';
62+
const isEVBox = (settings: Settings) => settings.chargePointModel === 'evbox';
6263

6364
export const settingsList: SettingsListSetting<ChargeStationSetting>[] = [
6465
{
@@ -307,6 +308,26 @@ export const defaultVariableConfig16: Variable16[] = [
307308
value: 0,
308309
predicate: isMadicLafon,
309310
},
311+
{
312+
key: 'AuthCtrlr.NFCPCCID.IdTagPrefix',
313+
description: 'Id tag prefix for sessions authorized via payment card',
314+
value: '',
315+
predicate: isEVBox,
316+
},
317+
{
318+
key: 'TariffCostCtrlr.EMVDefaultProfile.CostPerMinute',
319+
description:
320+
'Default cost per minute for sessions authorized via payment card',
321+
value: 0,
322+
predicate: isEVBox,
323+
},
324+
{
325+
key: 'TariffCostCtrlr.EMVDefaultProfile.CostPerkWh',
326+
description:
327+
'Default cost per kWh for sessions authorized via payment card',
328+
value: 0,
329+
predicate: isEVBox,
330+
},
310331
{
311332
key: 'SupportedFileTransferProtocols',
312333
description: 'Supported file transfer protocols',

0 commit comments

Comments
 (0)