X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FChargingStation.ts;h=b44bf75d0d735c16eb1db19ce550548c8341925b;hb=b85cef4cba7e4d2294940aef29a9f74edf800dac;hp=d0c7b0780119e528ab5c6a019563f7177dc4c7ff;hpb=42371a2ed3ad187c91417fa759fd260ae86dee7c;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ChargingStation.ts b/src/charging-station/ChargingStation.ts index d0c7b078..b44bf75d 100644 --- a/src/charging-station/ChargingStation.ts +++ b/src/charging-station/ChargingStation.ts @@ -19,7 +19,12 @@ import { type RawData, WebSocket } from 'ws'; import { AutomaticTransactionGenerator } from './AutomaticTransactionGenerator'; import { ChargingStationWorkerBroadcastChannel } from './broadcast-channel/ChargingStationWorkerBroadcastChannel'; -import { ChargingStationConfigurationUtils } from './ChargingStationConfigurationUtils'; +import { + addConfigurationKey, + deleteConfigurationKey, + getConfigurationKey, + setConfigurationKeyValue, +} from './ChargingStationConfigurationUtils'; import { buildConnectorsMap, checkConnectorsConfiguration, @@ -172,6 +177,7 @@ export class ChargingStation { private configurationFileHash!: string; private connectorsConfigurationHash!: string; private evsesConfigurationHash!: string; + private automaticTransactionGeneratorConfiguration?: AutomaticTransactionGeneratorConfiguration; private ocppIncomingRequestService!: OCPPIncomingRequestService; private readonly messageBuffer: Set; private configuredSupervisionUrl!: URL; @@ -212,16 +218,8 @@ export class ChargingStation { `${ this.getSupervisionUrlOcppConfiguration() && isNotEmptyString(this.getSupervisionUrlOcppKey()) && - isNotEmptyString( - ChargingStationConfigurationUtils.getConfigurationKey( - this, - this.getSupervisionUrlOcppKey(), - )?.value, - ) - ? ChargingStationConfigurationUtils.getConfigurationKey( - this, - this.getSupervisionUrlOcppKey(), - )!.value + isNotEmptyString(getConfigurationKey(this, this.getSupervisionUrlOcppKey())?.value) + ? getConfigurationKey(this, this.getSupervisionUrlOcppKey())!.value : this.configuredSupervisionUrl.href }/${this.stationInfo.chargingStationId}`, ); @@ -363,7 +361,10 @@ export class ChargingStation { public getMaximumPower(stationInfo?: ChargingStationInfo): number { const localStationInfo = stationInfo ?? this.stationInfo; // eslint-disable-next-line @typescript-eslint/dot-notation - return (localStationInfo['maxPower'] as number) ?? localStationInfo.maximumPower; + return ( + (localStationInfo['maxPower' as keyof ChargingStationInfo] as number) ?? + localStationInfo.maximumPower + ); } public getConnectorMaximumAvailablePower(connectorId: number): number { @@ -497,7 +498,7 @@ export class ChargingStation { } public getAuthorizeRemoteTxRequests(): boolean { - const authorizeRemoteTxRequests = ChargingStationConfigurationUtils.getConfigurationKey( + const authorizeRemoteTxRequests = getConfigurationKey( this, StandardParametersKey.AuthorizeRemoteTxRequests, ); @@ -505,7 +506,7 @@ export class ChargingStation { } public getLocalAuthListEnabled(): boolean { - const localAuthListEnabled = ChargingStationConfigurationUtils.getConfigurationKey( + const localAuthListEnabled = getConfigurationKey( this, StandardParametersKey.LocalAuthListEnabled, ); @@ -513,17 +514,11 @@ export class ChargingStation { } public getHeartbeatInterval(): number { - const HeartbeatInterval = ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.HeartbeatInterval, - ); + const HeartbeatInterval = getConfigurationKey(this, StandardParametersKey.HeartbeatInterval); if (HeartbeatInterval) { return convertToInt(HeartbeatInterval.value) * 1000; } - const HeartBeatInterval = ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.HeartBeatInterval, - ); + const HeartBeatInterval = getConfigurationKey(this, StandardParametersKey.HeartBeatInterval); if (HeartBeatInterval) { return convertToInt(HeartBeatInterval.value) * 1000; } @@ -541,11 +536,7 @@ export class ChargingStation { this.getSupervisionUrlOcppConfiguration() && isNotEmptyString(this.getSupervisionUrlOcppKey()) ) { - ChargingStationConfigurationUtils.setConfigurationKeyValue( - this, - this.getSupervisionUrlOcppKey(), - url, - ); + setConfigurationKeyValue(this, this.getSupervisionUrlOcppKey(), url); } else { this.stationInfo.supervisionUrls = url; this.saveStationInfo(); @@ -700,6 +691,7 @@ export class ChargingStation { this.idTagsCache.deleteIdTags(getIdTagsFile(this.stationInfo)!); // Restart the ATG this.stopAutomaticTransactionGenerator(); + delete this.automaticTransactionGeneratorConfiguration; if (this.getAutomaticTransactionGeneratorConfiguration()?.enable === true) { this.startAutomaticTransactionGenerator(); } @@ -768,7 +760,7 @@ export class ChargingStation { } public hasFeatureProfile(featureProfile: SupportedFeatureProfiles): boolean | undefined { - return ChargingStationConfigurationUtils.getConfigurationKey( + return getConfigurationKey( this, StandardParametersKey.SupportedFeatureProfiles, )?.value?.includes(featureProfile); @@ -856,25 +848,28 @@ export class ChargingStation { } public getAutomaticTransactionGeneratorConfiguration(): AutomaticTransactionGeneratorConfiguration { - let automaticTransactionGeneratorConfiguration: - | AutomaticTransactionGeneratorConfiguration - | undefined; - const automaticTransactionGeneratorConfigurationFromFile = - this.getConfigurationFromFile()?.automaticTransactionGenerator; - if ( - this.getAutomaticTransactionGeneratorPersistentConfiguration() && - automaticTransactionGeneratorConfigurationFromFile - ) { - automaticTransactionGeneratorConfiguration = - automaticTransactionGeneratorConfigurationFromFile; - } else { - automaticTransactionGeneratorConfiguration = - this.getTemplateFromFile()?.AutomaticTransactionGenerator; + if (isNullOrUndefined(this.automaticTransactionGeneratorConfiguration)) { + let automaticTransactionGeneratorConfiguration: + | AutomaticTransactionGeneratorConfiguration + | undefined; + const automaticTransactionGeneratorConfigurationFromFile = + this.getConfigurationFromFile()?.automaticTransactionGenerator; + if ( + this.getAutomaticTransactionGeneratorPersistentConfiguration() && + automaticTransactionGeneratorConfigurationFromFile + ) { + automaticTransactionGeneratorConfiguration = + automaticTransactionGeneratorConfigurationFromFile; + } else { + automaticTransactionGeneratorConfiguration = + this.getTemplateFromFile()?.AutomaticTransactionGenerator; + } + this.automaticTransactionGeneratorConfiguration = { + ...Constants.DEFAULT_ATG_CONFIGURATION, + ...automaticTransactionGeneratorConfiguration, + }; } - return { - ...Constants.DEFAULT_ATG_CONFIGURATION, - ...automaticTransactionGeneratorConfiguration, - }; + return this.automaticTransactionGeneratorConfiguration!; } public getAutomaticTransactionGeneratorStatuses(): Status[] | undefined { @@ -945,10 +940,7 @@ export class ChargingStation { public getReservationOnConnectorId0Enabled(): boolean { return convertToBoolean( - ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.ReserveConnectorZeroSupported, - )!.value, + getConfigurationKey(this, StandardParametersKey.ReserveConnectorZeroSupported)!.value, ); } @@ -1006,14 +998,14 @@ export class ChargingStation { if (this.hasEvses) { for (const evseStatus of this.evses.values()) { for (const connectorStatus of evseStatus.connectors.values()) { - if (connectorStatus?.reservation?.[filterKey] === value) { + if (connectorStatus?.reservation?.[filterKey as keyof Reservation] === value) { return connectorStatus.reservation; } } } } else { for (const connectorStatus of this.connectors.values()) { - if (connectorStatus?.reservation?.[filterKey] === value) { + if (connectorStatus?.reservation?.[filterKey as keyof Reservation] === value) { return connectorStatus.reservation; } } @@ -1038,27 +1030,26 @@ export class ChargingStation { and starts on charging station now`, ); if (interval > 0) { - // eslint-disable-next-line @typescript-eslint/no-misused-promises - this.reservationExpirationSetInterval = setInterval(async (): Promise => { - const now = new Date(); + this.reservationExpirationSetInterval = setInterval((): void => { + const dateNow = new Date(); if (this.hasEvses) { for (const evseStatus of this.evses.values()) { for (const connectorStatus of evseStatus.connectors.values()) { - if (connectorStatus.reservation!.expiryDate < now) { - await this.removeReservation( - connectorStatus.reservation!, + if (connectorStatus.reservation && connectorStatus.reservation.expiryDate < dateNow) { + this.removeReservation( + connectorStatus.reservation, ReservationTerminationReason.EXPIRED, - ); + ).catch(Constants.EMPTY_FUNCTION); } } } } else { for (const connectorStatus of this.connectors.values()) { - if (connectorStatus.reservation!.expiryDate < now) { - await this.removeReservation( - connectorStatus.reservation!, + if (connectorStatus.reservation && connectorStatus.reservation.expiryDate < dateNow) { + this.removeReservation( + connectorStatus.reservation, ReservationTerminationReason.EXPIRED, - ); + ).catch(Constants.EMPTY_FUNCTION); } } } @@ -1373,37 +1364,18 @@ export class ChargingStation { } private initializeOcppConfiguration(): void { - if ( - !ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.HeartbeatInterval, - ) - ) { - ChargingStationConfigurationUtils.addConfigurationKey( - this, - StandardParametersKey.HeartbeatInterval, - '0', - ); + if (!getConfigurationKey(this, StandardParametersKey.HeartbeatInterval)) { + addConfigurationKey(this, StandardParametersKey.HeartbeatInterval, '0'); } - if ( - !ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.HeartBeatInterval, - ) - ) { - ChargingStationConfigurationUtils.addConfigurationKey( - this, - StandardParametersKey.HeartBeatInterval, - '0', - { visible: false }, - ); + if (!getConfigurationKey(this, StandardParametersKey.HeartBeatInterval)) { + addConfigurationKey(this, StandardParametersKey.HeartBeatInterval, '0', { visible: false }); } if ( this.getSupervisionUrlOcppConfiguration() && isNotEmptyString(this.getSupervisionUrlOcppKey()) && - !ChargingStationConfigurationUtils.getConfigurationKey(this, this.getSupervisionUrlOcppKey()) + !getConfigurationKey(this, this.getSupervisionUrlOcppKey()) ) { - ChargingStationConfigurationUtils.addConfigurationKey( + addConfigurationKey( this, this.getSupervisionUrlOcppKey(), this.configuredSupervisionUrl.href, @@ -1412,22 +1384,15 @@ export class ChargingStation { } else if ( !this.getSupervisionUrlOcppConfiguration() && isNotEmptyString(this.getSupervisionUrlOcppKey()) && - ChargingStationConfigurationUtils.getConfigurationKey(this, this.getSupervisionUrlOcppKey()) + getConfigurationKey(this, this.getSupervisionUrlOcppKey()) ) { - ChargingStationConfigurationUtils.deleteConfigurationKey( - this, - this.getSupervisionUrlOcppKey(), - { save: false }, - ); + deleteConfigurationKey(this, this.getSupervisionUrlOcppKey(), { save: false }); } if ( isNotEmptyString(this.stationInfo?.amperageLimitationOcppKey) && - !ChargingStationConfigurationUtils.getConfigurationKey( - this, - this.stationInfo.amperageLimitationOcppKey!, - ) + !getConfigurationKey(this, this.stationInfo.amperageLimitationOcppKey!) ) { - ChargingStationConfigurationUtils.addConfigurationKey( + addConfigurationKey( this, this.stationInfo.amperageLimitationOcppKey!, ( @@ -1435,43 +1400,28 @@ export class ChargingStation { ).toString(), ); } - if ( - !ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.SupportedFeatureProfiles, - ) - ) { - ChargingStationConfigurationUtils.addConfigurationKey( + if (!getConfigurationKey(this, StandardParametersKey.SupportedFeatureProfiles)) { + addConfigurationKey( this, StandardParametersKey.SupportedFeatureProfiles, `${SupportedFeatureProfiles.Core},${SupportedFeatureProfiles.FirmwareManagement},${SupportedFeatureProfiles.LocalAuthListManagement},${SupportedFeatureProfiles.SmartCharging},${SupportedFeatureProfiles.RemoteTrigger}`, ); } - ChargingStationConfigurationUtils.addConfigurationKey( + addConfigurationKey( this, StandardParametersKey.NumberOfConnectors, this.getNumberOfConnectors().toString(), { readonly: true }, { overwrite: true }, ); - if ( - !ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.MeterValuesSampledData, - ) - ) { - ChargingStationConfigurationUtils.addConfigurationKey( + if (!getConfigurationKey(this, StandardParametersKey.MeterValuesSampledData)) { + addConfigurationKey( this, StandardParametersKey.MeterValuesSampledData, MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER, ); } - if ( - !ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.ConnectorPhaseRotation, - ) - ) { + if (!getConfigurationKey(this, StandardParametersKey.ConnectorPhaseRotation)) { const connectorsPhaseRotation: string[] = []; if (this.hasEvses) { for (const evseStatus of this.evses.values()) { @@ -1488,47 +1438,25 @@ export class ChargingStation { ); } } - ChargingStationConfigurationUtils.addConfigurationKey( + addConfigurationKey( this, StandardParametersKey.ConnectorPhaseRotation, connectorsPhaseRotation.toString(), ); } - if ( - !ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.AuthorizeRemoteTxRequests, - ) - ) { - ChargingStationConfigurationUtils.addConfigurationKey( - this, - StandardParametersKey.AuthorizeRemoteTxRequests, - 'true', - ); - } - if ( - !ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.LocalAuthListEnabled, - ) && - ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.SupportedFeatureProfiles, - )?.value?.includes(SupportedFeatureProfiles.LocalAuthListManagement) - ) { - ChargingStationConfigurationUtils.addConfigurationKey( - this, - StandardParametersKey.LocalAuthListEnabled, - 'false', - ); + if (!getConfigurationKey(this, StandardParametersKey.AuthorizeRemoteTxRequests)) { + addConfigurationKey(this, StandardParametersKey.AuthorizeRemoteTxRequests, 'true'); } if ( - !ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.ConnectionTimeOut, + !getConfigurationKey(this, StandardParametersKey.LocalAuthListEnabled) && + getConfigurationKey(this, StandardParametersKey.SupportedFeatureProfiles)?.value?.includes( + SupportedFeatureProfiles.LocalAuthListManagement, ) ) { - ChargingStationConfigurationUtils.addConfigurationKey( + addConfigurationKey(this, StandardParametersKey.LocalAuthListEnabled, 'false'); + } + if (!getConfigurationKey(this, StandardParametersKey.ConnectionTimeOut)) { + addConfigurationKey( this, StandardParametersKey.ConnectionTimeOut, Constants.DEFAULT_CONNECTION_TIMEOUT.toString(), @@ -1761,8 +1689,9 @@ export class ChargingStation { if (!existsSync(dirname(this.configurationFile))) { mkdirSync(dirname(this.configurationFile), { recursive: true }); } - let configurationData: ChargingStationConfiguration = - cloneObject(this.getConfigurationFromFile()!) ?? {}; + let configurationData: ChargingStationConfiguration = this.getConfigurationFromFile() + ? cloneObject(this.getConfigurationFromFile()!) + : {}; if (this.getStationInfoPersistentConfiguration() && this.stationInfo) { configurationData.stationInfo = this.stationInfo; } else { @@ -2164,19 +2093,10 @@ export class ChargingStation { // 0 for disabling private getConnectionTimeout(): number { - if ( - ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.ConnectionTimeOut, - ) - ) { + if (getConfigurationKey(this, StandardParametersKey.ConnectionTimeOut)) { return ( - parseInt( - ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.ConnectionTimeOut, - )!.value!, - ) ?? Constants.DEFAULT_CONNECTION_TIMEOUT + parseInt(getConfigurationKey(this, StandardParametersKey.ConnectionTimeOut)!.value!) ?? + Constants.DEFAULT_CONNECTION_TIMEOUT ); } return Constants.DEFAULT_CONNECTION_TIMEOUT; @@ -2219,17 +2139,11 @@ export class ChargingStation { private getAmperageLimitation(): number | undefined { if ( isNotEmptyString(this.stationInfo?.amperageLimitationOcppKey) && - ChargingStationConfigurationUtils.getConfigurationKey( - this, - this.stationInfo.amperageLimitationOcppKey!, - ) + getConfigurationKey(this, this.stationInfo.amperageLimitationOcppKey!) ) { return ( convertToInt( - ChargingStationConfigurationUtils.getConfigurationKey( - this, - this.stationInfo.amperageLimitationOcppKey!, - )?.value, + getConfigurationKey(this, this.stationInfo.amperageLimitationOcppKey!)?.value, ) / getAmperageLimitationUnitDivider(this.stationInfo) ); } @@ -2348,16 +2262,11 @@ export class ChargingStation { } private startWebSocketPing(): void { - const webSocketPingInterval: number = ChargingStationConfigurationUtils.getConfigurationKey( + const webSocketPingInterval: number = getConfigurationKey( this, StandardParametersKey.WebSocketPingInterval, ) - ? convertToInt( - ChargingStationConfigurationUtils.getConfigurationKey( - this, - StandardParametersKey.WebSocketPingInterval, - )?.value, - ) + ? convertToInt(getConfigurationKey(this, StandardParametersKey.WebSocketPingInterval)?.value) : 0; if (webSocketPingInterval > 0 && !this.webSocketPingSetInterval) { this.webSocketPingSetInterval = setInterval(() => {