X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FAutomaticTransactionGenerator.ts;h=2380c967beada92d179262a2c71abc30640758f6;hb=e054fc1cc8912765435d03729d0104e9e2316949;hp=d056d8ec866ee1c948740e24ca03ed2ae4f525d4;hpb=0a1dd746244cebb3633d88c6650839d9f32227fe;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/AutomaticTransactionGenerator.ts b/src/charging-station/AutomaticTransactionGenerator.ts index d056d8ec..2380c967 100644 --- a/src/charging-station/AutomaticTransactionGenerator.ts +++ b/src/charging-station/AutomaticTransactionGenerator.ts @@ -1,4 +1,4 @@ -// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved. +// Partial Copyright Jerome Benoit. 2021-2024. All Rights Reserved. import { hoursToMilliseconds, secondsToMilliseconds } from 'date-fns' @@ -19,10 +19,11 @@ import { } from '../types/index.js' import { Constants, - cloneObject, + clone, + convertToDate, formatDurationMilliSeconds, getRandomInteger, - isValidTime, + isValidDate, logPrefix, logger, secureRandom, @@ -65,7 +66,7 @@ export class AutomaticTransactionGenerator { return AutomaticTransactionGenerator.instances.get(chargingStation.stationInfo!.hashId) } - public start (): void { + public start (stopAbsoluteDuration?: boolean): void { if (!checkChargingStation(this.chargingStation, this.logPrefix())) { return } @@ -78,7 +79,7 @@ export class AutomaticTransactionGenerator { return } this.starting = true - this.startConnectors() + this.startConnectors(stopAbsoluteDuration) this.started = true this.starting = false } @@ -98,7 +99,7 @@ export class AutomaticTransactionGenerator { this.stopping = false } - public startConnector (connectorId: number): void { + public startConnector (connectorId: number, stopAbsoluteDuration?: boolean): void { if (!checkChargingStation(this.chargingStation, this.logPrefix(connectorId))) { return } @@ -107,7 +108,7 @@ export class AutomaticTransactionGenerator { throw new BaseError(`Connector ${connectorId} does not exist`) } if (this.connectorsStatus.get(connectorId)?.start === false) { - this.internalStartConnector(connectorId).catch(Constants.EMPTY_FUNCTION) + this.internalStartConnector(connectorId, stopAbsoluteDuration).catch(Constants.EMPTY_FUNCTION) } else if (this.connectorsStatus.get(connectorId)?.start === true) { logger.warn(`${this.logPrefix(connectorId)} is already started on connector`) } @@ -126,7 +127,7 @@ export class AutomaticTransactionGenerator { } } - private startConnectors (): void { + private startConnectors (stopAbsoluteDuration?: boolean): void { if ( this.connectorsStatus.size > 0 && this.connectorsStatus.size !== this.chargingStation.getNumberOfConnectors() @@ -138,14 +139,14 @@ export class AutomaticTransactionGenerator { for (const [evseId, evseStatus] of this.chargingStation.evses) { if (evseId > 0) { for (const connectorId of evseStatus.connectors.keys()) { - this.startConnector(connectorId) + this.startConnector(connectorId, stopAbsoluteDuration) } } } } else { for (const connectorId of this.chargingStation.connectors.keys()) { if (connectorId > 0) { - this.startConnector(connectorId) + this.startConnector(connectorId, stopAbsoluteDuration) } } } @@ -169,8 +170,11 @@ export class AutomaticTransactionGenerator { } } - private async internalStartConnector (connectorId: number): Promise { - this.setStartConnectorStatus(connectorId) + private async internalStartConnector ( + connectorId: number, + stopAbsoluteDuration?: boolean + ): Promise { + this.setStartConnectorStatus(connectorId, stopAbsoluteDuration) logger.info( `${this.logPrefix( connectorId @@ -217,10 +221,9 @@ export class AutomaticTransactionGenerator { ) ) logger.info( - `${this.logPrefix( - connectorId - )} transaction started with id ${this.chargingStation.getConnectorStatus(connectorId) - ?.transactionId} and will stop in ${formatDurationMilliSeconds(waitTrxEnd)}` + `${this.logPrefix(connectorId)} transaction started with id ${ + this.chargingStation.getConnectorStatus(connectorId)?.transactionId + } and will stop in ${formatDurationMilliSeconds(waitTrxEnd)}` ) await sleep(waitTrxEnd) await this.stopTransaction(connectorId) @@ -231,10 +234,9 @@ export class AutomaticTransactionGenerator { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion ++this.connectorsStatus.get(connectorId)!.skippedTransactions logger.info( - `${this.logPrefix(connectorId)} skipped consecutively ${this.connectorsStatus.get( - connectorId - )?.skippedConsecutiveTransactions}/${this.connectorsStatus.get(connectorId) - ?.skippedTransactions} transaction(s)` + `${this.logPrefix(connectorId)} skipped consecutively ${ + this.connectorsStatus.get(connectorId)?.skippedConsecutiveTransactions + }/${this.connectorsStatus.get(connectorId)?.skippedTransactions} transaction(s)` ) } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -258,27 +260,28 @@ export class AutomaticTransactionGenerator { ) } - private setStartConnectorStatus (connectorId: number): void { - const previousRunDuration = - isValidTime(this.connectorsStatus.get(connectorId)?.startDate) && - isValidTime(this.connectorsStatus.get(connectorId)?.lastRunDate) - ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.connectorsStatus.get(connectorId)!.lastRunDate!.getTime() - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.connectorsStatus.get(connectorId)!.startDate!.getTime() - : 0 + private setStartConnectorStatus ( + connectorId: number, + stopAbsoluteDuration = this.chargingStation.getAutomaticTransactionGeneratorConfiguration() + ?.stopAbsoluteDuration + ): void { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.connectorsStatus.get(connectorId)!.startDate = new Date() - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.connectorsStatus.get(connectorId)!.stopDate = new Date( + if ( + stopAbsoluteDuration === false || // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.connectorsStatus.get(connectorId)!.startDate!.getTime() + - hoursToMilliseconds( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.chargingStation.getAutomaticTransactionGeneratorConfiguration()!.stopAfterHours - ) - - previousRunDuration - ) + !isValidDate(this.connectorsStatus.get(connectorId)!.stopDate) + ) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.connectorsStatus.get(connectorId)!.stopDate = new Date( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.connectorsStatus.get(connectorId)!.startDate!.getTime() + + hoursToMilliseconds( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.chargingStation.getAutomaticTransactionGeneratorConfiguration()!.stopAfterHours + ) + ) + } delete this.connectorsStatus.get(connectorId)?.stoppedDate // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.connectorsStatus.get(connectorId)!.skippedConsecutiveTransactions = 0 @@ -372,14 +375,31 @@ export class AutomaticTransactionGenerator { } private getConnectorStatus (connectorId: number): Status { - const connectorStatus = - this.chargingStation.getAutomaticTransactionGeneratorStatuses()?.[connectorId - 1] != null - ? cloneObject( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.chargingStation.getAutomaticTransactionGeneratorStatuses()![connectorId - 1] - ) - : undefined - this.resetConnectorStatus(connectorStatus) + const statusIndex = connectorId - 1 + let connectorStatus: Status | undefined + if (this.chargingStation.getAutomaticTransactionGeneratorStatuses()?.[statusIndex] != null) { + connectorStatus = clone( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.chargingStation.getAutomaticTransactionGeneratorStatuses()![statusIndex] + ) + } else if (this.chargingStation.getAutomaticTransactionGeneratorStatuses() != null) { + logger.warn( + `${this.logPrefix(connectorId)} no status found for connector #${connectorId} in charging station configuration file. New status will be created` + ) + } + if (connectorStatus != null) { + connectorStatus.startDate = convertToDate(connectorStatus.startDate) + connectorStatus.lastRunDate = convertToDate(connectorStatus.lastRunDate) + connectorStatus.stopDate = convertToDate(connectorStatus.stopDate) + connectorStatus.stoppedDate = convertToDate(connectorStatus.stoppedDate) + if ( + !this.started && + (connectorStatus.start || + this.chargingStation.getAutomaticTransactionGeneratorConfiguration()?.enable !== true) + ) { + connectorStatus.start = false + } + } return ( connectorStatus ?? { start: false, @@ -398,19 +418,6 @@ export class AutomaticTransactionGenerator { ) } - private resetConnectorStatus (connectorStatus: Status | undefined): void { - if (connectorStatus == null) { - return - } - if ( - !this.started && - (connectorStatus.start || - this.chargingStation.getAutomaticTransactionGeneratorConfiguration()?.enable !== true) - ) { - connectorStatus.start = false - } - } - private async startTransaction ( connectorId: number ): Promise { @@ -483,10 +490,9 @@ export class AutomaticTransactionGenerator { let stopResponse: StopTransactionResponse | undefined if (this.chargingStation.getConnectorStatus(connectorId)?.transactionStarted === true) { logger.info( - `${this.logPrefix( - connectorId - )} stop transaction with id ${this.chargingStation.getConnectorStatus(connectorId) - ?.transactionId}` + `${this.logPrefix(connectorId)} stop transaction with id ${ + this.chargingStation.getConnectorStatus(connectorId)?.transactionId + }` ) stopResponse = await this.chargingStation.stopTransactionOnConnector(connectorId, reason) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion