X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Focpp%2F1.6%2FOCPP16RequestService.ts;h=571ac066fc5710159c7bc5f968b9554689eb26de;hb=a95873d8d308a20a7151346ac70d9a551f1a06f5;hp=18d6dac0e3d777b208a2b412e09d1330a4eacbff;hpb=78085c42a98966f7118f2575b2fde9a386399c94;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ocpp/1.6/OCPP16RequestService.ts b/src/charging-station/ocpp/1.6/OCPP16RequestService.ts index 18d6dac0..571ac066 100644 --- a/src/charging-station/ocpp/1.6/OCPP16RequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16RequestService.ts @@ -2,10 +2,6 @@ import { AuthorizeRequest, - OCPP16AuthorizeResponse, - OCPP16StartTransactionResponse, - OCPP16StopTransactionReason, - OCPP16StopTransactionResponse, StartTransactionRequest, StopTransactionRequest, } from '../../../types/ocpp/1.6/Transaction'; @@ -16,21 +12,17 @@ import { 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 { OCPP16BootNotificationResponse } from '../../../types/ocpp/1.6/Responses'; -import { OCPP16ChargePointErrorCode } from '../../../types/ocpp/1.6/ChargePointErrorCode'; -import { OCPP16ChargePointStatus } from '../../../types/ocpp/1.6/ChargePointStatus'; -import { OCPP16DiagnosticsStatus } from '../../../types/ocpp/1.6/DiagnosticsStatus'; +import { MeterValuesRequest } from '../../../types/ocpp/1.6/MeterValues'; import { OCPP16ServiceUtils } from './OCPP16ServiceUtils'; import OCPPError from '../../../exception/OCPPError'; import OCPPRequestService from '../OCPPRequestService'; import type OCPPResponseService from '../OCPPResponseService'; -import { SendParams } from '../../../types/ocpp/Requests'; import Utils from '../../../utils/Utils'; const moduleName = 'OCPP16RequestService'; @@ -43,196 +35,32 @@ export default class OCPP16RequestService extends OCPPRequestService { super(chargingStation, ocppResponseService); } - public async sendHeartbeat(params?: SendParams): Promise { - const payload: HeartbeatRequest = {}; - await this.sendMessage(Utils.generateUUID(), payload, OCPP16RequestCommand.HEARTBEAT, params); - } - - public async sendBootNotification( - chargePointModel: string, - chargePointVendor: string, - chargeBoxSerialNumber?: string, - firmwareVersion?: string, - chargePointSerialNumber?: string, - iccid?: string, - imsi?: string, - meterSerialNumber?: string, - meterType?: string, + public async sendMessageHandler( + commandName: OCPP16RequestCommand, + commandParams?: JsonType, params?: SendParams - ): Promise { - const payload: OCPP16BootNotificationRequest = { - chargePointModel, - chargePointVendor, - ...(!Utils.isUndefined(chargeBoxSerialNumber) && { chargeBoxSerialNumber }), - ...(!Utils.isUndefined(chargePointSerialNumber) && { chargePointSerialNumber }), - ...(!Utils.isUndefined(firmwareVersion) && { firmwareVersion }), - ...(!Utils.isUndefined(iccid) && { iccid }), - ...(!Utils.isUndefined(imsi) && { imsi }), - ...(!Utils.isUndefined(meterSerialNumber) && { meterSerialNumber }), - ...(!Utils.isUndefined(meterType) && { meterType }), - }; - return (await this.sendMessage( - Utils.generateUUID(), - payload, - OCPP16RequestCommand.BOOT_NOTIFICATION, - { ...params, skipBufferingOnError: true } - )) as OCPP16BootNotificationResponse; - } - - public async sendStatusNotification( - connectorId: number, - status: OCPP16ChargePointStatus, - errorCode: OCPP16ChargePointErrorCode = OCPP16ChargePointErrorCode.NO_ERROR - ): Promise { - const payload: StatusNotificationRequest = { - connectorId, - errorCode, - status, - }; - await this.sendMessage(Utils.generateUUID(), payload, OCPP16RequestCommand.STATUS_NOTIFICATION); - } - - public async sendAuthorize( - connectorId: number, - idTag?: string - ): Promise { - const payload: AuthorizeRequest = { - ...(!Utils.isUndefined(idTag) ? { idTag } : { idTag: Constants.DEFAULT_IDTAG }), - }; - this.chargingStation.getConnectorStatus(connectorId).authorizeIdTag = idTag; - return (await this.sendMessage( - Utils.generateUUID(), - payload, - OCPP16RequestCommand.AUTHORIZE - )) as OCPP16AuthorizeResponse; - } - - public async sendStartTransaction( - connectorId: number, - idTag?: string - ): Promise { - const payload: StartTransactionRequest = { - connectorId, - ...(!Utils.isUndefined(idTag) ? { idTag } : { idTag: Constants.DEFAULT_IDTAG }), - meterStart: this.chargingStation.getEnergyActiveImportRegisterByConnectorId(connectorId), - timestamp: new Date().toISOString(), - }; - return (await this.sendMessage( - Utils.generateUUID(), - payload, - OCPP16RequestCommand.START_TRANSACTION - )) as OCPP16StartTransactionResponse; - } - - public async sendStopTransaction( - transactionId: number, - meterStop: number, - idTag?: string, - reason: OCPP16StopTransactionReason = OCPP16StopTransactionReason.NONE - ): Promise { - let connectorId: number; - for (const id of this.chargingStation.connectors.keys()) { - if (id > 0 && this.chargingStation.getConnectorStatus(id)?.transactionId === transactionId) { - connectorId = id; - break; - } + ): Promise { + if (Object.values(OCPP16RequestCommand).includes(commandName)) { + return this.sendMessage( + Utils.generateUUID(), + this.buildCommandPayload(commandName, commandParams), + commandName, + params + ); } - const transactionEndMeterValue = OCPP16ServiceUtils.buildTransactionEndMeterValue( - this.chargingStation, - connectorId, - meterStop - ); - // FIXME: should be a callback, each OCPP commands implementation must do only one job - this.chargingStation.getBeginEndMeterValues() && - this.chargingStation.getOcppStrictCompliance() && - !this.chargingStation.getOutOfOrderEndMeterValues() && - (await this.sendTransactionEndMeterValues( - connectorId, - transactionId, - transactionEndMeterValue - )); - const payload: StopTransactionRequest = { - transactionId, - ...(!Utils.isUndefined(idTag) && { idTag }), - meterStop, - timestamp: new Date().toISOString(), - ...(reason && { reason }), - ...(this.chargingStation.getTransactionDataMeterValues() && { - transactionData: OCPP16ServiceUtils.buildTransactionDataMeterValues( - this.chargingStation.getConnectorStatus(connectorId).transactionBeginMeterValue, - transactionEndMeterValue - ), - }), - }; - return (await this.sendMessage( - Utils.generateUUID(), - payload, - OCPP16RequestCommand.STOP_TRANSACTION - )) as OCPP16StartTransactionResponse; - } - - public async sendMeterValues( - connectorId: number, - transactionId: number, - interval: number - ): Promise { - const meterValue = 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 { - 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 { - const payload: MeterValuesRequest = { - connectorId, - transactionId, - meterValue: [endMeterValue], - }; - await this.sendMessage(Utils.generateUUID(), payload, OCPP16RequestCommand.METER_VALUES); - } - - public async sendDiagnosticsStatusNotification( - diagnosticsStatus: OCPP16DiagnosticsStatus - ): Promise { - const payload: DiagnosticsStatusNotificationRequest = { - status: diagnosticsStatus, - }; - await this.sendMessage( - Utils.generateUUID(), - payload, - OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION + throw new OCPPError( + ErrorType.NOT_SUPPORTED, + `${moduleName}.sendMessageHandler: Unsupported OCPP command ${commandName}`, + commandName, + { commandName } ); } private buildCommandPayload( commandName: OCPP16RequestCommand, - commandParams: JsonType + commandParams?: JsonType ): JsonType { + let connectorId: number; switch (commandName) { case OCPP16RequestCommand.AUTHORIZE: return { @@ -272,15 +100,15 @@ export default class OCPP16RequestService extends OCPPRequestService { 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; case OCPP16RequestCommand.STATUS_NOTIFICATION: return { connectorId: commandParams?.connectorId, - errorCode: commandParams?.errorCode, status: commandParams?.status, + errorCode: commandParams?.errorCode, } as StatusNotificationRequest; case OCPP16RequestCommand.START_TRANSACTION: return { @@ -294,6 +122,9 @@ export default class OCPP16RequestService extends OCPPRequestService { timestamp: new Date().toISOString(), } as StartTransactionRequest; case OCPP16RequestCommand.STOP_TRANSACTION: + connectorId = this.chargingStation.getConnectorIdByTransactionId( + commandParams?.transactionId as number + ); return { transactionId: commandParams?.transactionId, ...(!Utils.isUndefined(commandParams?.idTag) && { idTag: commandParams.idTag }), @@ -302,11 +133,10 @@ export default class OCPP16RequestService extends OCPPRequestService { ...(commandParams?.reason && { reason: commandParams.reason }), ...(this.chargingStation.getTransactionDataMeterValues() && { transactionData: OCPP16ServiceUtils.buildTransactionDataMeterValues( - this.chargingStation.getConnectorStatus(commandParams?.connectorId as number) - .transactionBeginMeterValue, + this.chargingStation.getConnectorStatus(connectorId).transactionBeginMeterValue, OCPP16ServiceUtils.buildTransactionEndMeterValue( this.chargingStation, - commandParams?.connectorId as number, + connectorId, commandParams?.meterStop as number ) ), @@ -316,7 +146,7 @@ export default class OCPP16RequestService extends OCPPRequestService { throw new OCPPError( ErrorType.NOT_SUPPORTED, // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - `Unsupported OCPP command: ${commandName}`, + `${moduleName}.buildCommandPayload: Unsupported OCPP command: ${commandName}`, commandName, { commandName } );