+ public getNumberOfRunningTransactions(): number {
+ let trxCount = 0;
+ for (const connectorId of this.connectors.keys()) {
+ if (connectorId > 0 && this.getConnectorStatus(connectorId)?.transactionStarted === true) {
+ trxCount++;
+ }
+ }
+ return trxCount;
+ }
+
+ public async stopRunningTransactions(reason = StopTransactionReason.NONE): Promise<void> {
+ for (const connectorId of this.connectors.keys()) {
+ if (connectorId > 0 && this.getConnectorStatus(connectorId)?.transactionStarted === true) {
+ await this.stopTransactionOnConnector(connectorId, reason);
+ }
+ }
+ }
+
+ public async stopTransactionOnConnector(
+ connectorId: number,
+ reason = StopTransactionReason.NONE
+ ): Promise<StopTransactionResponse> {
+ const transactionId = this.getConnectorStatus(connectorId).transactionId;
+ if (
+ this.getBeginEndMeterValues() &&
+ this.getOcppStrictCompliance() &&
+ !this.getOutOfOrderEndMeterValues()
+ ) {
+ // FIXME: Implement OCPP version agnostic helpers
+ const transactionEndMeterValue = OCPP16ServiceUtils.buildTransactionEndMeterValue(
+ this,
+ connectorId,
+ this.getEnergyActiveImportRegisterByTransactionId(transactionId)
+ );
+ await this.ocppRequestService.requestHandler<MeterValuesRequest, MeterValuesResponse>(
+ this,
+ RequestCommand.METER_VALUES,
+ {
+ connectorId,
+ transactionId,
+ meterValue: [transactionEndMeterValue],
+ }
+ );
+ }
+ return this.ocppRequestService.requestHandler<StopTransactionRequest, StopTransactionResponse>(
+ this,
+ RequestCommand.STOP_TRANSACTION,
+ {
+ transactionId,
+ meterStop: this.getEnergyActiveImportRegisterByTransactionId(transactionId, true),
+ idTag: this.getTransactionIdTag(transactionId),
+ reason,
+ }
+ );
+ }
+