X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Focpp%2F1.6%2FOCPP16IncomingRequestService.ts;h=9e0849e987080be00f57f931e62fcfc9f3b8a3d9;hb=22e0d48e12052aaa7ed3f76fc59cac779ae67a5c;hp=93c59ba29cfcedaa63f334270f4f2ca37766372f;hpb=bfbda738d80c83b76e2d38f221bfe305a4a89c2b;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 93c59ba2..9e0849e9 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -25,7 +25,6 @@ import { type ChangeAvailabilityRequest, type ChangeConfigurationRequest, type ClearChargingProfileRequest, - type DiagnosticsStatusNotificationRequest, type GetConfigurationRequest, type GetDiagnosticsRequest, OCPP16AvailabilityType, @@ -33,6 +32,9 @@ import { type OCPP16ClearCacheRequest, type OCPP16DataTransferRequest, OCPP16DataTransferVendorId, + type OCPP16DiagnosticsStatusNotificationRequest, + OCPP16FirmwareStatus, + type OCPP16FirmwareStatusNotificationRequest, type OCPP16HeartbeatRequest, OCPP16IncomingRequestCommand, OCPP16MessageTrigger, @@ -50,12 +52,13 @@ import { type ChangeAvailabilityResponse, type ChangeConfigurationResponse, type ClearChargingProfileResponse, - type DiagnosticsStatusNotificationResponse, type GetConfigurationResponse, type GetDiagnosticsResponse, type OCPP16BootNotificationResponse, type OCPP16DataTransferResponse, OCPP16DataTransferStatus, + type OCPP16DiagnosticsStatusNotificationResponse, + type OCPP16FirmwareStatusNotificationResponse, type OCPP16HeartbeatResponse, type OCPP16StatusNotificationResponse, type OCPP16TriggerMessageResponse, @@ -89,8 +92,8 @@ import { OCPP16ServiceUtils } from './OCPP16ServiceUtils'; const moduleName = 'OCPP16IncomingRequestService'; export default class OCPP16IncomingRequestService extends OCPPIncomingRequestService { + protected jsonSchemas: Map>; private incomingRequestHandlers: Map; - private jsonSchemas: Map>; public constructor() { if (new.target?.name === moduleName) { @@ -132,7 +135,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer [OCPP16IncomingRequestCommand.GET_DIAGNOSTICS, this.handleRequestGetDiagnostics.bind(this)], [OCPP16IncomingRequestCommand.TRIGGER_MESSAGE, this.handleRequestTriggerMessage.bind(this)], [OCPP16IncomingRequestCommand.DATA_TRANSFER, this.handleRequestDataTransfer.bind(this)], - // [OCPP16IncomingRequestCommand.UPDATE_FIRMWARE, this.handleRequestUpdateFirmware.bind(this)], + [OCPP16IncomingRequestCommand.UPDATE_FIRMWARE, this.handleRequestUpdateFirmware.bind(this)], ]); this.jsonSchemas = new Map>([ [ @@ -403,7 +406,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer ); } logger.warn( - `${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema found for command ${commandName} PDU validation` + `${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema found for command '${commandName}' PDU validation` ); return false; } @@ -435,13 +438,6 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer return OCPPConstants.OCPP_RESPONSE_ACCEPTED; } - private handleRequestClearCache(chargingStation: ChargingStation): DefaultResponse { - chargingStation.authorizedTagsCache.deleteAuthorizedTags( - ChargingStationUtils.getAuthorizationFile(chargingStation.stationInfo) - ); - return OCPPConstants.OCPP_RESPONSE_ACCEPTED; - } - private async handleRequestUnlockConnector( chargingStation: ChargingStation, commandPayload: UnlockConnectorRequest @@ -1036,13 +1032,78 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer ) { return OCPPConstants.OCPP_RESPONSE_EMPTY; } - logger.debug( - chargingStation.logPrefix() + - ' ' + - OCPP16IncomingRequestCommand.UPDATE_FIRMWARE + - ' request received: %j', - commandPayload - ); + const retrieveDate = Utils.convertToDate(commandPayload.retrieveDate); + if (retrieveDate.getTime() <= Date.now()) { + this.asyncResource + .runInAsyncScope( + this.updateFirmware.bind(this) as ( + this: OCPP16IncomingRequestService, + ...args: any[] + ) => Promise, + this, + chargingStation + ) + .catch(() => { + /* This is intentional */ + }); + } else { + setTimeout(() => { + this.updateFirmware(chargingStation).catch(() => { + /* Intentional */ + }); + }, retrieveDate.getTime() - Date.now()); + } + return OCPPConstants.OCPP_RESPONSE_EMPTY; + } + + private async updateFirmware( + chargingStation: ChargingStation, + minDelay = 15, + maxDelay = 30 + ): Promise { + chargingStation.stopAutomaticTransactionGenerator(); + for (const connectorId of chargingStation.connectors.keys()) { + if ( + connectorId > 0 && + chargingStation.getConnectorStatus(connectorId).transactionStarted === false + ) { + await chargingStation.ocppRequestService.requestHandler< + OCPP16StatusNotificationRequest, + OCPP16StatusNotificationResponse + >(chargingStation, OCPP16RequestCommand.STATUS_NOTIFICATION, { + connectorId, + status: OCPP16ChargePointStatus.UNAVAILABLE, + errorCode: OCPP16ChargePointErrorCode.NO_ERROR, + }); + chargingStation.getConnectorStatus(connectorId).status = + OCPP16ChargePointStatus.UNAVAILABLE; + } + } + await chargingStation.ocppRequestService.requestHandler< + OCPP16FirmwareStatusNotificationRequest, + OCPP16FirmwareStatusNotificationResponse + >(chargingStation, OCPP16RequestCommand.FIRMWARE_STATUS_NOTIFICATION, { + status: OCPP16FirmwareStatus.Downloading, + }); + chargingStation.stationInfo.firmwareStatus = OCPP16FirmwareStatus.Downloading; + await Utils.sleep(Utils.getRandomInteger(minDelay, maxDelay) * 1000); + await chargingStation.ocppRequestService.requestHandler< + OCPP16FirmwareStatusNotificationRequest, + OCPP16FirmwareStatusNotificationResponse + >(chargingStation, OCPP16RequestCommand.FIRMWARE_STATUS_NOTIFICATION, { + status: OCPP16FirmwareStatus.Downloaded, + }); + chargingStation.stationInfo.firmwareStatus = OCPP16FirmwareStatus.Downloaded; + await Utils.sleep(Utils.getRandomInteger(minDelay, maxDelay) * 1000); + await chargingStation.ocppRequestService.requestHandler< + OCPP16FirmwareStatusNotificationRequest, + OCPP16FirmwareStatusNotificationResponse + >(chargingStation, OCPP16RequestCommand.FIRMWARE_STATUS_NOTIFICATION, { + status: OCPP16FirmwareStatus.Installing, + }); + chargingStation.stationInfo.firmwareStatus = OCPP16FirmwareStatus.Installing; + await Utils.sleep(Utils.getRandomInteger(minDelay, maxDelay) * 1000); + await chargingStation.reset(OCPP16StopTransactionReason.REBOOT); } private async handleRequestGetDiagnostics( @@ -1058,13 +1119,6 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer ) { return OCPPConstants.OCPP_RESPONSE_EMPTY; } - logger.debug( - chargingStation.logPrefix() + - ' ' + - OCPP16IncomingRequestCommand.GET_DIAGNOSTICS + - ' request received: %j', - commandPayload - ); const uri = new URL(commandPayload.location); if (uri.protocol.startsWith('ftp:')) { let ftpClient: Client; @@ -1092,8 +1146,8 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer } bytes transferred from diagnostics archive ${info.name}` ); await chargingStation.ocppRequestService.requestHandler< - DiagnosticsStatusNotificationRequest, - DiagnosticsStatusNotificationResponse + OCPP16DiagnosticsStatusNotificationRequest, + OCPP16DiagnosticsStatusNotificationResponse >(chargingStation, OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION, { status: OCPP16DiagnosticsStatus.Uploading, }); @@ -1107,8 +1161,8 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer ); if (uploadResponse.code === 226) { await chargingStation.ocppRequestService.requestHandler< - DiagnosticsStatusNotificationRequest, - DiagnosticsStatusNotificationResponse + OCPP16DiagnosticsStatusNotificationRequest, + OCPP16DiagnosticsStatusNotificationResponse >(chargingStation, OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION, { status: OCPP16DiagnosticsStatus.Uploaded, }); @@ -1134,8 +1188,8 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer ); } catch (error) { await chargingStation.ocppRequestService.requestHandler< - DiagnosticsStatusNotificationRequest, - DiagnosticsStatusNotificationResponse + OCPP16DiagnosticsStatusNotificationRequest, + OCPP16DiagnosticsStatusNotificationResponse >(chargingStation, OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION, { status: OCPP16DiagnosticsStatus.UploadFailed, }); @@ -1156,8 +1210,8 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer } to transfer the diagnostic logs archive` ); await chargingStation.ocppRequestService.requestHandler< - DiagnosticsStatusNotificationRequest, - DiagnosticsStatusNotificationResponse + OCPP16DiagnosticsStatusNotificationRequest, + OCPP16DiagnosticsStatusNotificationResponse >(chargingStation, OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION, { status: OCPP16DiagnosticsStatus.UploadFailed, });