private readonly sharedLRUCache: SharedLRUCache;
private webSocketPingSetInterval!: NodeJS.Timeout;
private readonly chargingStationWorkerBroadcastChannel: ChargingStationWorkerBroadcastChannel;
- private reservationExpiryDateSetInterval?: NodeJS.Timeout;
+ private reservationExpirationSetInterval?: NodeJS.Timeout;
constructor(index: number, templateFile: string) {
this.started = false;
this.performanceStatistics?.start();
}
if (this.hasFeatureProfile(SupportedFeatureProfiles.Reservation)) {
- this.startReservationExpiryDateSetInterval();
+ this.startReservationExpirationSetInterval();
}
this.openWSConnection();
// Monitor charging station template file
public async addReservation(reservation: Reservation): Promise<void> {
const [exists, reservationFound] = this.doesReservationExists(reservation);
if (exists) {
- await this.removeReservation(reservationFound);
+ await this.removeReservation(reservationFound, ReservationTerminationReason.REPLACE_EXISTING);
}
- const connectorStatus = this.getConnectorStatus(reservation.connectorId);
- connectorStatus.reservation = reservation;
- connectorStatus.status = ConnectorStatusEnum.Reserved;
- if (reservation.connectorId === 0) {
- return;
- }
- await this.ocppRequestService.requestHandler<
- StatusNotificationRequest,
- StatusNotificationResponse
- >(
+ this.getConnectorStatus(reservation.connectorId).reservation = reservation;
+ await OCPPServiceUtils.sendAndSetConnectorStatus(
this,
- RequestCommand.STATUS_NOTIFICATION,
- OCPPServiceUtils.buildStatusNotificationRequest(
- this,
- reservation.connectorId,
- ConnectorStatusEnum.Reserved
- )
+ reservation.connectorId,
+ ConnectorStatusEnum.Reserved,
+ null,
+ { send: reservation.connectorId !== 0 }
);
}
): Promise<void> {
const connector = this.getConnectorStatus(reservation.connectorId);
switch (reason) {
- case ReservationTerminationReason.TRANSACTION_STARTED: {
+ case ReservationTerminationReason.CONNECTOR_STATE_CHANGED:
delete connector.reservation;
- if (reservation.connectorId === 0) {
- connector.status = ConnectorStatusEnum.Available;
- }
break;
- }
- case ReservationTerminationReason.CONNECTOR_STATE_CHANGED: {
+ case ReservationTerminationReason.TRANSACTION_STARTED:
delete connector.reservation;
break;
- }
- default: {
- // ReservationTerminationReason.EXPIRED, ReservationTerminationReason.CANCELED
- connector.status = ConnectorStatusEnum.Available;
- delete connector.reservation;
- await this.ocppRequestService.requestHandler<
- StatusNotificationRequest,
- StatusNotificationResponse
- >(
+ case ReservationTerminationReason.RESERVATION_CANCELED ||
+ ReservationTerminationReason.REPLACE_EXISTING ||
+ ReservationTerminationReason.EXPIRED:
+ await OCPPServiceUtils.sendAndSetConnectorStatus(
this,
- RequestCommand.STATUS_NOTIFICATION,
- OCPPServiceUtils.buildStatusNotificationRequest(
- this,
- reservation.connectorId,
- ConnectorStatusEnum.Available
- )
+ reservation.connectorId,
+ ConnectorStatusEnum.Available,
+ null,
+ { send: reservation.connectorId !== 0 }
);
+ delete connector.reservation;
+ break;
+ default:
break;
- }
}
}
- public getReservationBy(key: string, value: number | string): Reservation {
+ public getReservationBy(filterKey: ReservationFilterKey, value: number | string): Reservation {
if (this.hasEvses) {
for (const evse of this.evses.values()) {
for (const connector of evse.connectors.values()) {
- if (connector?.reservation?.[key] === value) {
+ if (connector?.reservation?.[filterKey] === value) {
return connector.reservation;
}
}
}
} else {
for (const connector of this.connectors.values()) {
- if (connector?.reservation?.[key] === value) {
+ if (connector?.reservation?.[filterKey] === value) {
return connector.reservation;
}
}
return Utils.isUndefined(foundReservation) ? [false, null] : [true, foundReservation];
}
- public startReservationExpiryDateSetInterval(customInterval?: number): void {
+ public startReservationExpirationSetInterval(customInterval?: number): void {
const interval =
customInterval ?? Constants.DEFAULT_RESERVATION_EXPIRATION_OBSERVATION_INTERVAL;
logger.info(
`${this.logPrefix()} Reservation expiration date interval is set to ${interval}
- and starts on CS now`
+ and starts on charging station now`
);
// eslint-disable-next-line @typescript-eslint/no-misused-promises
- this.reservationExpiryDateSetInterval = setInterval(async (): Promise<void> => {
+ this.reservationExpirationSetInterval = setInterval(async (): Promise<void> => {
if (this.hasEvses) {
for (const evse of this.evses.values()) {
for (const connector of evse.connectors.values()) {
if (connector?.reservation?.expiryDate.toString() < new Date().toISOString()) {
- await this.removeReservation(connector.reservation);
+ await this.removeReservation(
+ connector.reservation,
+ ReservationTerminationReason.EXPIRED
+ );
}
}
}
} else {
for (const connector of this.connectors.values()) {
if (connector?.reservation?.expiryDate.toString() < new Date().toISOString()) {
- await this.removeReservation(connector.reservation);
+ await this.removeReservation(
+ connector.reservation,
+ ReservationTerminationReason.EXPIRED
+ );
}
}
}
}
public restartReservationExpiryDateSetInterval(): void {
- this.stopReservationExpiryDateSetInterval();
- this.startReservationExpiryDateSetInterval();
+ this.stopReservationExpirationSetInterval();
+ this.startReservationExpirationSetInterval();
}
public validateIncomingRequestWithReservation(connectorId: number, idTag: string): boolean {
private countReservableConnectors(connectors: Map<number, ConnectorStatus>) {
let reservableConnectors = 0;
- for (const [id, connector] of connectors) {
- if (id === 0) {
+ for (const [connectorId, connector] of connectors) {
+ if (connectorId === 0) {
continue;
}
if (connector.status === ConnectorStatusEnum.Available) {
return this.stationInfo.supervisionUrlOcppConfiguration ?? false;
}
- private stopReservationExpiryDateSetInterval(): void {
- if (this.reservationExpiryDateSetInterval) {
- clearInterval(this.reservationExpiryDateSetInterval);
+ private stopReservationExpirationSetInterval(): void {
+ if (this.reservationExpirationSetInterval) {
+ clearInterval(this.reservationExpirationSetInterval);
}
}