+ this.saveOcppConfiguration();
+ }
+
+ private initializeConnectorsOrEvsesFromFile(configuration: ChargingStationConfiguration): void {
+ if (configuration?.connectorsStatus && !configuration?.evsesStatus) {
+ for (const [connectorId, connectorStatus] of configuration.connectorsStatus.entries()) {
+ this.connectors.set(connectorId, cloneObject<ConnectorStatus>(connectorStatus));
+ }
+ } else if (configuration?.evsesStatus && !configuration?.connectorsStatus) {
+ for (const [evseId, evseStatusConfiguration] of configuration.evsesStatus.entries()) {
+ const evseStatus = cloneObject<EvseStatusConfiguration>(evseStatusConfiguration);
+ delete evseStatus.connectorsStatus;
+ this.evses.set(evseId, {
+ ...(evseStatus as EvseStatus),
+ connectors: new Map<number, ConnectorStatus>(
+ 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);
+ } else {
+ const errorMsg = `No connectors or evses defined in template file ${this.templateFile}`;
+ logger.error(`${this.logPrefix()} ${errorMsg}`);
+ throw new BaseError(errorMsg);
+ }
+ }
+
+ 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 (!stationTemplate?.Connectors?.[0]) {
+ logger.warn(
+ `${this.logPrefix()} Charging station information from template ${
+ this.templateFile
+ } with no connector id 0 configuration`,
+ );
+ }
+ if (stationTemplate?.Connectors) {
+ const { configuredMaxConnectors, templateMaxConnectors, templateMaxAvailableConnectors } =
+ checkConnectorsConfiguration(stationTemplate, this.logPrefix(), this.templateFile);
+ const connectorsConfigHash = createHash(Constants.DEFAULT_HASH_ALGORITHM)
+ .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;
+ if (templateMaxConnectors > 0) {
+ for (let connectorId = 0; connectorId <= configuredMaxConnectors; connectorId++) {
+ if (
+ connectorId === 0 &&
+ (!stationTemplate?.Connectors?.[connectorId] ||
+ this.getUseConnectorId0(stationTemplate) === false)
+ ) {
+ continue;
+ }
+ const templateConnectorId =
+ connectorId > 0 && stationTemplate?.randomConnectors
+ ? getRandomInteger(templateMaxAvailableConnectors, 1)
+ : connectorId;
+ const connectorStatus = stationTemplate?.Connectors[templateConnectorId];
+ checkStationInfoConnectorStatus(
+ templateConnectorId,
+ connectorStatus,
+ this.logPrefix(),
+ this.templateFile,
+ );
+ this.connectors.set(connectorId, cloneObject<ConnectorStatus>(connectorStatus));
+ }
+ initializeConnectorsMapStatus(this.connectors, this.logPrefix());
+ this.saveConnectorsStatus();
+ } else {
+ logger.warn(
+ `${this.logPrefix()} Charging station information from template ${
+ this.templateFile
+ } with no connectors configuration defined, cannot create connectors`,
+ );
+ }
+ }
+ } else {
+ logger.warn(
+ `${this.logPrefix()} Charging station information from template ${
+ this.templateFile
+ } with no connectors configuration defined, using already defined connectors`,
+ );
+ }
+ }
+
+ 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 (!stationTemplate?.Evses?.[0]) {
+ logger.warn(
+ `${this.logPrefix()} Charging station information from template ${
+ this.templateFile
+ } with no evse id 0 configuration`,