} from '../types';
import {
ACElectricUtils,
+ AsyncLock,
+ AsyncLockType,
Configuration,
Constants,
DCElectricUtils,
public automaticTransactionGenerator!: AutomaticTransactionGenerator | undefined;
public ocppConfiguration!: ChargingStationOcppConfiguration | undefined;
public wsConnection!: WebSocket | null;
- public connectors: Map<number, ConnectorStatus>;
+ public readonly connectors: Map<number, ConnectorStatus>;
public readonly evses: Map<number, EvseStatus>;
public readonly requests: Map<string, CachedRequest>;
public performanceStatistics!: PerformanceStatistics | undefined;
};
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 {
private initializeConnectorsOrEvsesFromFile(configuration: ChargingStationConfiguration): void {
if (configuration?.connectorsStatus && !configuration?.evsesStatus) {
- this.connectors = new Map<number, ConnectorStatus>(
- configuration?.connectorsStatus.map((connectorStatus, connectorId) => [
- connectorId,
- connectorStatus,
- ])
- );
+ for (const [connectorId, connectorStatus] of configuration.connectorsStatus.entries()) {
+ this.connectors.set(connectorId, Utils.cloneObject<ConnectorStatus>(connectorStatus));
+ }
} else if (configuration?.evsesStatus && !configuration?.connectorsStatus) {
for (const [evseId, evseStatusConfiguration] of configuration.evsesStatus.entries()) {
- const evseStatus = Utils.cloneObject(evseStatusConfiguration);
+ const evseStatus = Utils.cloneObject<EvseStatusConfiguration>(evseStatusConfiguration);
delete evseStatus.connectorsStatus;
this.evses.set(evseId, {
- ...evseStatus,
+ ...(evseStatus as EvseStatus),
connectors: new Map<number, ConnectorStatus>(
evseStatusConfiguration.connectorsStatus.map((connectorStatus, connectorId) => [
connectorId,
fs.mkdirSync(path.dirname(this.configurationFile), { recursive: true });
}
let configurationData: ChargingStationConfiguration =
- Utils.cloneObject(this.getConfigurationFromFile()) ?? {};
+ Utils.cloneObject<ChargingStationConfiguration>(this.getConfigurationFromFile()) ?? {};
if (this.getStationInfoPersistentConfiguration() && this.stationInfo) {
configurationData.stationInfo = this.stationInfo;
}
.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.sharedLRUCache.setChargingStationConfiguration(configurationData);
- this.configurationFileHash = configurationHash;
+ 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 ${
}
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.connectorsStatus;
- delete configuration.evsesStatus;
- delete configuration.automaticTransactionGenerator;
- delete configuration.automaticTransactionGeneratorStatuses;
- delete configuration.configurationHash;
- }
- return configuration;
}
private getOcppConfiguration(): ChargingStationOcppConfiguration | undefined {
await OCPPServiceUtils.sendAndSetConnectorStatus(
this,
connectorId,
- connectorBootStatus
+ connectorBootStatus,
+ evseId
);
}
}
OCPPServiceUtils.buildStatusNotificationRequest(
this,
connectorId,
- ConnectorStatusEnum.Unavailable
+ ConnectorStatusEnum.Unavailable,
+ evseId
)
);
delete connectorStatus?.status;