From e060fe587a245ba900b8895f9cf5b8f926bdecb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 28 Jun 2021 15:56:59 +0200 Subject: [PATCH] Properly handle charging profiles set a remote start transaction. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- .../ocpp/1.6/OCCP16IncomingRequestService.ts | 42 +++++++++++-------- .../ocpp/1.6/OCPP16ResponseService.ts | 6 ++- .../ocpp/1.6/OCPP16ServiceUtils.ts | 2 +- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/charging-station/ocpp/1.6/OCCP16IncomingRequestService.ts b/src/charging-station/ocpp/1.6/OCCP16IncomingRequestService.ts index 14a8b97d9..e806051a4 100644 --- a/src/charging-station/ocpp/1.6/OCCP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCCP16IncomingRequestService.ts @@ -261,9 +261,9 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer await this.chargingStation.ocppRequestService.sendStatusNotification(transactionConnectorId, OCPP16ChargePointStatus.PREPARING); this.chargingStation.getConnector(transactionConnectorId).status = OCPP16ChargePointStatus.PREPARING; if (this.chargingStation.isChargingStationAvailable() && this.chargingStation.isConnectorAvailable(transactionConnectorId)) { + // Check if authorized if (this.chargingStation.getAuthorizeRemoteTxRequests()) { let authorized = false; - // Check if authorized if (this.chargingStation.getLocalAuthListEnabled() && this.chargingStation.hasAuthorizedTags() && this.chargingStation.authorizedTags.find((value) => value === commandPayload.idTag)) { authorized = true; @@ -278,20 +278,26 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer } if (authorized) { // Authorization successful, start transaction - await this.chargingStation.ocppRequestService.sendStartTransaction(transactionConnectorId, commandPayload.idTag); - logger.debug(this.chargingStation.logPrefix() + ' Transaction remotely STARTED on ' + this.chargingStation.stationInfo.chargingStationId + '#' + transactionConnectorId.toString() + ' for idTag ' + commandPayload.idTag); - return await this.setRemoteStartChargingProfile(transactionConnectorId, commandPayload.chargingProfile) - ? Constants.OCPP_RESPONSE_ACCEPTED - : await this.notifyRemoteStartTransactionRejected(transactionConnectorId, commandPayload.idTag); + if (this.setRemoteStartTransactionChargingProfile(transactionConnectorId, commandPayload.chargingProfile)) { + if ((await this.chargingStation.ocppRequestService.sendStartTransaction(transactionConnectorId, commandPayload.idTag)).idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED) { + logger.debug(this.chargingStation.logPrefix() + ' Transaction remotely STARTED on ' + this.chargingStation.stationInfo.chargingStationId + '#' + transactionConnectorId.toString() + ' for idTag ' + commandPayload.idTag); + return Constants.OCPP_RESPONSE_ACCEPTED; + } + return await this.notifyRemoteStartTransactionRejected(transactionConnectorId, commandPayload.idTag); + } + return await this.notifyRemoteStartTransactionRejected(transactionConnectorId, commandPayload.idTag); } return await this.notifyRemoteStartTransactionRejected(transactionConnectorId, commandPayload.idTag); } // No authorization check required, start transaction - await this.chargingStation.ocppRequestService.sendStartTransaction(transactionConnectorId, commandPayload.idTag); - logger.debug(this.chargingStation.logPrefix() + ' Transaction remotely STARTED on ' + this.chargingStation.stationInfo.chargingStationId + '#' + transactionConnectorId.toString() + ' for idTag ' + commandPayload.idTag); - return await this.setRemoteStartChargingProfile(transactionConnectorId, commandPayload.chargingProfile) - ? Constants.OCPP_RESPONSE_ACCEPTED - : await this.notifyRemoteStartTransactionRejected(transactionConnectorId, commandPayload.idTag); + if (this.setRemoteStartTransactionChargingProfile(transactionConnectorId, commandPayload.chargingProfile)) { + if ((await this.chargingStation.ocppRequestService.sendStartTransaction(transactionConnectorId, commandPayload.idTag)).idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED) { + logger.debug(this.chargingStation.logPrefix() + ' Transaction remotely STARTED on ' + this.chargingStation.stationInfo.chargingStationId + '#' + transactionConnectorId.toString() + ' for idTag ' + commandPayload.idTag); + return Constants.OCPP_RESPONSE_ACCEPTED; + } + return await this.notifyRemoteStartTransactionRejected(transactionConnectorId, commandPayload.idTag); + } + return await this.notifyRemoteStartTransactionRejected(transactionConnectorId, commandPayload.idTag); } return await this.notifyRemoteStartTransactionRejected(transactionConnectorId, commandPayload.idTag); } @@ -299,22 +305,24 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer } private async notifyRemoteStartTransactionRejected(connectorId: number, idTag: string): Promise { - await this.chargingStation.ocppRequestService.sendStatusNotification(connectorId, OCPP16ChargePointStatus.AVAILABLE); - this.chargingStation.getConnector(connectorId).status = OCPP16ChargePointStatus.AVAILABLE; - logger.warn(this.chargingStation.logPrefix() + ' Remote starting transaction REJECTED on connector Id ' + connectorId.toString() + ', availability ' + this.chargingStation.getConnector(connectorId).availability + ', idTag ' + idTag); + if (this.chargingStation.getConnector(connectorId).status !== OCPP16ChargePointStatus.AVAILABLE) { + await this.chargingStation.ocppRequestService.sendStatusNotification(connectorId, OCPP16ChargePointStatus.AVAILABLE); + this.chargingStation.getConnector(connectorId).status = OCPP16ChargePointStatus.AVAILABLE; + } + logger.warn(this.chargingStation.logPrefix() + ' Remote starting transaction REJECTED on connector Id ' + connectorId.toString() + ', idTag ' + idTag + ', availability ' + this.chargingStation.getConnector(connectorId).availability + ', status ' + this.chargingStation.getConnector(connectorId).status); return Constants.OCPP_RESPONSE_REJECTED; } - private async setRemoteStartChargingProfile(connectorId: number, cp: OCPP16ChargingProfile): Promise { + private setRemoteStartTransactionChargingProfile(connectorId: number, cp: OCPP16ChargingProfile): boolean { if (cp && cp.chargingProfilePurpose === ChargingProfilePurposeType.TX_PROFILE) { this.chargingStation.setChargingProfile(connectorId, cp); logger.debug(`${this.chargingStation.logPrefix()} Charging profile(s) set at remote start transaction, dump their stack: %j`, this.chargingStation.getConnector(connectorId).chargingProfiles); return true; } else if (cp && cp.chargingProfilePurpose !== ChargingProfilePurposeType.TX_PROFILE) { - await this.chargingStation.ocppRequestService.sendStatusNotification(connectorId, OCPP16ChargePointStatus.AVAILABLE); - this.chargingStation.getConnector(connectorId).status = OCPP16ChargePointStatus.AVAILABLE; logger.warn(`${this.chargingStation.logPrefix()} Not allowed to set ${cp.chargingProfilePurpose} charging profile(s) at remote start transaction`); return false; + } else if (!cp) { + return true; } } diff --git a/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts b/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts index edfb99035..0bfef77e4 100644 --- a/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts @@ -75,8 +75,10 @@ export default class OCPP16ResponseService extends OCPPResponseService { } else { logger.warn(this.chargingStation.logPrefix() + ' Starting transaction id ' + payload.transactionId.toString() + ' REJECTED with status ' + payload?.idTagInfo?.status + ', idTag ' + requestPayload.idTag); this.chargingStation.resetTransactionOnConnector(connectorId); - await this.chargingStation.ocppRequestService.sendStatusNotification(connectorId, OCPP16ChargePointStatus.AVAILABLE); - this.chargingStation.getConnector(connectorId).status = OCPP16ChargePointStatus.AVAILABLE; + if (this.chargingStation.getConnector(connectorId).status !== OCPP16ChargePointStatus.AVAILABLE) { + await this.chargingStation.ocppRequestService.sendStatusNotification(connectorId, OCPP16ChargePointStatus.AVAILABLE); + this.chargingStation.getConnector(connectorId).status = OCPP16ChargePointStatus.AVAILABLE; + } } } diff --git a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts index b50ea9f73..85c3f831d 100644 --- a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts +++ b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts @@ -23,7 +23,7 @@ export class OCPP16ServiceUtils { const sampledValueContext = context ?? (sampledValueTemplate.context ?? null); const sampledValueLocation = sampledValueTemplate.location ? sampledValueTemplate.location - : (OCPP16ServiceUtils.getMeasurandDefaultLocation(sampledValueTemplate.measurand ?? null)); + : OCPP16ServiceUtils.getMeasurandDefaultLocation(sampledValueTemplate.measurand ?? null); const sampledValuePhase = phase ?? (sampledValueTemplate.phase ?? null); return { ...!Utils.isNullOrUndefined(sampledValueTemplate.unit) && { unit: sampledValueTemplate.unit },