X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FChargingStation.ts;h=b3d4bdd98016cbf5d35288c15bff552417859497;hb=d5575b174bef0e79d2a600ae24be2789d6cf3451;hp=96bf6c1b3370fc29a772fc5baa01d5ef172c5509;hpb=a78ef5ed1052d9cc77435e2dce4aea89442824ee;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ChargingStation.ts b/src/charging-station/ChargingStation.ts index 96bf6c1b..b3d4bdd9 100644 --- a/src/charging-station/ChargingStation.ts +++ b/src/charging-station/ChargingStation.ts @@ -534,6 +534,12 @@ export class ChargingStation { } } + public stopMeterValues(connectorId: number) { + if (this.getConnectorStatus(connectorId)?.transactionSetInterval) { + clearInterval(this.getConnectorStatus(connectorId)?.transactionSetInterval); + } + } + public start(): void { if (this.started === false) { if (this.starting === false) { @@ -629,21 +635,6 @@ export class ChargingStation { } } - public resetConnectorStatus(connectorId: number): void { - this.getConnectorStatus(connectorId).idTagLocalAuthorized = false; - this.getConnectorStatus(connectorId).idTagAuthorized = false; - this.getConnectorStatus(connectorId).transactionRemoteStarted = false; - this.getConnectorStatus(connectorId).transactionStarted = false; - delete this.getConnectorStatus(connectorId)?.localAuthorizeIdTag; - delete this.getConnectorStatus(connectorId)?.authorizeIdTag; - delete this.getConnectorStatus(connectorId)?.transactionId; - delete this.getConnectorStatus(connectorId)?.transactionIdTag; - this.getConnectorStatus(connectorId).transactionEnergyActiveImportRegisterValue = 0; - delete this.getConnectorStatus(connectorId)?.transactionBeginMeterValue; - this.stopMeterValues(connectorId); - parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(this)); - } - public hasFeatureProfile(featureProfile: SupportedFeatureProfiles): boolean | undefined { return ChargingStationConfigurationUtils.getConfigurationKey( this, @@ -922,47 +913,8 @@ export class ChargingStation { stationInfo.resetTime = !Utils.isNullOrUndefined(stationTemplate?.resetTime) ? stationTemplate.resetTime * 1000 : Constants.CHARGING_STATION_DEFAULT_RESET_TIME; - const configuredMaxConnectors = - ChargingStationUtils.getConfiguredNumberOfConnectors(stationTemplate); - ChargingStationUtils.checkConfiguredMaxConnectors( - configuredMaxConnectors, - this.templateFile, - this.logPrefix() - ); - // Build evses or connectors if needed (FIXME: should be factored out) - if (stationInfo?.Connectors && !stationInfo?.Evses) { - const templateMaxConnectors = ChargingStationUtils.getMaxNumberOfConnectors( - stationTemplate.Connectors - ); - ChargingStationUtils.checkTemplateMaxConnectors( - templateMaxConnectors, - this.templateFile, - this.logPrefix() - ); - if ( - configuredMaxConnectors > - (stationTemplate?.Connectors[0] ? templateMaxConnectors - 1 : templateMaxConnectors) && - !stationTemplate?.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; - } - this.initializeConnectors(stationInfo, configuredMaxConnectors); - } else if (stationInfo?.Evses && !stationInfo?.Connectors) { - this.initializeEvses(stationInfo); - } else if (stationInfo?.Evses && stationInfo?.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); - } else { - const errorMsg = `No connectors or evses defined in template file ${this.templateFile}`; - logger.error(`${this.logPrefix()} ${errorMsg}`); - throw new BaseError(errorMsg); - } + // Initialize evses or connectors if needed (FIXME: should be factored out) + this.initializeConnectorsOrEvses(stationInfo); stationInfo.maximumAmperage = this.getMaximumAmperage(stationInfo); ChargingStationUtils.createStationInfoHash(stationInfo); return stationInfo; @@ -1043,8 +995,9 @@ export class ChargingStation { this.stationInfo.firmwareVersion = match?.join('.'); } this.saveStationInfo(); - // Avoid duplication of connectors related information in RAM + // 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( @@ -1258,10 +1211,23 @@ export class ChargingStation { this.saveOcppConfiguration(); } - private initializeConnectors( - stationInfo: ChargingStationInfo, - configuredMaxConnectors: number - ): void { + 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) { + const errorMsg = `Connectors and evses defined at the same time in template file ${this.templateFile}`; + logger.error(`${this.logPrefix()} ${errorMsg}`); + throw new BaseError(errorMsg); + } else { + const errorMsg = `No connectors or evses defined in template file ${this.templateFile}`; + logger.error(`${this.logPrefix()} ${errorMsg}`); + throw new BaseError(errorMsg); + } + } + + private initializeConnectors(stationInfo: ChargingStationInfo): void { if (!stationInfo?.Connectors && this.connectors.size === 0) { const logMsg = `No already defined connectors and charging station information from template ${this.templateFile} with no connectors configuration defined`; logger.error(`${this.logPrefix()} ${logMsg}`); @@ -1275,6 +1241,13 @@ export class ChargingStation { ); } if (stationInfo?.Connectors) { + const configuredMaxConnectors = + ChargingStationUtils.getConfiguredNumberOfConnectors(stationInfo); + ChargingStationUtils.checkConfiguredMaxConnectors( + configuredMaxConnectors, + this.templateFile, + this.logPrefix() + ); const connectorsConfigHash = crypto .createHash(Constants.DEFAULT_HASH_ALGORITHM) .update(`${JSON.stringify(stationInfo?.Connectors)}${configuredMaxConnectors.toString()}`) @@ -1284,44 +1257,70 @@ export class ChargingStation { if (this.connectors?.size === 0 || connectorsConfigChanged) { connectorsConfigChanged && this.connectors.clear(); this.connectorsConfigurationHash = connectorsConfigHash; + const connectorZeroStatus = stationInfo?.Connectors[0]; // Add connector id 0 - let lastConnector = '0'; - for (lastConnector in stationInfo?.Connectors) { - const connectorStatus = stationInfo?.Connectors[lastConnector]; - const lastConnectorId = Utils.convertToInt(lastConnector); - if ( - lastConnectorId === 0 && - this.getUseConnectorId0(stationInfo) === true && - connectorStatus - ) { - this.checkStationInfoConnectorStatus(lastConnectorId, connectorStatus); - this.connectors.set( - lastConnectorId, - Utils.cloneObject(connectorStatus) - ); - this.getConnectorStatus(lastConnectorId).availability = AvailabilityType.Operative; - if (Utils.isUndefined(this.getConnectorStatus(lastConnectorId)?.chargingProfiles)) { - this.getConnectorStatus(lastConnectorId).chargingProfiles = []; - } + if (connectorZeroStatus && this.getUseConnectorId0(stationInfo) === true) { + ChargingStationUtils.checkStationInfoConnectorStatus( + 0, + connectorZeroStatus, + this.logPrefix(), + this.templateFile + ); + this.connectors.set(0, Utils.cloneObject(connectorZeroStatus)); + this.getConnectorStatus(0).availability = AvailabilityType.Operative; + if (Utils.isUndefined(this.getConnectorStatus(0)?.chargingProfiles)) { + this.getConnectorStatus(0).chargingProfiles = []; } } - // Generate all connectors + // Add remaining connectors const templateMaxConnectors = ChargingStationUtils.getMaxNumberOfConnectors( - stationInfo?.Connectors + stationInfo.Connectors + ); + ChargingStationUtils.checkTemplateMaxConnectors( + templateMaxConnectors, + this.templateFile, + this.logPrefix() ); - if ((stationInfo?.Connectors[0] ? templateMaxConnectors - 1 : templateMaxConnectors) > 0) { - for (let index = 1; index <= configuredMaxConnectors; index++) { - const randConnectorId = stationInfo?.randomConnectors - ? Utils.getRandomInteger(Utils.convertToInt(lastConnector), 1) - : index; - const connectorStatus = stationInfo?.Connectors[randConnectorId.toString()]; - this.checkStationInfoConnectorStatus(randConnectorId, connectorStatus); - this.connectors.set(index, Utils.cloneObject(connectorStatus)); - this.getConnectorStatus(index).availability = AvailabilityType.Operative; - if (Utils.isUndefined(this.getConnectorStatus(index)?.chargingProfiles)) { - this.getConnectorStatus(index).chargingProfiles = []; + if ( + configuredMaxConnectors > + (stationInfo?.Connectors[0] ? templateMaxConnectors - 1 : templateMaxConnectors) && + !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; + } + const templateMaxAvailableConnectors = stationInfo?.Connectors[0] + ? templateMaxConnectors - 1 + : templateMaxConnectors; + if (templateMaxAvailableConnectors > 0) { + for (let connectorId = 1; connectorId <= configuredMaxConnectors; connectorId++) { + const templateConnectorId = stationInfo?.randomConnectors + ? Utils.getRandomInteger(templateMaxAvailableConnectors, 1) + : connectorId; + const connectorStatus = stationInfo?.Connectors[templateConnectorId]; + ChargingStationUtils.checkStationInfoConnectorStatus( + templateConnectorId, + connectorStatus, + this.logPrefix(), + this.templateFile + ); + this.connectors.set(connectorId, Utils.cloneObject(connectorStatus)); + this.getConnectorStatus(connectorId).availability = AvailabilityType.Operative; + if (Utils.isUndefined(this.getConnectorStatus(connectorId)?.chargingProfiles)) { + this.getConnectorStatus(connectorId).chargingProfiles = []; } + ChargingStationUtils.initializeConnectorsMapStatus(this.connectors, this.logPrefix()); } + } else { + logger.warn( + `${this.logPrefix()} Charging station information from template ${ + this.templateFile + } with no connectors configuration defined, cannot create connectors` + ); } } } else { @@ -1331,64 +1330,13 @@ export class ChargingStation { } with no connectors configuration defined, using already defined connectors` ); } - // Initialize connectors status - for (const connectorId of this.connectors.keys()) { - if (connectorId > 0 && this.getConnectorStatus(connectorId)?.transactionStarted === true) { - logger.warn( - `${this.logPrefix()} Connector ${connectorId} at initialization has a transaction started: ${ - this.getConnectorStatus(connectorId)?.transactionId - }` - ); - } - if ( - connectorId > 0 && - Utils.isNullOrUndefined(this.getConnectorStatus(connectorId)?.transactionStarted) - ) { - this.initializeConnectorStatus(this.getConnectorStatus(connectorId)); - } - } - } - - private buildConnectorsMap( - connectors: Record - ): Map { - const connectorsMap = new Map(); - for (const connector in connectors) { - const connectorStatus = connectors[connector]; - const connectorId = Utils.convertToInt(connector); - this.checkStationInfoConnectorStatus(connectorId, connectorStatus); - connectorsMap.set(connectorId, Utils.cloneObject(connectorStatus)); - connectorsMap.get(connectorId).availability = AvailabilityType.Operative; - if (Utils.isUndefined(connectorsMap.get(connectorId)?.chargingProfiles)) { - connectorsMap.get(connectorId).chargingProfiles = []; - } - } - return connectorsMap; - } - - private initializeConnectorsMapStatus(connectors: Map): void { - for (const connectorId of connectors.keys()) { - if (connectorId > 0 && connectors.get(connectorId)?.transactionStarted === true) { - logger.warn( - `${this.logPrefix()} Connector ${connectorId} at initialization has a transaction started: ${ - connectors.get(connectorId)?.transactionId - }` - ); - } - if ( - connectorId > 0 && - Utils.isNullOrUndefined(connectors.get(connectorId)?.transactionStarted) - ) { - this.initializeConnectorStatus(connectors.get(connectorId)); - } - } } private initializeEvses(stationInfo: ChargingStationInfo): void { if (!stationInfo?.Evses && this.evses.size === 0) { const logMsg = `No already defined evses and charging station information from template ${this.templateFile} with no evses configuration defined`; - logger.warn(`${this.logPrefix()} ${logMsg}`); - return; + logger.error(`${this.logPrefix()} ${logMsg}`); + throw new BaseError(logMsg); } if (!stationInfo?.Evses[0]) { logger.warn( @@ -1407,34 +1355,36 @@ export class ChargingStation { if (this.evses?.size === 0 || evsesConfigChanged) { evsesConfigChanged && this.evses.clear(); this.evsesConfigurationHash = evsesConfigHash; - for (const evse in stationInfo?.Evses) { - this.evses.set(Utils.convertToInt(evse), { - connectors: this.buildConnectorsMap(stationInfo?.Evses[evse]?.Connectors), - availability: AvailabilityType.Operative, - }); - this.initializeConnectorsMapStatus(this.evses.get(Utils.convertToInt(evse))?.connectors); + const templateMaxEvses = ChargingStationUtils.getMaxNumberOfEvses(stationInfo?.Evses); + if (templateMaxEvses > 0) { + for (const evse in stationInfo.Evses) { + this.evses.set(Utils.convertToInt(evse), { + connectors: ChargingStationUtils.buildConnectorsMap( + stationInfo?.Evses[evse]?.Connectors, + this.logPrefix(), + this.templateFile + ), + availability: AvailabilityType.Operative, + }); + ChargingStationUtils.initializeConnectorsMapStatus( + this.evses.get(Utils.convertToInt(evse))?.connectors, + this.logPrefix() + ); + } + } else { + logger.warn( + `${this.logPrefix()} Charging station information from template ${ + this.templateFile + } with no evses configuration defined, cannot create evses` + ); } + } else { + logger.warn( + `${this.logPrefix()} Charging station information from template ${ + this.templateFile + } with no evses configuration defined, using already defined evses` + ); } - } else { - logger.warn( - `${this.logPrefix()} Charging station information from template ${ - this.templateFile - } with no evses configuration defined, using already defined evses` - ); - } - } - - private checkStationInfoConnectorStatus( - connectorId: number, - connectorStatus: ConnectorStatus - ): void { - if (!Utils.isNullOrUndefined(connectorStatus?.status)) { - logger.warn( - `${this.logPrefix()} Charging station information from template ${ - this.templateFile - } with connector ${connectorId} status configuration defined, undefine it` - ); - delete connectorStatus.status; } } @@ -2076,12 +2026,6 @@ export class ChargingStation { } } - private stopMeterValues(connectorId: number) { - if (this.getConnectorStatus(connectorId)?.transactionSetInterval) { - clearInterval(this.getConnectorStatus(connectorId)?.transactionSetInterval); - } - } - private getReconnectExponentialDelay(): boolean { return this.stationInfo?.reconnectExponentialDelay ?? false; } @@ -2140,13 +2084,4 @@ export class ChargingStation { | undefined { return this.getTemplateFromFile()?.AutomaticTransactionGenerator; } - - private initializeConnectorStatus(connectorStatus: ConnectorStatus): void { - connectorStatus.idTagLocalAuthorized = false; - connectorStatus.idTagAuthorized = false; - connectorStatus.transactionRemoteStarted = false; - connectorStatus.transactionStarted = false; - connectorStatus.energyActiveImportRegisterValue = 0; - connectorStatus.transactionEnergyActiveImportRegisterValue = 0; - } }