X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FAutomaticTransactionGenerator.ts;h=a8bd79ac06d846ac6d3f0313a25de57c234856a3;hb=de17a5668a671531e9c5ec9563b0b02d6d5a3f27;hp=cf2f4277b862752becde11a3ab7ac283f142e9b7;hpb=100680888f3b49453ddb4081988a480ee3030d07;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/AutomaticTransactionGenerator.ts b/src/charging-station/AutomaticTransactionGenerator.ts index cf2f4277..a8bd79ac 100644 --- a/src/charging-station/AutomaticTransactionGenerator.ts +++ b/src/charging-station/AutomaticTransactionGenerator.ts @@ -2,14 +2,20 @@ import { AuthorizationStatus, + AuthorizeRequest, AuthorizeResponse, + StartTransactionRequest, StartTransactionResponse, StopTransactionReason, + StopTransactionRequest, StopTransactionResponse, } from '../types/ocpp/Transaction'; +import { MeterValuesRequest, RequestCommand } from '../types/ocpp/Requests'; import type ChargingStation from './ChargingStation'; import Constants from '../utils/Constants'; +import { MeterValuesResponse } from '../types/ocpp/Responses'; +import { OCPP16ServiceUtils } from './ocpp/1.6/OCPP16ServiceUtils'; import PerformanceStatistics from '../performance/PerformanceStatistics'; import { Status } from '../types/AutomaticTransactionGenerator'; import Utils from '../utils/Utils'; @@ -33,13 +39,13 @@ export default class AutomaticTransactionGenerator { } public static getInstance(chargingStation: ChargingStation): AutomaticTransactionGenerator { - if (!AutomaticTransactionGenerator.instances.has(chargingStation.id)) { + if (!AutomaticTransactionGenerator.instances.has(chargingStation.hashId)) { AutomaticTransactionGenerator.instances.set( - chargingStation.id, + chargingStation.hashId, new AutomaticTransactionGenerator(chargingStation) ); } - return AutomaticTransactionGenerator.instances.get(chargingStation.id); + return AutomaticTransactionGenerator.instances.get(chargingStation.hashId); } public start(): void { @@ -269,20 +275,27 @@ export default class AutomaticTransactionGenerator { if (this.chargingStation.hasAuthorizedTags()) { const idTag = this.chargingStation.getRandomIdTag(); if (this.chargingStation.getAutomaticTransactionGeneratorRequireAuthorize()) { + this.chargingStation.getConnectorStatus(connectorId).authorizeIdTag = idTag; // Authorize idTag - const authorizeResponse = await this.chargingStation.ocppRequestService.sendAuthorize( - connectorId, - idTag - ); + const authorizeResponse: AuthorizeResponse = + await this.chargingStation.ocppRequestService.sendMessageHandler< + AuthorizeRequest, + AuthorizeResponse + >(RequestCommand.AUTHORIZE, { + idTag, + }); this.connectorsStatus.get(connectorId).authorizeRequests++; if (authorizeResponse?.idTagInfo?.status === AuthorizationStatus.ACCEPTED) { this.connectorsStatus.get(connectorId).acceptedAuthorizeRequests++; logger.info(this.logPrefix(connectorId) + ' start transaction for idTag ' + idTag); // Start transaction - startResponse = await this.chargingStation.ocppRequestService.sendStartTransaction( + startResponse = await this.chargingStation.ocppRequestService.sendMessageHandler< + StartTransactionRequest, + StartTransactionResponse + >(RequestCommand.START_TRANSACTION, { connectorId, - idTag - ); + idTag, + }); PerformanceStatistics.endMeasure(measureId, beginId); return startResponse; } @@ -292,15 +305,21 @@ export default class AutomaticTransactionGenerator { } logger.info(this.logPrefix(connectorId) + ' start transaction for idTag ' + idTag); // Start transaction - startResponse = await this.chargingStation.ocppRequestService.sendStartTransaction( + startResponse = await this.chargingStation.ocppRequestService.sendMessageHandler< + StartTransactionRequest, + StartTransactionResponse + >(RequestCommand.START_TRANSACTION, { connectorId, - idTag - ); + idTag, + }); PerformanceStatistics.endMeasure(measureId, beginId); return startResponse; } logger.info(this.logPrefix(connectorId) + ' start transaction without an idTag'); - startResponse = await this.chargingStation.ocppRequestService.sendStartTransaction(connectorId); + startResponse = await this.chargingStation.ocppRequestService.sendMessageHandler< + StartTransactionRequest, + StartTransactionResponse + >(RequestCommand.START_TRANSACTION, { connectorId }); PerformanceStatistics.endMeasure(measureId, beginId); return startResponse; } @@ -315,12 +334,35 @@ export default class AutomaticTransactionGenerator { let stopResponse: StopTransactionResponse; if (this.chargingStation.getConnectorStatus(connectorId)?.transactionStarted) { transactionId = this.chargingStation.getConnectorStatus(connectorId).transactionId; - stopResponse = await this.chargingStation.ocppRequestService.sendStopTransaction( + if ( + this.chargingStation.getBeginEndMeterValues() && + this.chargingStation.getOcppStrictCompliance() && + !this.chargingStation.getOutOfOrderEndMeterValues() + ) { + // FIXME: Implement OCPP version agnostic helpers + const transactionEndMeterValue = OCPP16ServiceUtils.buildTransactionEndMeterValue( + this.chargingStation, + connectorId, + this.chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId) + ); + await this.chargingStation.ocppRequestService.sendMessageHandler< + MeterValuesRequest, + MeterValuesResponse + >(RequestCommand.METER_VALUES, { + connectorId, + transactionId, + meterValue: transactionEndMeterValue, + }); + } + stopResponse = await this.chargingStation.ocppRequestService.sendMessageHandler< + StopTransactionRequest, + StopTransactionResponse + >(RequestCommand.STOP_TRANSACTION, { transactionId, - this.chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId), - this.chargingStation.getTransactionIdTag(transactionId), - reason - ); + meterStop: this.chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId), + idTag: this.chargingStation.getTransactionIdTag(transactionId), + reason, + }); this.connectorsStatus.get(connectorId).stopTransactionRequests++; } else { logger.warn(