Skip to content
This repository has been archived by the owner on Jan 9, 2024. It is now read-only.

Commit

Permalink
Properly handle charging profiles set a remote start transaction.
Browse files Browse the repository at this point in the history
Signed-off-by: Jérôme Benoit <[email protected]>
  • Loading branch information
Jérôme Benoit committed Jun 28, 2021
1 parent 0f553b8 commit e060fe5
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 20 deletions.
42 changes: 25 additions & 17 deletions src/charging-station/ocpp/1.6/OCCP16IncomingRequestService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -278,43 +278,51 @@ 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);
}
return await this.notifyRemoteStartTransactionRejected(transactionConnectorId, commandPayload.idTag);
}

private async notifyRemoteStartTransactionRejected(connectorId: number, idTag: string): Promise<DefaultResponse> {
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<boolean> {
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;
}
}

Expand Down
6 changes: 4 additions & 2 deletions src/charging-station/ocpp/1.6/OCPP16ResponseService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 },
Expand Down

0 comments on commit e060fe5

Please sign in to comment.