X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FChargingStation.ts;h=9f1fa7dea8b29435e63592b2645406613d7a1526;hb=d4c3e68a1a6321f2f43ef0521e121e827f3eb29b;hp=5d400371eadecdafd84ea75723ae1c3875ee050f;hpb=b1bbdae5d6550f7a6a03b443d60d41debe166a07;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ChargingStation.ts b/src/charging-station/ChargingStation.ts index 5d400371..9f1fa7de 100644 --- a/src/charging-station/ChargingStation.ts +++ b/src/charging-station/ChargingStation.ts @@ -42,6 +42,7 @@ import { type BootNotificationRequest, type BootNotificationResponse, type CachedRequest, + type ChargingStationAutomaticTransactionGeneratorConfiguration, type ChargingStationConfiguration, type ChargingStationInfo, type ChargingStationOcppConfiguration, @@ -90,6 +91,8 @@ import { } from '../types'; import { ACElectricUtils, + AsyncLock, + AsyncLockType, Configuration, Constants, DCElectricUtils, @@ -128,6 +131,7 @@ export class ChargingStation { private wsConnectionRestarted: boolean; private autoReconnectRetryCount: number; private templateFileWatcher!: fs.FSWatcher | undefined; + private templateFileHash!: string; private readonly sharedLRUCache: SharedLRUCache; private webSocketPingSetInterval!: NodeJS.Timeout; private readonly chargingStationWorkerBroadcastChannel: ChargingStationWorkerBroadcastChannel; @@ -181,8 +185,9 @@ export class ChargingStation { }; public hasIdTags(): boolean { - const idTagsFile = ChargingStationUtils.getIdTagsFile(this.stationInfo); - return Utils.isNotEmptyArray(this.idTagsCache.getIdTags(idTagsFile)); + return Utils.isNotEmptyArray( + this.idTagsCache.getIdTags(ChargingStationUtils.getIdTagsFile(this.stationInfo)) + ); } public getEnableStatistics(): boolean { @@ -265,6 +270,9 @@ export class ChargingStation { public getNumberOfConnectors(): number { if (this.hasEvses) { + if (this.evses.size === 0) { + throw new BaseError('Evses not initialized, cannot get number of connectors'); + } let numberOfConnectors = 0; for (const [evseId, evseStatus] of this.evses) { if (evseId > 0) { @@ -273,10 +281,16 @@ export class ChargingStation { } return numberOfConnectors; } + if (this.connectors.size === 0) { + throw new BaseError('Connectors not initialized, cannot get number of connectors'); + } return this.connectors.has(0) ? this.connectors.size - 1 : this.connectors.size; } public getNumberOfEvses(): number { + if (this.evses.size === 0) { + throw new BaseError('Evses not initialized, cannot get number of evses'); + } return this.evses.has(0) ? this.evses.size - 1 : this.evses.size; } @@ -303,13 +317,10 @@ export class ChargingStation { public getVoltageOut(stationInfo?: ChargingStationInfo): number | undefined { const defaultVoltageOut = ChargingStationUtils.getDefaultVoltageOut( this.getCurrentOutType(stationInfo), - this.templateFile, - this.logPrefix() + this.logPrefix(), + this.templateFile ); - const localStationInfo: ChargingStationInfo = stationInfo ?? this.stationInfo; - return !Utils.isUndefined(localStationInfo.voltageOut) - ? localStationInfo.voltageOut - : defaultVoltageOut; + return (stationInfo ?? this.stationInfo).voltageOut ?? defaultVoltageOut; } public getMaximumPower(stationInfo?: ChargingStationInfo): number { @@ -643,14 +654,12 @@ export class ChargingStation { this.templateFile } file have changed, reload` ); - this.sharedLRUCache.deleteChargingStationTemplate(this.stationInfo?.templateHash); + this.sharedLRUCache.deleteChargingStationTemplate(this.templateFileHash); // Initialize this.initialize(); // Restart the ATG this.stopAutomaticTransactionGenerator(); - if ( - this.getAutomaticTransactionGeneratorConfigurationFromTemplate()?.enable === true - ) { + if (this.getAutomaticTransactionGeneratorConfiguration()?.enable === true) { this.startAutomaticTransactionGenerator(); } if (this.getEnableStatistics() === true) { @@ -690,9 +699,10 @@ export class ChargingStation { } this.sharedLRUCache.deleteChargingStationConfiguration(this.configurationFileHash); this.templateFileWatcher?.close(); - this.sharedLRUCache.deleteChargingStationTemplate(this.stationInfo?.templateHash); + this.sharedLRUCache.deleteChargingStationTemplate(this.templateFileHash); delete this.bootNotificationResponse; this.started = false; + this.saveConfiguration(); parentPort?.postMessage(MessageChannelUtils.buildStoppedMessage(this)); this.stopping = false; } else { @@ -802,15 +812,19 @@ export class ChargingStation { } } - public startAutomaticTransactionGenerator( - connectorIds?: number[], - automaticTransactionGeneratorConfiguration?: AutomaticTransactionGeneratorConfiguration - ): void { - this.automaticTransactionGenerator = AutomaticTransactionGenerator.getInstance( - automaticTransactionGeneratorConfiguration ?? - this.getAutomaticTransactionGeneratorConfigurationFromTemplate(), - this - ); + public getAutomaticTransactionGeneratorConfiguration(): + | AutomaticTransactionGeneratorConfiguration + | undefined { + const automaticTransactionGeneratorConfigurationFromFile = + this.getConfigurationFromFile()?.automaticTransactionGenerator; + if (automaticTransactionGeneratorConfigurationFromFile) { + return automaticTransactionGeneratorConfigurationFromFile; + } + return this.getTemplateFromFile()?.AutomaticTransactionGenerator; + } + + public startAutomaticTransactionGenerator(connectorIds?: number[]): void { + this.automaticTransactionGenerator = AutomaticTransactionGenerator.getInstance(this); if (Utils.isNotEmptyArray(connectorIds)) { for (const connectorId of connectorIds) { this.automaticTransactionGenerator?.startConnector(connectorId); @@ -818,6 +832,7 @@ export class ChargingStation { } else { this.automaticTransactionGenerator?.start(); } + this.saveChargingStationAutomaticTransactionGeneratorConfiguration(); parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(this)); } @@ -829,6 +844,7 @@ export class ChargingStation { } else { this.automaticTransactionGenerator?.stop(); } + this.saveChargingStationAutomaticTransactionGeneratorConfiguration(); parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(this)); } @@ -903,8 +919,8 @@ export class ChargingStation { private getTemplateFromFile(): ChargingStationTemplate | undefined { let template: ChargingStationTemplate; try { - if (this.sharedLRUCache.hasChargingStationTemplate(this.stationInfo?.templateHash)) { - template = this.sharedLRUCache.getChargingStationTemplate(this.stationInfo.templateHash); + if (this.sharedLRUCache.hasChargingStationTemplate(this.templateFileHash)) { + template = this.sharedLRUCache.getChargingStationTemplate(this.templateFileHash); } else { const measureId = `${FileType.ChargingStationTemplate} read`; const beginId = PerformanceStatistics.beginMeasure(measureId); @@ -917,6 +933,7 @@ export class ChargingStation { .update(JSON.stringify(template)) .digest('hex'); this.sharedLRUCache.setChargingStationTemplate(template); + this.templateFileHash = template.templateHash; } } catch (error) { FileUtils.handleFileException( @@ -931,21 +948,19 @@ export class ChargingStation { private getStationInfoFromTemplate(): ChargingStationInfo { const stationTemplate: ChargingStationTemplate | undefined = this.getTemplateFromFile(); - if (Utils.isNullOrUndefined(stationTemplate)) { - const errorMsg = `Failed to read charging station template file ${this.templateFile}`; - logger.error(`${this.logPrefix()} ${errorMsg}`); - throw new BaseError(errorMsg); - } - if (Utils.isEmptyObject(stationTemplate)) { - const errorMsg = `Empty charging station information from template file ${this.templateFile}`; - logger.error(`${this.logPrefix()} ${errorMsg}`); - throw new BaseError(errorMsg); - } + ChargingStationUtils.checkTemplateFile(stationTemplate, this.logPrefix(), this.templateFile); ChargingStationUtils.warnTemplateKeysDeprecation( - this.templateFile, stationTemplate, - this.logPrefix() + this.logPrefix(), + this.templateFile ); + if (stationTemplate?.Connectors) { + ChargingStationUtils.checkConnectorsConfiguration( + stationTemplate, + this.logPrefix(), + this.templateFile + ); + } const stationInfo: ChargingStationInfo = ChargingStationUtils.stationTemplateToStationInfo(stationTemplate); stationInfo.hashId = ChargingStationUtils.getHashId(this.index, stationTemplate); @@ -993,18 +1008,18 @@ export class ChargingStation { stationInfo.resetTime = !Utils.isNullOrUndefined(stationTemplate?.resetTime) ? stationTemplate.resetTime * 1000 : Constants.CHARGING_STATION_DEFAULT_RESET_TIME; - // Initialize evses or connectors if needed (FIXME: should be factored out) - this.initializeConnectorsOrEvses(stationInfo); stationInfo.maximumAmperage = this.getMaximumAmperage(stationInfo); - ChargingStationUtils.createStationInfoHash(stationInfo); return stationInfo; } private getStationInfoFromFile(): ChargingStationInfo | undefined { let stationInfo: ChargingStationInfo | undefined; - this.getStationInfoPersistentConfiguration() && - (stationInfo = this.getConfigurationFromFile()?.stationInfo); - stationInfo && ChargingStationUtils.createStationInfoHash(stationInfo); + if (this.getStationInfoPersistentConfiguration()) { + stationInfo = this.getConfigurationFromFile()?.stationInfo; + if (stationInfo) { + delete stationInfo?.infoHash; + } + } return stationInfo; } @@ -1014,11 +1029,7 @@ export class ChargingStation { // Priority: // 1. charging station info from template // 2. charging station info from configuration file - // 3. charging station info attribute if (stationInfoFromFile?.templateHash === stationInfoFromTemplate.templateHash) { - if (this.stationInfo?.infoHash === stationInfoFromFile?.infoHash) { - return this.stationInfo; - } return stationInfoFromFile; } stationInfoFromFile && @@ -1051,10 +1062,22 @@ export class ChargingStation { } private initialize(): void { + const stationTemplate = this.getTemplateFromFile(); + ChargingStationUtils.checkTemplateFile(stationTemplate, this.logPrefix(), this.templateFile); this.configurationFile = path.join( path.dirname(this.templateFile.replace('station-templates', 'configurations')), - `${ChargingStationUtils.getHashId(this.index, this.getTemplateFromFile())}.json` + `${ChargingStationUtils.getHashId(this.index, stationTemplate)}.json` ); + const chargingStationConfiguration = this.getConfigurationFromFile(); + const featureFlag = false; + if ( + featureFlag && + (chargingStationConfiguration?.connectorsStatus || chargingStationConfiguration?.evsesStatus) + ) { + this.initializeConnectorsOrEvsesFromFile(chargingStationConfiguration); + } else { + this.initializeConnectorsOrEvsesFromTemplate(stationTemplate); + } this.stationInfo = this.getStationInfo(); if ( this.stationInfo.firmwareStatus === FirmwareStatus.Installing && @@ -1075,9 +1098,6 @@ export class ChargingStation { this.stationInfo.firmwareVersion = match?.join('.'); } this.saveStationInfo(); - // Avoid duplication of connectors or evses related information in RAM - delete this.stationInfo?.Connectors; - delete this.stationInfo?.Evses; this.configuredSupervisionUrl = this.getConfiguredSupervisionUrl(); if (this.getEnableStatistics() === true) { this.performanceStatistics = PerformanceStatistics.getInstance( @@ -1293,12 +1313,42 @@ export class ChargingStation { this.saveOcppConfiguration(); } - private initializeConnectorsOrEvses(stationInfo: ChargingStationInfo) { - if (stationInfo?.Connectors && !stationInfo?.Evses) { - this.initializeConnectors(stationInfo); - } else if (stationInfo?.Evses && !stationInfo?.Connectors) { - this.initializeEvses(stationInfo); - } else if (stationInfo?.Evses && stationInfo?.Connectors) { + private initializeConnectorsOrEvsesFromFile(configuration: ChargingStationConfiguration): void { + if (configuration?.connectorsStatus && !configuration?.evsesStatus) { + for (const [connectorId, connectorStatus] of configuration.connectorsStatus.entries()) { + this.connectors.set(connectorId, Utils.cloneObject(connectorStatus)); + } + } else if (configuration?.evsesStatus && !configuration?.connectorsStatus) { + for (const [evseId, evseStatusConfiguration] of configuration.evsesStatus.entries()) { + const evseStatus = Utils.cloneObject(evseStatusConfiguration); + delete evseStatus.connectorsStatus; + this.evses.set(evseId, { + ...(evseStatus as EvseStatus), + connectors: new Map( + evseStatusConfiguration.connectorsStatus.map((connectorStatus, connectorId) => [ + connectorId, + connectorStatus, + ]) + ), + }); + } + } else if (configuration?.evsesStatus && configuration?.connectorsStatus) { + const errorMsg = `Connectors and evses defined at the same time in configuration file ${this.configurationFile}`; + logger.error(`${this.logPrefix()} ${errorMsg}`); + throw new BaseError(errorMsg); + } else { + const errorMsg = `No connectors or evses defined in configuration file ${this.configurationFile}`; + logger.error(`${this.logPrefix()} ${errorMsg}`); + throw new BaseError(errorMsg); + } + } + + private initializeConnectorsOrEvsesFromTemplate(stationTemplate: ChargingStationTemplate) { + if (stationTemplate?.Connectors && !stationTemplate?.Evses) { + this.initializeConnectorsFromTemplate(stationTemplate); + } else if (stationTemplate?.Evses && !stationTemplate?.Connectors) { + this.initializeEvsesFromTemplate(stationTemplate); + } else if (stationTemplate?.Evses && stationTemplate?.Connectors) { const errorMsg = `Connectors and evses defined at the same time in template file ${this.templateFile}`; logger.error(`${this.logPrefix()} ${errorMsg}`); throw new BaseError(errorMsg); @@ -1309,72 +1359,51 @@ export class ChargingStation { } } - private initializeConnectors(stationInfo: ChargingStationInfo): void { - if (!stationInfo?.Connectors && this.connectors.size === 0) { + private initializeConnectorsFromTemplate(stationTemplate: ChargingStationTemplate): void { + if (!stationTemplate?.Connectors && this.connectors.size === 0) { const errorMsg = `No already defined connectors and charging station information from template ${this.templateFile} with no connectors configuration defined`; logger.error(`${this.logPrefix()} ${errorMsg}`); throw new BaseError(errorMsg); } - if (!stationInfo?.Connectors[0]) { + if (!stationTemplate?.Connectors[0]) { logger.warn( `${this.logPrefix()} Charging station information from template ${ this.templateFile } with no connector id 0 configuration` ); } - if (stationInfo?.Connectors) { - const configuredMaxConnectors = - ChargingStationUtils.getConfiguredNumberOfConnectors(stationInfo); - ChargingStationUtils.checkConfiguredMaxConnectors( - configuredMaxConnectors, - this.templateFile, - this.logPrefix() - ); + if (stationTemplate?.Connectors) { + const { configuredMaxConnectors, templateMaxConnectors, templateMaxAvailableConnectors } = + ChargingStationUtils.checkConnectorsConfiguration( + stationTemplate, + this.logPrefix(), + this.templateFile + ); const connectorsConfigHash = crypto .createHash(Constants.DEFAULT_HASH_ALGORITHM) - .update(`${JSON.stringify(stationInfo?.Connectors)}${configuredMaxConnectors.toString()}`) + .update( + `${JSON.stringify(stationTemplate?.Connectors)}${configuredMaxConnectors.toString()}` + ) .digest('hex'); const connectorsConfigChanged = this.connectors?.size !== 0 && this.connectorsConfigurationHash !== connectorsConfigHash; if (this.connectors?.size === 0 || connectorsConfigChanged) { connectorsConfigChanged && this.connectors.clear(); this.connectorsConfigurationHash = connectorsConfigHash; - const templateMaxConnectors = ChargingStationUtils.getMaxNumberOfConnectors( - stationInfo.Connectors - ); - ChargingStationUtils.checkTemplateMaxConnectors( - templateMaxConnectors, - this.templateFile, - this.logPrefix() - ); - const templateMaxAvailableConnectors = stationInfo?.Connectors[0] - ? templateMaxConnectors - 1 - : templateMaxConnectors; - if ( - configuredMaxConnectors > templateMaxAvailableConnectors && - !stationInfo?.randomConnectors - ) { - logger.warn( - `${this.logPrefix()} Number of connectors exceeds the number of connector configurations in template ${ - this.templateFile - }, forcing random connector configurations affectation` - ); - stationInfo.randomConnectors = true; - } if (templateMaxConnectors > 0) { for (let connectorId = 0; connectorId <= configuredMaxConnectors; connectorId++) { if ( connectorId === 0 && - (!stationInfo?.Connectors[connectorId] || - this.getUseConnectorId0(stationInfo) === false) + (!stationTemplate?.Connectors[connectorId] || + this.getUseConnectorId0(stationTemplate) === false) ) { continue; } const templateConnectorId = - connectorId > 0 && stationInfo?.randomConnectors + connectorId > 0 && stationTemplate?.randomConnectors ? Utils.getRandomInteger(templateMaxAvailableConnectors, 1) : connectorId; - const connectorStatus = stationInfo?.Connectors[templateConnectorId]; + const connectorStatus = stationTemplate?.Connectors[templateConnectorId]; ChargingStationUtils.checkStationInfoConnectorStatus( templateConnectorId, connectorStatus, @@ -1402,43 +1431,43 @@ export class ChargingStation { } } - private initializeEvses(stationInfo: ChargingStationInfo): void { - if (!stationInfo?.Evses && this.evses.size === 0) { + private initializeEvsesFromTemplate(stationTemplate: ChargingStationTemplate): void { + if (!stationTemplate?.Evses && this.evses.size === 0) { const errorMsg = `No already defined evses and charging station information from template ${this.templateFile} with no evses configuration defined`; logger.error(`${this.logPrefix()} ${errorMsg}`); throw new BaseError(errorMsg); } - if (!stationInfo?.Evses[0]) { + if (!stationTemplate?.Evses[0]) { logger.warn( `${this.logPrefix()} Charging station information from template ${ this.templateFile } with no evse id 0 configuration` ); } - if (!stationInfo?.Evses[0]?.Connectors[0]) { + if (!stationTemplate?.Evses[0]?.Connectors[0]) { logger.warn( `${this.logPrefix()} Charging station information from template ${ this.templateFile } with evse id 0 with no connector id 0 configuration` ); } - if (stationInfo?.Evses) { + if (stationTemplate?.Evses) { const evsesConfigHash = crypto .createHash(Constants.DEFAULT_HASH_ALGORITHM) - .update(`${JSON.stringify(stationInfo?.Evses)}`) + .update(`${JSON.stringify(stationTemplate?.Evses)}`) .digest('hex'); const evsesConfigChanged = this.evses?.size !== 0 && this.evsesConfigurationHash !== evsesConfigHash; if (this.evses?.size === 0 || evsesConfigChanged) { evsesConfigChanged && this.evses.clear(); this.evsesConfigurationHash = evsesConfigHash; - const templateMaxEvses = ChargingStationUtils.getMaxNumberOfEvses(stationInfo?.Evses); + const templateMaxEvses = ChargingStationUtils.getMaxNumberOfEvses(stationTemplate?.Evses); if (templateMaxEvses > 0) { - for (const evse in stationInfo.Evses) { + for (const evse in stationTemplate.Evses) { const evseId = Utils.convertToInt(evse); this.evses.set(evseId, { connectors: ChargingStationUtils.buildConnectorsMap( - stationInfo?.Evses[evse]?.Connectors, + stationTemplate?.Evses[evse]?.Connectors, this.logPrefix(), this.templateFile ), @@ -1482,8 +1511,8 @@ export class ChargingStation { fs.readFileSync(this.configurationFile, 'utf8') ) as ChargingStationConfiguration; PerformanceStatistics.endMeasure(measureId, beginId); - this.configurationFileHash = configuration.configurationHash; this.sharedLRUCache.setChargingStationConfiguration(configuration); + this.configurationFileHash = configuration.configurationHash; } } catch (error) { FileUtils.handleFileException( @@ -1497,32 +1526,50 @@ export class ChargingStation { return configuration; } + private saveChargingStationAutomaticTransactionGeneratorConfiguration( + stationTemplate?: ChargingStationTemplate + ): void { + this.saveConfiguration({ + automaticTransactionGenerator: (stationTemplate ?? this.getTemplateFromFile()) + .AutomaticTransactionGenerator, + ...(!Utils.isNullOrUndefined(this.automaticTransactionGenerator?.connectorsStatus) && { + automaticTransactionGeneratorStatuses: [ + ...this.automaticTransactionGenerator.connectorsStatus.values(), + ], + }), + }); + } + private saveConnectorsStatus() { - if (this.getOcppPersistentConfiguration()) { - this.saveConfiguration(); - } + this.saveConfiguration(); } private saveEvsesStatus() { - if (this.getOcppPersistentConfiguration()) { - this.saveConfiguration(); - } + this.saveConfiguration(); } - private saveConfiguration(): void { + private saveConfiguration( + chargingStationAutomaticTransactionGeneratorConfiguration?: ChargingStationAutomaticTransactionGeneratorConfiguration + ): void { if (this.configurationFile) { try { if (!fs.existsSync(path.dirname(this.configurationFile))) { fs.mkdirSync(path.dirname(this.configurationFile), { recursive: true }); } - const configurationData: ChargingStationConfiguration = - Utils.cloneObject(this.getConfigurationFromFile()) ?? {}; - if (this.stationInfo) { + let configurationData: ChargingStationConfiguration = + Utils.cloneObject(this.getConfigurationFromFile()) ?? {}; + if (this.getStationInfoPersistentConfiguration() && this.stationInfo) { configurationData.stationInfo = this.stationInfo; } - if (this.ocppConfiguration?.configurationKey) { + if (this.getOcppPersistentConfiguration() && this.ocppConfiguration?.configurationKey) { configurationData.configurationKey = this.ocppConfiguration.configurationKey; } + if (chargingStationAutomaticTransactionGeneratorConfiguration) { + configurationData = merge( + configurationData, + chargingStationAutomaticTransactionGeneratorConfiguration + ); + } if (this.connectors.size > 0) { configurationData.connectorsStatus = [...this.connectors.values()].map( // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -1548,16 +1595,30 @@ export class ChargingStation { .update(JSON.stringify(configurationData)) .digest('hex'); if (this.configurationFileHash !== configurationHash) { - configurationData.configurationHash = configurationHash; - const measureId = `${FileType.ChargingStationConfiguration} write`; - const beginId = PerformanceStatistics.beginMeasure(measureId); - const fileDescriptor = fs.openSync(this.configurationFile, 'w'); - fs.writeFileSync(fileDescriptor, JSON.stringify(configurationData, null, 2), 'utf8'); - fs.closeSync(fileDescriptor); - PerformanceStatistics.endMeasure(measureId, beginId); - this.sharedLRUCache.deleteChargingStationConfiguration(this.configurationFileHash); - this.configurationFileHash = configurationHash; - this.sharedLRUCache.setChargingStationConfiguration(configurationData); + AsyncLock.acquire(AsyncLockType.configuration) + .then(() => { + configurationData.configurationHash = configurationHash; + const measureId = `${FileType.ChargingStationConfiguration} write`; + const beginId = PerformanceStatistics.beginMeasure(measureId); + const fileDescriptor = fs.openSync(this.configurationFile, 'w'); + fs.writeFileSync(fileDescriptor, JSON.stringify(configurationData, null, 2), 'utf8'); + fs.closeSync(fileDescriptor); + PerformanceStatistics.endMeasure(measureId, beginId); + this.sharedLRUCache.deleteChargingStationConfiguration(this.configurationFileHash); + this.sharedLRUCache.setChargingStationConfiguration(configurationData); + this.configurationFileHash = configurationHash; + }) + .catch((error) => { + FileUtils.handleFileException( + this.configurationFile, + FileType.ChargingStationConfiguration, + error as NodeJS.ErrnoException, + this.logPrefix() + ); + }) + .finally(() => { + AsyncLock.release(AsyncLockType.configuration).catch(Constants.EMPTY_FUNCTION); + }); } else { logger.debug( `${this.logPrefix()} Not saving unchanged charging station configuration file ${ @@ -1585,16 +1646,9 @@ export class ChargingStation { } private getOcppConfigurationFromFile(): ChargingStationOcppConfiguration | undefined { - let configuration: ChargingStationConfiguration | undefined; if (this.getOcppPersistentConfiguration() === true) { - const configurationFromFile = this.getConfigurationFromFile(); - configuration = configurationFromFile?.configurationKey && configurationFromFile; + return { configurationKey: this.getConfigurationFromFile()?.configurationKey }; } - if (!Utils.isNullOrUndefined(configuration)) { - delete configuration.stationInfo; - delete configuration.configurationHash; - } - return configuration; } private getOcppConfiguration(): ChargingStationOcppConfiguration | undefined { @@ -1864,8 +1918,8 @@ export class ChargingStation { ); } - private getUseConnectorId0(stationInfo?: ChargingStationInfo): boolean { - return (stationInfo ?? this.stationInfo)?.useConnectorId0 ?? true; + private getUseConnectorId0(stationTemplate?: ChargingStationTemplate): boolean { + return stationTemplate?.useConnectorId0 ?? true; } private async stopRunningTransactions(reason = StopTransactionReason.NONE): Promise { @@ -1985,7 +2039,8 @@ export class ChargingStation { await OCPPServiceUtils.sendAndSetConnectorStatus( this, connectorId, - connectorBootStatus + connectorBootStatus, + evseId ); } } @@ -2013,7 +2068,7 @@ export class ChargingStation { } // Start the ATG - if (this.getAutomaticTransactionGeneratorConfigurationFromTemplate()?.enable === true) { + if (this.getAutomaticTransactionGeneratorConfiguration()?.enable === true) { this.startAutomaticTransactionGenerator(); } this.wsConnectionRestarted === true && this.flushMessageBuffer(); @@ -2045,7 +2100,8 @@ export class ChargingStation { OCPPServiceUtils.buildStatusNotificationRequest( this, connectorId, - ConnectorStatusEnum.Unavailable + ConnectorStatusEnum.Unavailable, + evseId ) ); delete connectorStatus?.status; @@ -2167,7 +2223,7 @@ export class ChargingStation { // Stop heartbeat this.stopHeartbeat(); // Stop the ATG if needed - if (this.automaticTransactionGenerator?.configuration?.stopOnConnectionFailure === true) { + if (this.getAutomaticTransactionGeneratorConfiguration().stopOnConnectionFailure === true) { this.stopAutomaticTransactionGenerator(); } if ( @@ -2209,10 +2265,4 @@ export class ChargingStation { ); } } - - private getAutomaticTransactionGeneratorConfigurationFromTemplate(): - | AutomaticTransactionGeneratorConfiguration - | undefined { - return this.getTemplateFromFile()?.AutomaticTransactionGenerator; - } }