Use eslint extension for import sorting instead of unmaintained external ones
[e-mobility-charging-stations-simulator.git] / src / charging-station / ocpp / 1.6 / OCPP16RequestService.ts
CommitLineData
c8eeb62b
JB
1// Partial Copyright Jerome Benoit. 2021. All Rights Reserved.
2
8114d10e 3import OCPPError from '../../../exception/OCPPError';
5cc4b63b 4import { JsonObject, JsonType } from '../../../types/JsonType';
f22266fd 5import { OCPP16RequestCommand } from '../../../types/ocpp/1.6/Requests';
8114d10e 6import { ErrorType } from '../../../types/ocpp/ErrorType';
be9b0d50 7import { RequestParams } from '../../../types/ocpp/Requests';
8114d10e 8import Constants from '../../../utils/Constants';
c0560973 9import Utils from '../../../utils/Utils';
8114d10e
JB
10import type ChargingStation from '../../ChargingStation';
11import OCPPRequestService from '../OCPPRequestService';
12import type OCPPResponseService from '../OCPPResponseService';
13import { OCPP16ServiceUtils } from './OCPP16ServiceUtils';
c0560973 14
909dcf2d
JB
15const moduleName = 'OCPP16RequestService';
16
c0560973 17export default class OCPP16RequestService extends OCPPRequestService {
08f130a0 18 public constructor(ocppResponseService: OCPPResponseService) {
909dcf2d 19 if (new.target?.name === moduleName) {
06127450 20 throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
9f2e3130 21 }
08f130a0 22 super(ocppResponseService);
9f2e3130
JB
23 }
24
5cc4b63b 25 public async requestHandler<Request extends JsonType, Response extends JsonType>(
08f130a0 26 chargingStation: ChargingStation,
94a464f9 27 commandName: OCPP16RequestCommand,
5cc4b63b 28 commandParams?: JsonType,
be9b0d50 29 params?: RequestParams
f22266fd 30 ): Promise<Response> {
94a464f9 31 if (Object.values(OCPP16RequestCommand).includes(commandName)) {
f22266fd 32 return (await this.sendMessage(
08f130a0 33 chargingStation,
94a464f9 34 Utils.generateUUID(),
08f130a0 35 this.buildRequestPayload<Request>(chargingStation, commandName, commandParams),
94a464f9
JB
36 commandName,
37 params
f22266fd 38 )) as unknown as Response;
94a464f9
JB
39 }
40 throw new OCPPError(
41 ErrorType.NOT_SUPPORTED,
1c959f1f 42 `${moduleName}.requestHandler: Unsupported OCPP command ${commandName}`,
94a464f9
JB
43 commandName,
44 { commandName }
45 );
c0560973
JB
46 }
47
5cc4b63b 48 private buildRequestPayload<Request extends JsonType>(
08f130a0 49 chargingStation: ChargingStation,
78085c42 50 commandName: OCPP16RequestCommand,
5cc4b63b 51 commandParams?: JsonType
f22266fd 52 ): Request {
68c993d5 53 let connectorId: number;
5cc4b63b 54 commandParams = commandParams as JsonObject;
78085c42
JB
55 switch (commandName) {
56 case OCPP16RequestCommand.AUTHORIZE:
57 return {
58 ...(!Utils.isUndefined(commandParams?.idTag)
59 ? { idTag: commandParams.idTag }
60 : { idTag: Constants.DEFAULT_IDTAG }),
f22266fd 61 } as unknown as Request;
78085c42
JB
62 case OCPP16RequestCommand.BOOT_NOTIFICATION:
63 return {
64 chargePointModel: commandParams?.chargePointModel,
65 chargePointVendor: commandParams?.chargePointVendor,
66 ...(!Utils.isUndefined(commandParams?.chargeBoxSerialNumber) && {
67 chargeBoxSerialNumber: commandParams.chargeBoxSerialNumber,
68 }),
69 ...(!Utils.isUndefined(commandParams?.chargePointSerialNumber) && {
70 chargePointSerialNumber: commandParams.chargePointSerialNumber,
71 }),
72 ...(!Utils.isUndefined(commandParams?.firmwareVersion) && {
73 firmwareVersion: commandParams.firmwareVersion,
74 }),
75 ...(!Utils.isUndefined(commandParams?.iccid) && { iccid: commandParams.iccid }),
76 ...(!Utils.isUndefined(commandParams?.imsi) && { imsi: commandParams.imsi }),
77 ...(!Utils.isUndefined(commandParams?.meterSerialNumber) && {
78 meterSerialNumber: commandParams.meterSerialNumber,
79 }),
80 ...(!Utils.isUndefined(commandParams?.meterType) && {
81 meterType: commandParams.meterType,
82 }),
f22266fd 83 } as unknown as Request;
78085c42
JB
84 case OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION:
85 return {
86 status: commandParams?.diagnosticsStatus,
f22266fd 87 } as unknown as Request;
78085c42 88 case OCPP16RequestCommand.HEARTBEAT:
f22266fd 89 return {} as unknown as Request;
78085c42
JB
90 case OCPP16RequestCommand.METER_VALUES:
91 return {
92 connectorId: commandParams?.connectorId,
93 transactionId: commandParams?.transactionId,
5e62b119
JB
94 meterValue: Array.isArray(commandParams?.meterValue)
95 ? commandParams?.meterValue
78085c42 96 : [commandParams?.meterValue],
f22266fd 97 } as unknown as Request;
78085c42
JB
98 case OCPP16RequestCommand.STATUS_NOTIFICATION:
99 return {
100 connectorId: commandParams?.connectorId,
78085c42 101 status: commandParams?.status,
93b4a429 102 errorCode: commandParams?.errorCode,
f22266fd 103 } as unknown as Request;
78085c42
JB
104 case OCPP16RequestCommand.START_TRANSACTION:
105 return {
106 connectorId: commandParams?.connectorId,
107 ...(!Utils.isUndefined(commandParams?.idTag)
108 ? { idTag: commandParams?.idTag }
109 : { idTag: Constants.DEFAULT_IDTAG }),
08f130a0 110 meterStart: chargingStation.getEnergyActiveImportRegisterByConnectorId(
78085c42
JB
111 commandParams?.connectorId as number
112 ),
113 timestamp: new Date().toISOString(),
f22266fd 114 } as unknown as Request;
78085c42 115 case OCPP16RequestCommand.STOP_TRANSACTION:
08f130a0 116 connectorId = chargingStation.getConnectorIdByTransactionId(
f479a792
JB
117 commandParams?.transactionId as number
118 );
78085c42
JB
119 return {
120 transactionId: commandParams?.transactionId,
121 ...(!Utils.isUndefined(commandParams?.idTag) && { idTag: commandParams.idTag }),
122 meterStop: commandParams?.meterStop,
123 timestamp: new Date().toISOString(),
124 ...(commandParams?.reason && { reason: commandParams.reason }),
08f130a0 125 ...(chargingStation.getTransactionDataMeterValues() && {
78085c42 126 transactionData: OCPP16ServiceUtils.buildTransactionDataMeterValues(
08f130a0 127 chargingStation.getConnectorStatus(connectorId).transactionBeginMeterValue,
78085c42 128 OCPP16ServiceUtils.buildTransactionEndMeterValue(
08f130a0 129 chargingStation,
68c993d5 130 connectorId,
78085c42
JB
131 commandParams?.meterStop as number
132 )
133 ),
134 }),
f22266fd 135 } as unknown as Request;
78085c42
JB
136 default:
137 throw new OCPPError(
138 ErrorType.NOT_SUPPORTED,
139 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1c959f1f 140 `${moduleName}.buildRequestPayload: Unsupported OCPP command: ${commandName}`,
78085c42
JB
141 commandName,
142 { commandName }
143 );
144 }
145 }
c0560973 146}