X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcharging-station%2Focpp%2F1.6%2FOCPP16IncomingRequestService.ts;h=d09e69a1576b64412154e71df2778d157b2315d4;hb=a723e7e9df355545fc6a41bdcbb9debfae22db5f;hp=64314475c8b42ea7ff6e90fd8a854b2d808e7540;hpb=e3018bc4b27b43106073e4c4cda031cc37715027;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts index 64314475..d09e69a1 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -4,12 +4,12 @@ import fs from 'fs'; import path from 'path'; import { URL, fileURLToPath } from 'url'; -import { JSONSchemaType } from 'ajv'; +import type { JSONSchemaType } from 'ajv'; import { Client, FTPResponse } from 'basic-ftp'; import tar from 'tar'; import OCPPError from '../../../exception/OCPPError'; -import { JsonType } from '../../../types/JsonType'; +import type { JsonObject, JsonType } from '../../../types/JsonType'; import { OCPP16ChargePointErrorCode } from '../../../types/ocpp/1.6/ChargePointErrorCode'; import { OCPP16ChargePointStatus } from '../../../types/ocpp/1.6/ChargePointStatus'; import { @@ -21,10 +21,6 @@ import { OCPP16SupportedFeatureProfiles, } from '../../../types/ocpp/1.6/Configuration'; import { OCPP16DiagnosticsStatus } from '../../../types/ocpp/1.6/DiagnosticsStatus'; -import { - OCPP16MeterValuesRequest, - OCPP16MeterValuesResponse, -} from '../../../types/ocpp/1.6/MeterValues'; import { ChangeAvailabilityRequest, ChangeConfigurationRequest, @@ -47,7 +43,7 @@ import { SetChargingProfileRequest, UnlockConnectorRequest, } from '../../../types/ocpp/1.6/Requests'; -import { +import type { ChangeAvailabilityResponse, ChangeConfigurationResponse, ClearChargingProfileResponse, @@ -68,13 +64,11 @@ import { OCPP16StartTransactionRequest, OCPP16StartTransactionResponse, OCPP16StopTransactionReason, - OCPP16StopTransactionRequest, - OCPP16StopTransactionResponse, } from '../../../types/ocpp/1.6/Transaction'; -import { OCPPConfigurationKey } from '../../../types/ocpp/Configuration'; +import type { OCPPConfigurationKey } from '../../../types/ocpp/Configuration'; import { ErrorType } from '../../../types/ocpp/ErrorType'; -import { IncomingRequestHandler } from '../../../types/ocpp/Requests'; -import { DefaultResponse } from '../../../types/ocpp/Responses'; +import type { IncomingRequestHandler } from '../../../types/ocpp/Requests'; +import type { DefaultResponse } from '../../../types/ocpp/Responses'; import Constants from '../../../utils/Constants'; import logger from '../../../utils/Logger'; import Utils from '../../../utils/Utils'; @@ -88,18 +82,7 @@ const moduleName = 'OCPP16IncomingRequestService'; export default class OCPP16IncomingRequestService extends OCPPIncomingRequestService { private incomingRequestHandlers: Map; - private resetJsonSchema: JSONSchemaType; - private clearCacheJsonSchema: JSONSchemaType; - private getConfigurationJsonSchema: JSONSchemaType; - private changeConfigurationJsonSchema: JSONSchemaType; - private unlockConnectorJsonSchema: JSONSchemaType; - private getDiagnosticsJsonSchema: JSONSchemaType; - private setChargingProfileJsonSchema: JSONSchemaType; - private clearChargingProfileJsonSchema: JSONSchemaType; - private changeAvailabilityJsonSchema: JSONSchemaType; - private remoteStartTransactionJsonSchema: JSONSchemaType; - private remoteStopTransactionJsonSchema: JSONSchemaType; - private triggerMessageJsonSchema: JSONSchemaType; + private jsonSchemas: Map>; public constructor() { if (new.target?.name === moduleName) { @@ -141,114 +124,153 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer [OCPP16IncomingRequestCommand.GET_DIAGNOSTICS, this.handleRequestGetDiagnostics.bind(this)], [OCPP16IncomingRequestCommand.TRIGGER_MESSAGE, this.handleRequestTriggerMessage.bind(this)], ]); - this.resetJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/Reset.json' - ), - 'utf8' - ) - ) as JSONSchemaType; - this.clearCacheJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/ClearCache.json' - ), - 'utf8' - ) - ) as JSONSchemaType; - this.getConfigurationJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/GetConfiguration.json' - ), - 'utf8' - ) - ) as JSONSchemaType; - this.changeConfigurationJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/ChangeConfiguration.json' - ), - 'utf8' - ) - ) as JSONSchemaType; - this.unlockConnectorJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/UnlockConnector.json' - ), - 'utf8' - ) - ) as JSONSchemaType; - this.getDiagnosticsJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/GetDiagnostics.json' - ), - 'utf8' - ) - ) as JSONSchemaType; - this.setChargingProfileJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/SetChargingProfile.json' - ), - 'utf8' - ) - ) as JSONSchemaType; - this.clearChargingProfileJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/ClearChargingProfile.json' - ), - 'utf8' - ) - ) as JSONSchemaType; - this.changeAvailabilityJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/ChangeAvailability.json' - ), - 'utf8' - ) - ) as JSONSchemaType; - this.remoteStartTransactionJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/RemoteStartTransaction.json' - ), - 'utf8' - ) - ) as JSONSchemaType; - this.remoteStopTransactionJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/RemoteStopTransaction.json' - ), - 'utf8' - ) - ) as JSONSchemaType; - this.triggerMessageJsonSchema = JSON.parse( - fs.readFileSync( - path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../../assets/json-schemas/ocpp/1.6/TriggerMessage.json' - ), - 'utf8' - ) - ) as JSONSchemaType; + this.jsonSchemas = new Map>([ + [ + OCPP16IncomingRequestCommand.RESET, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/Reset.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + [ + OCPP16IncomingRequestCommand.CLEAR_CACHE, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/ClearCache.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + [ + OCPP16IncomingRequestCommand.UNLOCK_CONNECTOR, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/UnlockConnector.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + [ + OCPP16IncomingRequestCommand.GET_CONFIGURATION, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/GetConfiguration.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + [ + OCPP16IncomingRequestCommand.CHANGE_CONFIGURATION, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/ChangeConfiguration.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + [ + OCPP16IncomingRequestCommand.GET_DIAGNOSTICS, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/GetDiagnostics.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + [ + OCPP16IncomingRequestCommand.SET_CHARGING_PROFILE, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/SetChargingProfile.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + [ + OCPP16IncomingRequestCommand.CLEAR_CHARGING_PROFILE, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/ClearChargingProfile.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + [ + OCPP16IncomingRequestCommand.CHANGE_AVAILABILITY, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/ChangeAvailability.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + [ + OCPP16IncomingRequestCommand.REMOTE_START_TRANSACTION, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/RemoteStartTransaction.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + [ + OCPP16IncomingRequestCommand.REMOTE_STOP_TRANSACTION, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/RemoteStopTransaction.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + [ + OCPP16IncomingRequestCommand.TRIGGER_MESSAGE, + JSON.parse( + fs.readFileSync( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../../assets/json-schemas/ocpp/1.6/TriggerMessage.json' + ), + 'utf8' + ) + ) as JSONSchemaType, + ], + ]); + this.validatePayload.bind(this); } public async incomingRequestHandler( @@ -284,6 +306,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer ChargingStationUtils.isIncomingRequestCommandSupported(commandName, chargingStation) ) { try { + this.validatePayload(chargingStation, commandName, commandPayload); // Call the method to build the response response = await this.incomingRequestHandlers.get(commandName)( chargingStation, @@ -291,7 +314,10 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer ); } catch (error) { // Log - logger.error(chargingStation.logPrefix() + ' Handle request error: %j', error); + logger.error( + `${chargingStation.logPrefix()} ${moduleName}.incomingRequestHandler: Handle incoming request error:`, + error + ); throw error; } } else { @@ -328,17 +354,30 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer ); } + private validatePayload( + chargingStation: ChargingStation, + commandName: OCPP16IncomingRequestCommand, + commandPayload: JsonType + ): boolean { + if (this.jsonSchemas.has(commandName)) { + return this.validateIncomingRequestPayload( + chargingStation, + commandName, + this.jsonSchemas.get(commandName), + commandPayload + ); + } + logger.warn( + `${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema found for command ${commandName} PDU validation` + ); + return false; + } + // Simulate charging station restart private handleRequestReset( chargingStation: ChargingStation, commandPayload: ResetRequest ): DefaultResponse { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.RESET, - this.resetJsonSchema, - commandPayload - ); // eslint-disable-next-line @typescript-eslint/no-misused-promises setImmediate(async (): Promise => { await chargingStation.reset((commandPayload.type + 'Reset') as OCPP16StopTransactionReason); @@ -353,16 +392,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer return Constants.OCPP_RESPONSE_ACCEPTED; } - private handleRequestClearCache( - chargingStation: ChargingStation, - commandPayload: OCPP16ClearCacheRequest - ): DefaultResponse { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.CLEAR_CACHE, - this.clearCacheJsonSchema, - commandPayload - ); + private handleRequestClearCache(): DefaultResponse { return Constants.OCPP_RESPONSE_ACCEPTED; } @@ -370,12 +400,6 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation: ChargingStation, commandPayload: UnlockConnectorRequest ): Promise { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.UNLOCK_CONNECTOR, - this.unlockConnectorJsonSchema, - commandPayload - ); const connectorId = commandPayload.connectorId; if (connectorId === 0) { logger.error( @@ -383,37 +407,11 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer ); return Constants.OCPP_RESPONSE_UNLOCK_NOT_SUPPORTED; } - if (chargingStation.getConnectorStatus(connectorId)?.transactionStarted) { - const transactionId = chargingStation.getConnectorStatus(connectorId).transactionId; - if ( - chargingStation.getBeginEndMeterValues() && - chargingStation.getOcppStrictCompliance() && - !chargingStation.getOutOfOrderEndMeterValues() - ) { - // FIXME: Implement OCPP version agnostic helpers - const transactionEndMeterValue = OCPP16ServiceUtils.buildTransactionEndMeterValue( - chargingStation, - connectorId, - chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId) - ); - await chargingStation.ocppRequestService.requestHandler< - OCPP16MeterValuesRequest, - OCPP16MeterValuesResponse - >(chargingStation, OCPP16RequestCommand.METER_VALUES, { - connectorId, - transactionId, - meterValue: [transactionEndMeterValue], - }); - } - const stopResponse = await chargingStation.ocppRequestService.requestHandler< - OCPP16StopTransactionRequest, - OCPP16StopTransactionResponse - >(chargingStation, OCPP16RequestCommand.STOP_TRANSACTION, { - transactionId, - meterStop: chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId), - idTag: chargingStation.getTransactionIdTag(transactionId), - reason: OCPP16StopTransactionReason.UNLOCK_COMMAND, - }); + if (chargingStation.getConnectorStatus(connectorId)?.transactionStarted === true) { + const stopResponse = await chargingStation.stopTransactionOnConnector( + connectorId, + OCPP16StopTransactionReason.UNLOCK_COMMAND + ); if (stopResponse.idTagInfo?.status === OCPP16AuthorizationStatus.ACCEPTED) { return Constants.OCPP_RESPONSE_UNLOCKED; } @@ -435,17 +433,11 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation: ChargingStation, commandPayload: GetConfigurationRequest ): GetConfigurationResponse { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.GET_CONFIGURATION, - this.getConfigurationJsonSchema, - commandPayload - ); const configurationKey: OCPPConfigurationKey[] = []; const unknownKey: string[] = []; - if (Utils.isEmptyArray(commandPayload.key)) { + if (Utils.isEmptyArray(commandPayload.key) === true) { for (const configuration of chargingStation.ocppConfiguration.configurationKey) { - if (Utils.isUndefined(configuration.visible)) { + if (Utils.isUndefined(configuration.visible) === true) { configuration.visible = true; } if (!configuration.visible) { @@ -464,10 +456,10 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer key ); if (keyFound) { - if (Utils.isUndefined(keyFound.visible)) { + if (Utils.isUndefined(keyFound.visible) === true) { keyFound.visible = true; } - if (!keyFound.visible) { + if (keyFound.visible === false) { continue; } configurationKey.push({ @@ -490,12 +482,6 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation: ChargingStation, commandPayload: ChangeConfigurationRequest ): ChangeConfigurationResponse { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.CHANGE_CONFIGURATION, - this.changeConfigurationJsonSchema, - commandPayload - ); const keyToChange = ChargingStationConfigurationUtils.getConfigurationKey( chargingStation, commandPayload.key, @@ -550,12 +536,6 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation: ChargingStation, commandPayload: SetChargingProfileRequest ): SetChargingProfileResponse { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.SET_CHARGING_PROFILE, - this.setChargingProfileJsonSchema, - commandPayload - ); if ( !OCPP16ServiceUtils.checkFeatureProfile( chargingStation, @@ -584,7 +564,8 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer commandPayload.csChargingProfiles.chargingProfilePurpose === ChargingProfilePurposeType.TX_PROFILE && (commandPayload.connectorId === 0 || - !chargingStation.getConnectorStatus(commandPayload.connectorId)?.transactionStarted) + chargingStation.getConnectorStatus(commandPayload.connectorId)?.transactionStarted === + false) ) { return Constants.OCPP_SET_CHARGING_PROFILE_RESPONSE_REJECTED; } @@ -605,12 +586,6 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation: ChargingStation, commandPayload: ClearChargingProfileRequest ): ClearChargingProfileResponse { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.CLEAR_CHARGING_PROFILE, - this.clearChargingProfileJsonSchema, - commandPayload - ); if ( !OCPP16ServiceUtils.checkFeatureProfile( chargingStation, @@ -692,12 +667,6 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation: ChargingStation, commandPayload: ChangeAvailabilityRequest ): Promise { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.CHANGE_AVAILABILITY, - this.changeAvailabilityJsonSchema, - commandPayload - ); const connectorId: number = commandPayload.connectorId; if (!chargingStation.getConnectorStatus(connectorId)) { logger.error( @@ -712,7 +681,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer if (connectorId === 0) { let response: ChangeAvailabilityResponse = Constants.OCPP_AVAILABILITY_RESPONSE_ACCEPTED; for (const id of chargingStation.connectors.keys()) { - if (chargingStation.getConnectorStatus(id)?.transactionStarted) { + if (chargingStation.getConnectorStatus(id)?.transactionStarted === true) { response = Constants.OCPP_AVAILABILITY_RESPONSE_SCHEDULED; } chargingStation.getConnectorStatus(id).availability = commandPayload.type; @@ -736,7 +705,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer OCPP16AvailabilityType.INOPERATIVE && commandPayload.type === OCPP16AvailabilityType.INOPERATIVE)) ) { - if (chargingStation.getConnectorStatus(connectorId)?.transactionStarted) { + if (chargingStation.getConnectorStatus(connectorId)?.transactionStarted === true) { chargingStation.getConnectorStatus(connectorId).availability = commandPayload.type; return Constants.OCPP_AVAILABILITY_RESPONSE_SCHEDULED; } @@ -759,15 +728,18 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation: ChargingStation, commandPayload: RemoteStartTransactionRequest ): Promise { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.REMOTE_START_TRANSACTION, - this.remoteStartTransactionJsonSchema, - commandPayload - ); const transactionConnectorId = commandPayload.connectorId; const connectorStatus = chargingStation.getConnectorStatus(transactionConnectorId); if (transactionConnectorId) { + const remoteStartTransactionLogMsg = + chargingStation.logPrefix() + + ' Transaction remotely STARTED on ' + + chargingStation.stationInfo.chargingStationId + + '#' + + transactionConnectorId.toString() + + " for idTag '" + + commandPayload.idTag + + "'"; await chargingStation.ocppRequestService.requestHandler< OCPP16StatusNotificationRequest, OCPP16StatusNotificationResponse @@ -793,7 +765,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer connectorStatus.localAuthorizeIdTag = commandPayload.idTag; connectorStatus.idTagLocalAuthorized = true; authorized = true; - } else if (chargingStation.getMayAuthorizeAtRemoteStart()) { + } else if (chargingStation.getMustAuthorizeAtRemoteStart()) { connectorStatus.authorizeIdTag = commandPayload.idTag; const authorizeResponse: OCPP16AuthorizeResponse = await chargingStation.ocppRequestService.requestHandler< @@ -831,15 +803,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer }) ).idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED ) { - logger.debug( - chargingStation.logPrefix() + - ' Transaction remotely STARTED on ' + - chargingStation.stationInfo.chargingStationId + - '#' + - transactionConnectorId.toString() + - ' for idTag ' + - commandPayload.idTag - ); + logger.debug(remoteStartTransactionLogMsg); return Constants.OCPP_RESPONSE_ACCEPTED; } return this.notifyRemoteStartTransactionRejected( @@ -880,15 +844,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer }) ).idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED ) { - logger.debug( - chargingStation.logPrefix() + - ' Transaction remotely STARTED on ' + - chargingStation.stationInfo.chargingStationId + - '#' + - transactionConnectorId.toString() + - ' for idTag ' + - commandPayload.idTag - ); + logger.debug(remoteStartTransactionLogMsg); return Constants.OCPP_RESPONSE_ACCEPTED; } return this.notifyRemoteStartTransactionRejected( @@ -938,12 +894,13 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation.logPrefix() + ' Remote starting transaction REJECTED on connector Id ' + connectorId.toString() + - ', idTag ' + + ", idTag '" + idTag + - ', availability ' + + "', availability '" + chargingStation.getConnectorStatus(connectorId).availability + - ', status ' + - chargingStation.getConnectorStatus(connectorId).status + "', status '" + + chargingStation.getConnectorStatus(connectorId).status + + "'" ); return Constants.OCPP_RESPONSE_REJECTED; } @@ -976,12 +933,6 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation: ChargingStation, commandPayload: RemoteStopTransactionRequest ): Promise { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.REMOTE_STOP_TRANSACTION, - this.remoteStopTransactionJsonSchema, - commandPayload - ); const transactionId = commandPayload.transactionId; for (const connectorId of chargingStation.connectors.keys()) { if ( @@ -997,35 +948,14 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer errorCode: OCPP16ChargePointErrorCode.NO_ERROR, }); chargingStation.getConnectorStatus(connectorId).status = OCPP16ChargePointStatus.FINISHING; - if ( - chargingStation.getBeginEndMeterValues() && - chargingStation.getOcppStrictCompliance() && - !chargingStation.getOutOfOrderEndMeterValues() - ) { - // FIXME: Implement OCPP version agnostic helpers - const transactionEndMeterValue = OCPP16ServiceUtils.buildTransactionEndMeterValue( - chargingStation, - connectorId, - chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId) - ); - await chargingStation.ocppRequestService.requestHandler< - OCPP16MeterValuesRequest, - OCPP16MeterValuesResponse - >(chargingStation, OCPP16RequestCommand.METER_VALUES, { - connectorId, - transactionId, - meterValue: [transactionEndMeterValue], - }); + const stopResponse = await chargingStation.stopTransactionOnConnector( + connectorId, + OCPP16StopTransactionReason.REMOTE + ); + if (stopResponse.idTagInfo?.status === OCPP16AuthorizationStatus.ACCEPTED) { + return Constants.OCPP_RESPONSE_ACCEPTED; } - await chargingStation.ocppRequestService.requestHandler< - OCPP16StopTransactionRequest, - OCPP16StopTransactionResponse - >(chargingStation, OCPP16RequestCommand.STOP_TRANSACTION, { - transactionId, - meterStop: chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId), - idTag: chargingStation.getTransactionIdTag(transactionId), - }); - return Constants.OCPP_RESPONSE_ACCEPTED; + return Constants.OCPP_RESPONSE_REJECTED; } } logger.warn( @@ -1040,12 +970,6 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation: ChargingStation, commandPayload: GetDiagnosticsRequest ): Promise { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.GET_DIAGNOSTICS, - this.getDiagnosticsJsonSchema, - commandPayload - ); if ( !OCPP16ServiceUtils.checkFeatureProfile( chargingStation, @@ -1166,12 +1090,6 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation: ChargingStation, commandPayload: OCPP16TriggerMessageRequest ): OCPP16TriggerMessageResponse { - this.validateIncomingRequestPayload( - chargingStation, - OCPP16IncomingRequestCommand.TRIGGER_MESSAGE, - this.triggerMessageJsonSchema, - commandPayload - ); if ( !OCPP16ServiceUtils.checkFeatureProfile( chargingStation, @@ -1199,17 +1117,17 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer chargingStation, OCPP16RequestCommand.BOOT_NOTIFICATION, { - chargePointModel: chargingStation.getBootNotificationRequest().chargePointModel, - chargePointVendor: chargingStation.getBootNotificationRequest().chargePointVendor, + chargePointModel: chargingStation.bootNotificationRequest.chargePointModel, + chargePointVendor: chargingStation.bootNotificationRequest.chargePointVendor, chargeBoxSerialNumber: - chargingStation.getBootNotificationRequest().chargeBoxSerialNumber, - firmwareVersion: chargingStation.getBootNotificationRequest().firmwareVersion, + chargingStation.bootNotificationRequest.chargeBoxSerialNumber, + firmwareVersion: chargingStation.bootNotificationRequest.firmwareVersion, chargePointSerialNumber: - chargingStation.getBootNotificationRequest().chargePointSerialNumber, - iccid: chargingStation.getBootNotificationRequest().iccid, - imsi: chargingStation.getBootNotificationRequest().imsi, - meterSerialNumber: chargingStation.getBootNotificationRequest().meterSerialNumber, - meterType: chargingStation.getBootNotificationRequest().meterType, + chargingStation.bootNotificationRequest.chargePointSerialNumber, + iccid: chargingStation.bootNotificationRequest.iccid, + imsi: chargingStation.bootNotificationRequest.imsi, + meterSerialNumber: chargingStation.bootNotificationRequest.meterSerialNumber, + meterType: chargingStation.bootNotificationRequest.meterType, }, { skipBufferingOnError: true, triggerMessage: true } )