X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Focpp%2F1.6%2FOCPP16IncomingRequestService.ts;h=356e453bde54863444e4fd4589c7432871a5f83a;hb=cfdf901dfbdf4cf745a1ced9b7870251cb9c6f10;hp=82647835535d725a5bd89f545c17169790d32b14;hpb=73d87be1970bb3e8c32be6244fc510f6f501cb3a;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 82647835..356e453b 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -6,6 +6,7 @@ import { URL, fileURLToPath } from 'node:url'; import type { JSONSchemaType } from 'ajv'; import { Client, type FTPResponse } from 'basic-ftp'; +import { secondsToMilliseconds } from 'date-fns'; import { create } from 'tar'; import { OCPP16Constants } from './OCPP16Constants'; @@ -79,12 +80,10 @@ import { OCPPVersion, type RemoteStartTransactionRequest, type RemoteStopTransactionRequest, - ReservationFilterKey, ReservationTerminationReason, type ResetRequest, type SetChargingProfileRequest, type SetChargingProfileResponse, - type StartTransactionRequest, type UnlockConnectorRequest, type UnlockConnectorResponse, } from '../../../types'; @@ -673,7 +672,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { return OCPP16Constants.OCPP_RESPONSE_REJECTED; } const startDate = new Date(); - const endDate = new Date(startDate.getTime() + commandPayload.duration * 1000); + const endDate = new Date(startDate.getTime() + secondsToMilliseconds(commandPayload.duration)); let compositeSchedule: OCPP16ChargingSchedule | undefined; for (const chargingProfile of chargingStation.getConnectorStatus(commandPayload.connectorId)! .chargingProfiles!) { @@ -826,18 +825,6 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { commandPayload: RemoteStartTransactionRequest, ): Promise { const { connectorId: transactionConnectorId, idTag, chargingProfile } = commandPayload; - const reserved = - chargingStation.getConnectorStatus(transactionConnectorId)!.status === - OCPP16ChargePointStatus.Reserved; - const reservedOnConnectorZero = - chargingStation.getConnectorStatus(0)!.status === OCPP16ChargePointStatus.Reserved; - if ( - (reserved && - !chargingStation.validateIncomingRequestWithReservation(transactionConnectorId, idTag)) || - (reservedOnConnectorZero && !chargingStation.validateIncomingRequestWithReservation(0, idTag)) - ) { - return OCPP16Constants.OCPP_RESPONSE_REJECTED; - } if (chargingStation.hasConnector(transactionConnectorId) === false) { return this.notifyRemoteStartTransactionRejected( chargingStation, @@ -855,6 +842,15 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { idTag, ); } + if ( + (chargingStation.getConnectorStatus(transactionConnectorId)?.status === + OCPP16ChargePointStatus.Reserved && + chargingStation.getReservationBy('connectorId', transactionConnectorId)?.idTag !== idTag) || + (chargingStation.getConnectorStatus(0)?.status === OCPP16ChargePointStatus.Reserved && + chargingStation.getReservationBy('connectorId', 0)?.idTag !== idTag) + ) { + return OCPP16Constants.OCPP_RESPONSE_REJECTED; + } const remoteStartTransactionLogMsg = ` ${chargingStation.logPrefix()} Transaction remotely STARTED on ${ chargingStation.stationInfo.chargingStationId @@ -865,9 +861,9 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { OCPP16ChargePointStatus.Preparing, ); const connectorStatus = chargingStation.getConnectorStatus(transactionConnectorId)!; - // Check if authorized + // Authorization check required if ( - chargingStation.getAuthorizeRemoteTxRequests() && + chargingStation.getAuthorizeRemoteTxRequests() === true && (await OCPP16ServiceUtils.isIdTagAuthorized(chargingStation, transactionConnectorId, idTag)) ) { // Authorization successful, start transaction @@ -879,27 +875,21 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { ) === true ) { connectorStatus.transactionRemoteStarted = true; - const startTransactionPayload: Partial = { - connectorId: transactionConnectorId, - idTag, - }; - if (reserved || reservedOnConnectorZero) { - const reservation = chargingStation.getReservationBy( - ReservationFilterKey.CONNECTOR_ID, - reservedOnConnectorZero ? 0 : transactionConnectorId, - )!; - startTransactionPayload.reservationId = reservation.id; - await chargingStation.removeReservation( - reservation, - ReservationTerminationReason.TRANSACTION_STARTED, - ); - } if ( ( await chargingStation.ocppRequestService.requestHandler< OCPP16StartTransactionRequest, OCPP16StartTransactionResponse - >(chargingStation, OCPP16RequestCommand.START_TRANSACTION, startTransactionPayload) + >(chargingStation, OCPP16RequestCommand.START_TRANSACTION, { + connectorId: transactionConnectorId, + idTag, + reservationId: chargingStation.getReservationBy( + 'connectorId', + chargingStation.getConnectorStatus(0)?.status === OCPP16ChargePointStatus.Reserved + ? 0 + : transactionConnectorId, + )!, + }) ).idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED ) { logger.debug(remoteStartTransactionLogMsg); @@ -934,6 +924,12 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { >(chargingStation, OCPP16RequestCommand.START_TRANSACTION, { connectorId: transactionConnectorId, idTag, + reservationId: chargingStation.getReservationBy( + 'connectorId', + chargingStation.getConnectorStatus(0)?.status === OCPP16ChargePointStatus.Reserved + ? 0 + : transactionConnectorId, + )!, }) ).idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED ) { @@ -979,20 +975,26 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { private setRemoteStartTransactionChargingProfile( chargingStation: ChargingStation, connectorId: number, - cp: OCPP16ChargingProfile, + chargingProfile: OCPP16ChargingProfile, ): boolean { - if (cp && cp.chargingProfilePurpose === OCPP16ChargingProfilePurposeType.TX_PROFILE) { - OCPP16ServiceUtils.setChargingProfile(chargingStation, connectorId, cp); + if ( + chargingProfile && + chargingProfile.chargingProfilePurpose === OCPP16ChargingProfilePurposeType.TX_PROFILE + ) { + OCPP16ServiceUtils.setChargingProfile(chargingStation, connectorId, chargingProfile); logger.debug( `${chargingStation.logPrefix()} Charging profile(s) set at remote start transaction on connector id ${connectorId}: %j`, - cp, + chargingProfile, ); return true; - } else if (cp && cp.chargingProfilePurpose !== OCPP16ChargingProfilePurposeType.TX_PROFILE) { + } else if ( + chargingProfile && + chargingProfile.chargingProfilePurpose !== OCPP16ChargingProfilePurposeType.TX_PROFILE + ) { logger.warn( `${chargingStation.logPrefix()} Not allowed to set ${ - cp.chargingProfilePurpose + chargingProfile.chargingProfilePurpose } charging profile(s) at remote start transaction`, ); return false; @@ -1150,7 +1152,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { chargingStation.stationInfo?.firmwareUpgrade?.failureStatus === OCPP16FirmwareStatus.DownloadFailed ) { - await sleep(getRandomInteger(maxDelay, minDelay) * 1000); + await sleep(secondsToMilliseconds(getRandomInteger(maxDelay, minDelay))); await chargingStation.ocppRequestService.requestHandler< OCPP16FirmwareStatusNotificationRequest, OCPP16FirmwareStatusNotificationResponse @@ -1161,7 +1163,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { chargingStation.stationInfo?.firmwareUpgrade?.failureStatus; return; } - await sleep(getRandomInteger(maxDelay, minDelay) * 1000); + await sleep(secondsToMilliseconds(getRandomInteger(maxDelay, minDelay))); await chargingStation.ocppRequestService.requestHandler< OCPP16FirmwareStatusNotificationRequest, OCPP16FirmwareStatusNotificationResponse @@ -1174,12 +1176,12 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { do { const runningTransactions = chargingStation.getNumberOfRunningTransactions(); if (runningTransactions > 0) { - const waitTime = 15 * 1000; + const waitTime = secondsToMilliseconds(15); logger.debug( `${chargingStation.logPrefix()} ${moduleName}.updateFirmwareSimulation: - ${runningTransactions} transaction(s) in progress, waiting ${ - waitTime / 1000 - } seconds before continuing firmware update simulation`, + ${runningTransactions} transaction(s) in progress, waiting ${formatDurationMilliSeconds( + waitTime, + )} before continuing firmware update simulation`, ); await sleep(waitTime); transactionsStarted = true; @@ -1217,7 +1219,8 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { transactionsStarted = false; } } while (transactionsStarted); - !wasTransactionsStarted && (await sleep(getRandomInteger(maxDelay, minDelay) * 1000)); + !wasTransactionsStarted && + (await sleep(secondsToMilliseconds(getRandomInteger(maxDelay, minDelay)))); if (checkChargingStation(chargingStation, chargingStation.logPrefix()) === false) { return; } @@ -1232,7 +1235,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { chargingStation.stationInfo?.firmwareUpgrade?.failureStatus === OCPP16FirmwareStatus.InstallationFailed ) { - await sleep(getRandomInteger(maxDelay, minDelay) * 1000); + await sleep(secondsToMilliseconds(getRandomInteger(maxDelay, minDelay))); await chargingStation.ocppRequestService.requestHandler< OCPP16FirmwareStatusNotificationRequest, OCPP16FirmwareStatusNotificationResponse @@ -1244,7 +1247,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { return; } if (chargingStation.stationInfo?.firmwareUpgrade?.reset === true) { - await sleep(getRandomInteger(maxDelay, minDelay) * 1000); + await sleep(secondsToMilliseconds(getRandomInteger(maxDelay, minDelay))); await chargingStation.reset(OCPP16StopTransactionReason.REBOOT); } } @@ -1539,10 +1542,10 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { const { reservationId, idTag, connectorId } = commandPayload; let response: OCPP16ReserveNowResponse; try { - if (!chargingStation.isConnectorAvailable(connectorId) && connectorId > 0) { + if (connectorId > 0 && !chargingStation.isConnectorAvailable(connectorId)) { return OCPP16Constants.OCPP_RESERVATION_RESPONSE_REJECTED; } - if (connectorId === 0 && !chargingStation.getReservationOnConnectorId0Enabled()) { + if (connectorId === 0 && !chargingStation.getReserveConnectorZeroSupported()) { return OCPP16Constants.OCPP_RESERVATION_RESPONSE_REJECTED; } if (!(await OCPP16ServiceUtils.isIdTagAuthorized(chargingStation, connectorId, idTag))) { @@ -1607,8 +1610,8 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { } try { const { reservationId } = commandPayload; - const [exists, reservation] = chargingStation.doesReservationExists({ id: reservationId }); - if (!exists) { + const reservation = chargingStation.getReservationBy('reservationId', reservationId); + if (isUndefined(reservation)) { logger.error( `${chargingStation.logPrefix()} Reservation with ID ${reservationId} does not exist on charging station`,