type ErrorResponse,
ErrorType,
type EvseStatus,
+ type EvseStatusConfiguration,
FileType,
FirmwareStatus,
type FirmwareStatusNotificationRequest,
}
return numberOfConnectors;
}
- return this.connectors.get(0) ? this.connectors.size - 1 : this.connectors.size;
+ return this.connectors.has(0) ? this.connectors.size - 1 : this.connectors.size;
}
public getNumberOfEvses(): number {
- return this.evses.size;
+ return this.evses.has(0) ? this.evses.size - 1 : this.evses.size;
}
public getConnectorStatus(connectorId: number): ConnectorStatus | undefined {
public saveOcppConfiguration(): void {
if (this.getOcppPersistentConfiguration()) {
- this.saveConfiguration();
+ this.saveConfiguration({ stationInfo: false, connectors: false, evses: false });
}
}
private saveStationInfo(): void {
if (this.getStationInfoPersistentConfiguration()) {
- this.saveConfiguration();
+ this.saveConfiguration({ ocppConfiguration: false, connectors: false, evses: false });
}
}
if (this.connectors?.size === 0 || connectorsConfigChanged) {
connectorsConfigChanged && this.connectors.clear();
this.connectorsConfigurationHash = connectorsConfigHash;
- const connectorZeroStatus = stationInfo?.Connectors[0];
- // Add connector id 0
- if (connectorZeroStatus && this.getUseConnectorId0(stationInfo) === true) {
- ChargingStationUtils.checkStationInfoConnectorStatus(
- 0,
- connectorZeroStatus,
- this.logPrefix(),
- this.templateFile
- );
- this.connectors.set(0, Utils.cloneObject<ConnectorStatus>(connectorZeroStatus));
- this.getConnectorStatus(0).availability = AvailabilityType.Operative;
- if (Utils.isUndefined(this.getConnectorStatus(0)?.chargingProfiles)) {
- this.getConnectorStatus(0).chargingProfiles = [];
- }
- }
- // Add remaining connectors
const templateMaxConnectors = ChargingStationUtils.getMaxNumberOfConnectors(
stationInfo.Connectors
);
this.templateFile,
this.logPrefix()
);
+ const templateMaxAvailableConnectors = stationInfo?.Connectors[0]
+ ? templateMaxConnectors - 1
+ : templateMaxConnectors;
if (
- configuredMaxConnectors >
- (stationInfo?.Connectors[0] ? templateMaxConnectors - 1 : templateMaxConnectors) &&
+ configuredMaxConnectors > templateMaxAvailableConnectors &&
!stationInfo?.randomConnectors
) {
logger.warn(
);
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;
+ if (templateMaxConnectors > 0) {
+ for (let connectorId = 0; connectorId <= configuredMaxConnectors; connectorId++) {
+ if (
+ connectorId === 0 &&
+ (!stationInfo?.Connectors[connectorId] ||
+ this.getUseConnectorId0(stationInfo) === false)
+ ) {
+ continue;
+ }
+ const templateConnectorId =
+ connectorId > 0 && stationInfo?.randomConnectors
+ ? Utils.getRandomInteger(templateMaxAvailableConnectors, 1)
+ : connectorId;
const connectorStatus = stationInfo?.Connectors[templateConnectorId];
ChargingStationUtils.checkStationInfoConnectorStatus(
templateConnectorId,
this.templateFile
);
this.connectors.set(connectorId, Utils.cloneObject<ConnectorStatus>(connectorStatus));
- this.getConnectorStatus(connectorId).availability = AvailabilityType.Operative;
- if (Utils.isUndefined(this.getConnectorStatus(connectorId)?.chargingProfiles)) {
- this.getConnectorStatus(connectorId).chargingProfiles = [];
- }
- ChargingStationUtils.initializeConnectorsMapStatus(this.connectors, this.logPrefix());
}
+ ChargingStationUtils.initializeConnectorsMapStatus(this.connectors, this.logPrefix());
+ this.saveConnectorsStatus();
} else {
logger.warn(
`${this.logPrefix()} Charging station information from template ${
} with no evse id 0 configuration`
);
}
+ if (!stationInfo?.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) {
const evsesConfigHash = crypto
.createHash(Constants.DEFAULT_HASH_ALGORITHM)
const templateMaxEvses = ChargingStationUtils.getMaxNumberOfEvses(stationInfo?.Evses);
if (templateMaxEvses > 0) {
for (const evse in stationInfo.Evses) {
- this.evses.set(Utils.convertToInt(evse), {
+ const evseId = Utils.convertToInt(evse);
+ this.evses.set(evseId, {
connectors: ChargingStationUtils.buildConnectorsMap(
stationInfo?.Evses[evse]?.Connectors,
this.logPrefix(),
availability: AvailabilityType.Operative,
});
ChargingStationUtils.initializeConnectorsMapStatus(
- this.evses.get(Utils.convertToInt(evse))?.connectors,
+ this.evses.get(evseId)?.connectors,
this.logPrefix()
);
}
+ this.saveEvsesStatus();
} else {
logger.warn(
`${this.logPrefix()} Charging station information from template ${
} 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`
+ );
}
}
return configuration;
}
- private saveConfiguration(): void {
+ private saveConnectorsStatus() {
+ if (this.getOcppPersistentConfiguration()) {
+ this.saveConfiguration({ stationInfo: false, ocppConfiguration: false, evses: false });
+ }
+ }
+
+ private saveEvsesStatus() {
+ if (this.getOcppPersistentConfiguration()) {
+ this.saveConfiguration({ stationInfo: false, ocppConfiguration: false, connectors: false });
+ }
+ }
+
+ private saveConfiguration(
+ params: {
+ stationInfo?: boolean;
+ ocppConfiguration?: boolean;
+ connectors?: boolean;
+ evses?: boolean;
+ } = { stationInfo: true, ocppConfiguration: true, connectors: true, evses: true }
+ ): void {
if (this.configurationFile) {
+ params = {
+ ...params,
+ ...{ stationInfo: true, ocppConfiguration: true, connectors: true, evses: true },
+ };
try {
if (!fs.existsSync(path.dirname(this.configurationFile))) {
fs.mkdirSync(path.dirname(this.configurationFile), { recursive: true });
}
const configurationData: ChargingStationConfiguration =
Utils.cloneObject(this.getConfigurationFromFile()) ?? {};
- this.ocppConfiguration?.configurationKey &&
- (configurationData.configurationKey = this.ocppConfiguration.configurationKey);
- this.stationInfo && (configurationData.stationInfo = this.stationInfo);
+ if (params.stationInfo && this.stationInfo) {
+ configurationData.stationInfo = this.stationInfo;
+ }
+ if (params.ocppConfiguration && this.ocppConfiguration?.configurationKey) {
+ configurationData.configurationKey = this.ocppConfiguration.configurationKey;
+ }
+ if (params.connectors && this.connectors.size > 0) {
+ configurationData.connectorsStatus = [...this.connectors.values()].map(
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ ({ transactionSetInterval, ...connectorStatusRest }) => connectorStatusRest
+ );
+ }
+ if (params.evses && this.evses.size > 0) {
+ configurationData.evsesStatus = [...this.evses.values()].map((evseStatus) => {
+ const status = {
+ ...evseStatus,
+ connectorsStatus: [...evseStatus.connectors.values()].map(
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ ({ transactionSetInterval, ...connectorStatusRest }) => connectorStatusRest
+ ),
+ };
+ delete status.connectors;
+ return status as EvseStatusConfiguration;
+ });
+ }
delete configurationData.configurationHash;
const configurationHash = crypto
.createHash(Constants.DEFAULT_HASH_ALGORITHM)