X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FChargingStation.ts;h=5f4f58b4ca86ea224ead2612b1d44c8d5282ab83;hb=0d1f33bab47bbcd712ea6ae7e26293917c8bc398;hp=e728885121ed76676d6ffbbaab848f5380509671;hpb=530e5fbb749e20d337aff18f643dc69a5b5444d6;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ChargingStation.ts b/src/charging-station/ChargingStation.ts index e7288851..5f4f58b4 100644 --- a/src/charging-station/ChargingStation.ts +++ b/src/charging-station/ChargingStation.ts @@ -26,26 +26,11 @@ import { getConfigurationKey, setConfigurationKeyValue, } from './ConfigurationKeyUtils'; -import { IdTagsCache } from './IdTagsCache'; -import { - OCPP16IncomingRequestService, - OCPP16RequestService, - OCPP16ResponseService, - OCPP16ServiceUtils, - OCPP20IncomingRequestService, - OCPP20RequestService, - OCPP20ResponseService, - type OCPPIncomingRequestService, - type OCPPRequestService, - OCPPServiceUtils, -} from './ocpp'; -import { SharedLRUCache } from './SharedLRUCache'; import { buildConnectorsMap, checkConnectorsConfiguration, checkStationInfoConnectorStatus, checkTemplate, - countReservableConnectors, createBootNotificationRequest, createSerialNumber, getAmperageLimitationUnitDivider, @@ -56,13 +41,30 @@ import { getHashId, getIdTagsFile, getMaxNumberOfEvses, + getNumberOfReservableConnectors, getPhaseRotationValue, hasFeatureProfile, + hasReservationExpired, initializeConnectorsMapStatus, propagateSerialNumber, + removeExpiredReservations, stationTemplateToStationInfo, warnTemplateKeysDeprecation, -} from './Utils'; +} from './Helpers'; +import { IdTagsCache } from './IdTagsCache'; +import { + OCPP16IncomingRequestService, + OCPP16RequestService, + OCPP16ResponseService, + OCPP16ServiceUtils, + OCPP20IncomingRequestService, + OCPP20RequestService, + OCPP20ResponseService, + type OCPPIncomingRequestService, + type OCPPRequestService, + OCPPServiceUtils, +} from './ocpp'; +import { SharedLRUCache } from './SharedLRUCache'; import { BaseError, OCPPError } from '../exception'; import { PerformanceStatistics } from '../performance'; import { @@ -104,7 +106,7 @@ import { RegistrationStatusEnumType, RequestCommand, type Reservation, - ReservationFilterKey, + type ReservationKey, ReservationTerminationReason, type Response, StandardParametersKey, @@ -246,8 +248,8 @@ export class ChargingStation { return this.stationInfo.enableStatistics ?? false; } - public getMustAuthorizeAtRemoteStart(): boolean { - return this.stationInfo.mustAuthorizeAtRemoteStart ?? true; + public getRemoteAuthorization(): boolean { + return this.stationInfo.remoteAuthorization ?? true; } public getNumberOfPhases(stationInfo?: ChargingStationInfo): number { @@ -936,17 +938,14 @@ export class ChargingStation { ); } - public getReservationOnConnectorId0Enabled(): boolean { + public getReserveConnectorZeroSupported(): boolean { return convertToBoolean( getConfigurationKey(this, StandardParametersKey.ReserveConnectorZeroSupported)!.value, ); } public async addReservation(reservation: Reservation): Promise { - const reservationFound = this.getReservationBy( - ReservationFilterKey.RESERVATION_ID, - reservation.reservationId, - ); + const reservationFound = this.getReservationBy('reservationId', reservation.reservationId); if (!isUndefined(reservationFound)) { await this.removeReservation( reservationFound!, @@ -965,7 +964,7 @@ export class ChargingStation { public async removeReservation( reservation: Reservation, - reason?: ReservationTerminationReason, + reason: ReservationTerminationReason, ): Promise { const connector = this.getConnectorStatus(reservation.connectorId)!; switch (reason) { @@ -986,32 +985,57 @@ export class ChargingStation { delete connector.reservation; break; default: - break; + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + throw new BaseError(`Unknown reservation termination reason '${reason}'`); } } public getReservationBy( - filterKey: ReservationFilterKey, + filterKey: ReservationKey, value: number | string, ): Reservation | undefined { if (this.hasEvses) { for (const evseStatus of this.evses.values()) { for (const connectorStatus of evseStatus.connectors.values()) { - if (connectorStatus?.reservation?.[filterKey as keyof Reservation] === value) { + if (connectorStatus?.reservation?.[filterKey] === value) { return connectorStatus.reservation; } } } } else { for (const connectorStatus of this.connectors.values()) { - if (connectorStatus?.reservation?.[filterKey as keyof Reservation] === value) { + if (connectorStatus?.reservation?.[filterKey] === value) { return connectorStatus.reservation; } } } } - public startReservationExpirationSetInterval(customInterval?: number): void { + public isConnectorReservable( + reservationId: number, + idTag?: string, + connectorId?: number, + ): boolean { + const reservation = this.getReservationBy('reservationId', reservationId); + const reservationExists = !isUndefined(reservation) && !hasReservationExpired(reservation!); + if (arguments.length === 1) { + return !reservationExists; + } else if (arguments.length > 1) { + const userReservation = !isUndefined(idTag) + ? this.getReservationBy('idTag', idTag!) + : undefined; + const userReservationExists = + !isUndefined(userReservation) && !hasReservationExpired(userReservation!); + const notConnectorZero = isUndefined(connectorId) ? true : connectorId! > 0; + const freeConnectorsAvailable = this.getNumberOfReservableConnectors() > 0; + return ( + !reservationExists && !userReservationExists && notConnectorZero && freeConnectorsAvailable + ); + } + return false; + } + + private startReservationExpirationSetInterval(customInterval?: number): void { const interval = customInterval ?? Constants.DEFAULT_RESERVATION_EXPIRATION_OBSERVATION_INTERVAL; if (interval > 0) { @@ -1021,76 +1045,32 @@ export class ChargingStation { )}`, ); this.reservationExpirationSetInterval = setInterval((): void => { - const currentDate = new Date(); - if (this.hasEvses) { - for (const evseStatus of this.evses.values()) { - for (const connectorStatus of evseStatus.connectors.values()) { - if ( - connectorStatus.reservation && - connectorStatus.reservation.expiryDate < currentDate - ) { - this.removeReservation( - connectorStatus.reservation, - ReservationTerminationReason.EXPIRED, - ).catch(Constants.EMPTY_FUNCTION); - } - } - } - } else { - for (const connectorStatus of this.connectors.values()) { - if ( - connectorStatus.reservation && - connectorStatus.reservation.expiryDate < currentDate - ) { - this.removeReservation( - connectorStatus.reservation, - ReservationTerminationReason.EXPIRED, - ).catch(Constants.EMPTY_FUNCTION); - } - } - } + removeExpiredReservations(this).catch(Constants.EMPTY_FUNCTION); }, interval); } } - public restartReservationExpiryDateSetInterval(): void { - this.stopReservationExpirationSetInterval(); - this.startReservationExpirationSetInterval(); - } - - public validateIncomingRequestWithReservation(connectorId: number, idTag: string): boolean { - return this.getReservationBy(ReservationFilterKey.CONNECTOR_ID, connectorId)?.idTag === idTag; + private stopReservationExpirationSetInterval(): void { + if (this.reservationExpirationSetInterval) { + clearInterval(this.reservationExpirationSetInterval); + } } - public isConnectorReservable( - reservationId: number, - idTag?: string, - connectorId?: number, - ): boolean { - const reservationExists = !isUndefined( - this.getReservationBy(ReservationFilterKey.RESERVATION_ID, reservationId), - ); - const userReservationExists = - !isUndefined(idTag) && isUndefined(this.getReservationBy(ReservationFilterKey.ID_TAG, idTag!)) - ? false - : true; - const notConnectorZero = isUndefined(connectorId) ? true : connectorId! > 0; - const freeConnectorsAvailable = this.getNumberOfReservableConnectors() > 0; - return ( - !reservationExists && !userReservationExists && notConnectorZero && freeConnectorsAvailable - ); - } + // private restartReservationExpiryDateSetInterval(): void { + // this.stopReservationExpirationSetInterval(); + // this.startReservationExpirationSetInterval(); + // } private getNumberOfReservableConnectors(): number { - let reservableConnectors = 0; + let numberOfReservableConnectors = 0; if (this.hasEvses) { for (const evseStatus of this.evses.values()) { - reservableConnectors += countReservableConnectors(evseStatus.connectors); + numberOfReservableConnectors += getNumberOfReservableConnectors(evseStatus.connectors); } } else { - reservableConnectors = countReservableConnectors(this.connectors); + numberOfReservableConnectors = getNumberOfReservableConnectors(this.connectors); } - return reservableConnectors - this.getNumberOfReservationsOnConnectorZero(); + return numberOfReservableConnectors - this.getNumberOfReservationsOnConnectorZero(); } private getNumberOfReservationsOnConnectorZero(): number { @@ -1132,12 +1112,6 @@ export class ChargingStation { return this.stationInfo.supervisionUrlOcppConfiguration ?? false; } - private stopReservationExpirationSetInterval(): void { - if (this.reservationExpirationSetInterval) { - clearInterval(this.reservationExpirationSetInterval); - } - } - private getSupervisionUrlOcppKey(): string { return this.stationInfo.supervisionUrlOcppKey ?? VendorParametersKey.ConnectionUrl; }