// Partial Copyright Jerome Benoit. 2021. All Rights Reserved.
-import {
- AuthorizeRequest,
- StartTransactionRequest,
- StopTransactionRequest,
-} from '../../../types/ocpp/1.6/Transaction';
-import {
- DiagnosticsStatusNotificationRequest,
- HeartbeatRequest,
- OCPP16BootNotificationRequest,
- OCPP16RequestCommand,
- StatusNotificationRequest,
-} from '../../../types/ocpp/1.6/Requests';
-import { MeterValuesRequest, OCPP16MeterValue } from '../../../types/ocpp/1.6/MeterValues';
-import { ResponseType, SendParams } from '../../../types/ocpp/Requests';
-
import type ChargingStation from '../../ChargingStation';
import Constants from '../../../utils/Constants';
import { ErrorType } from '../../../types/ocpp/ErrorType';
import { JsonType } from '../../../types/JsonType';
-import { OCPP16DiagnosticsStatus } from '../../../types/ocpp/1.6/DiagnosticsStatus';
+import { OCPP16RequestCommand } from '../../../types/ocpp/1.6/Requests';
import { OCPP16ServiceUtils } from './OCPP16ServiceUtils';
import OCPPError from '../../../exception/OCPPError';
import OCPPRequestService from '../OCPPRequestService';
import type OCPPResponseService from '../OCPPResponseService';
+import { RequestParams } from '../../../types/ocpp/Requests';
import Utils from '../../../utils/Utils';
const moduleName = 'OCPP16RequestService';
super(chargingStation, ocppResponseService);
}
- public async sendMessageHandler(
+ public async requestHandler<Request extends JsonType, Response extends JsonType>(
commandName: OCPP16RequestCommand,
commandParams?: JsonType,
- params?: SendParams
- ): Promise<ResponseType> {
+ params?: RequestParams
+ ): Promise<Response> {
if (Object.values(OCPP16RequestCommand).includes(commandName)) {
- return this.sendMessage(
+ return (await this.sendMessage(
Utils.generateUUID(),
- this.buildCommandPayload(commandName, commandParams),
+ this.buildRequestPayload<Request>(commandName, commandParams),
commandName,
params
- );
+ )) as unknown as Response;
}
throw new OCPPError(
ErrorType.NOT_SUPPORTED,
- `${moduleName}.sendMessageHandler: Unsupported OCPP command ${commandName}`,
+ `${moduleName}.requestHandler: Unsupported OCPP command ${commandName}`,
commandName,
{ commandName }
);
}
- public async sendMeterValues(
- connectorId: number,
- transactionId: number,
- interval: number
- ): Promise<void> {
- const meterValue: OCPP16MeterValue = OCPP16ServiceUtils.buildMeterValue(
- this.chargingStation,
- connectorId,
- transactionId,
- interval
- );
- const payload: MeterValuesRequest = {
- connectorId,
- transactionId,
- meterValue: [meterValue],
- };
- await this.sendMessage(Utils.generateUUID(), payload, OCPP16RequestCommand.METER_VALUES);
- }
-
- public async sendTransactionBeginMeterValues(
- connectorId: number,
- transactionId: number,
- beginMeterValue: OCPP16MeterValue
- ): Promise<void> {
- const payload: MeterValuesRequest = {
- connectorId,
- transactionId,
- meterValue: [beginMeterValue],
- };
- await this.sendMessage(Utils.generateUUID(), payload, OCPP16RequestCommand.METER_VALUES);
- }
-
- public async sendTransactionEndMeterValues(
- connectorId: number,
- transactionId: number,
- endMeterValue: OCPP16MeterValue
- ): Promise<void> {
- const payload: MeterValuesRequest = {
- connectorId,
- transactionId,
- meterValue: [endMeterValue],
- };
- await this.sendMessage(Utils.generateUUID(), payload, OCPP16RequestCommand.METER_VALUES);
- }
-
- public async sendDiagnosticsStatusNotification(
- diagnosticsStatus: OCPP16DiagnosticsStatus
- ): Promise<void> {
- const payload: DiagnosticsStatusNotificationRequest = {
- status: diagnosticsStatus,
- };
- await this.sendMessage(
- Utils.generateUUID(),
- payload,
- OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION
- );
- }
-
- private buildCommandPayload(
+ private buildRequestPayload<Request extends JsonType>(
commandName: OCPP16RequestCommand,
commandParams?: JsonType
- ): JsonType {
+ ): Request {
let connectorId: number;
switch (commandName) {
case OCPP16RequestCommand.AUTHORIZE:
...(!Utils.isUndefined(commandParams?.idTag)
? { idTag: commandParams.idTag }
: { idTag: Constants.DEFAULT_IDTAG }),
- } as AuthorizeRequest;
+ } as unknown as Request;
case OCPP16RequestCommand.BOOT_NOTIFICATION:
return {
chargePointModel: commandParams?.chargePointModel,
...(!Utils.isUndefined(commandParams?.meterType) && {
meterType: commandParams.meterType,
}),
- } as OCPP16BootNotificationRequest;
+ } as unknown as Request;
case OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION:
return {
status: commandParams?.diagnosticsStatus,
- } as DiagnosticsStatusNotificationRequest;
+ } as unknown as Request;
case OCPP16RequestCommand.HEARTBEAT:
- return {} as HeartbeatRequest;
+ return {} as unknown as Request;
case OCPP16RequestCommand.METER_VALUES:
return {
connectorId: commandParams?.connectorId,
transactionId: commandParams?.transactionId,
- meterValue: Array.isArray(commandParams?.meterValues)
- ? commandParams?.meterValues
+ meterValue: Array.isArray(commandParams?.meterValue)
+ ? commandParams?.meterValue
: [commandParams?.meterValue],
- } as MeterValuesRequest;
+ } as unknown as Request;
case OCPP16RequestCommand.STATUS_NOTIFICATION:
return {
connectorId: commandParams?.connectorId,
status: commandParams?.status,
errorCode: commandParams?.errorCode,
- } as StatusNotificationRequest;
+ } as unknown as Request;
case OCPP16RequestCommand.START_TRANSACTION:
return {
connectorId: commandParams?.connectorId,
commandParams?.connectorId as number
),
timestamp: new Date().toISOString(),
- } as StartTransactionRequest;
+ } as unknown as Request;
case OCPP16RequestCommand.STOP_TRANSACTION:
- for (const id of this.chargingStation.connectors.keys()) {
- if (
- id > 0 &&
- this.chargingStation.getConnectorStatus(id)?.transactionId ===
- commandParams?.transactionId
- ) {
- connectorId = id;
- break;
- }
- }
+ connectorId = this.chargingStation.getConnectorIdByTransactionId(
+ commandParams?.transactionId as number
+ );
return {
transactionId: commandParams?.transactionId,
...(!Utils.isUndefined(commandParams?.idTag) && { idTag: commandParams.idTag }),
)
),
}),
- } as StopTransactionRequest;
+ } as unknown as Request;
default:
throw new OCPPError(
ErrorType.NOT_SUPPORTED,
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
- `${moduleName}.buildCommandPayload: Unsupported OCPP command: ${commandName}`,
+ `${moduleName}.buildRequestPayload: Unsupported OCPP command: ${commandName}`,
commandName,
{ commandName }
);