AutomaticTransactionGeneratorConfiguration,
Status,
} from '../types/AutomaticTransactionGenerator';
-import { MeterValuesRequest, RequestCommand } from '../types/ocpp/Requests';
-import type { MeterValuesResponse } from '../types/ocpp/Responses';
+import { RequestCommand } from '../types/ocpp/Requests';
import {
AuthorizationStatus,
AuthorizeRequest,
StartTransactionRequest,
StartTransactionResponse,
StopTransactionReason,
- StopTransactionRequest,
StopTransactionResponse,
} from '../types/ocpp/Transaction';
import Constants from '../utils/Constants';
import logger from '../utils/Logger';
import Utils from '../utils/Utils';
import type ChargingStation from './ChargingStation';
-import { OCPP16ServiceUtils } from './ocpp/1.6/OCPP16ServiceUtils';
export default class AutomaticTransactionGenerator {
private static readonly instances: Map<string, AutomaticTransactionGenerator> = new Map<
AutomaticTransactionGenerator
>();
+ public readonly connectorsStatus: Map<number, Status>;
public readonly configuration: AutomaticTransactionGeneratorConfiguration;
public started: boolean;
private readonly chargingStation: ChargingStation;
- private readonly connectorsStatus: Map<number, Status>;
private constructor(
automaticTransactionGeneratorConfiguration: AutomaticTransactionGeneratorConfiguration,
}
public startConnector(connectorId: number): void {
- if (this.connectorsStatus.has(connectorId) === false) {
+ if (this.chargingStation.connectors.has(connectorId) === false) {
logger.warn(`${this.logPrefix(connectorId)} trying to start on non existing connector`);
return;
}
/* This is intentional */
});
});
- } else {
+ } else if (this.connectorsStatus.get(connectorId)?.start === true) {
logger.warn(`${this.logPrefix(connectorId)} already started on connector`);
}
}
}
this.connectorsStatus.get(connectorId).lastRunDate = new Date();
}
- await this.stopTransaction(connectorId);
this.connectorsStatus.get(connectorId).stoppedDate = new Date();
logger.info(
this.logPrefix(connectorId) +
this?.connectorsStatus.get(connectorId)?.rejectedStartTransactionRequests ?? 0;
this.connectorsStatus.get(connectorId).stopTransactionRequests =
this?.connectorsStatus.get(connectorId)?.stopTransactionRequests ?? 0;
+ this.connectorsStatus.get(connectorId).acceptedStopTransactionRequests =
+ this?.connectorsStatus.get(connectorId)?.acceptedStopTransactionRequests ?? 0;
+ this.connectorsStatus.get(connectorId).rejectedStopTransactionRequests =
+ this?.connectorsStatus.get(connectorId)?.rejectedStopTransactionRequests ?? 0;
this.connectorsStatus.get(connectorId).skippedConsecutiveTransactions = 0;
this.connectorsStatus.get(connectorId).skippedTransactions =
this?.connectorsStatus.get(connectorId)?.skippedTransactions ?? 0;
private async stopTransaction(
connectorId: number,
- reason: StopTransactionReason = StopTransactionReason.NONE
+ reason: StopTransactionReason = StopTransactionReason.LOCAL
): Promise<StopTransactionResponse> {
const measureId = 'StopTransaction with ATG';
const beginId = PerformanceStatistics.beginMeasure(measureId);
- let transactionId = 0;
let stopResponse: StopTransactionResponse;
- if (this.chargingStation.getConnectorStatus(connectorId)?.transactionStarted) {
- transactionId = this.chargingStation.getConnectorStatus(connectorId).transactionId;
- 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.requestHandler<
- MeterValuesRequest,
- MeterValuesResponse
- >(this.chargingStation, RequestCommand.METER_VALUES, {
- connectorId,
- transactionId,
- meterValue: [transactionEndMeterValue],
- });
- }
- stopResponse = await this.chargingStation.ocppRequestService.requestHandler<
- StopTransactionRequest,
- StopTransactionResponse
- >(this.chargingStation, RequestCommand.STOP_TRANSACTION, {
- transactionId,
- meterStop: this.chargingStation.getEnergyActiveImportRegisterByTransactionId(
- transactionId,
- true
- ),
- idTag: this.chargingStation.getTransactionIdTag(transactionId),
- reason,
- });
+ if (this.chargingStation.getConnectorStatus(connectorId)?.transactionStarted === true) {
+ stopResponse = await this.chargingStation.stopTransactionOnConnector(connectorId, reason);
this.connectorsStatus.get(connectorId).stopTransactionRequests++;
+ if (stopResponse.idTagInfo?.status === AuthorizationStatus.ACCEPTED) {
+ this.connectorsStatus.get(connectorId).acceptedStopTransactionRequests++;
+ } else {
+ this.connectorsStatus.get(connectorId).rejectedStopTransactionRequests++;
+ }
} else {
+ const transactionId = this.chargingStation.getConnectorStatus(connectorId).transactionId;
logger.warn(
`${this.logPrefix(connectorId)} trying to stop a not started transaction${
transactionId ? ' ' + transactionId.toString() : ''