X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FChargingStation.ts;h=5e4bf7b34a595144c843c6bad1cf426c29ee06ea;hb=23132a44933014c707d4fc3d0c681dc99cee7828;hp=ff912e97d36c95eb3220c2743c506b9ad6f62a36;hpb=6e0964c8dff48691f7155d12096e777a8f9389f4;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ChargingStation.ts b/src/charging-station/ChargingStation.ts index ff912e97..5e4bf7b3 100644 --- a/src/charging-station/ChargingStation.ts +++ b/src/charging-station/ChargingStation.ts @@ -12,6 +12,7 @@ import { ChargingProfile } from '../types/ocpp/ChargingProfile'; import ChargingStationInfo from '../types/ChargingStationInfo'; import Configuration from '../utils/Configuration'; import Constants from '../utils/Constants'; +import FileUtils from '../utils/FileUtils'; import { MessageType } from '../types/ocpp/MessageType'; import { MeterValueMeasurand } from '../types/ocpp/MeterValues'; import OCPP16IncomingRequestService from './ocpp/1.6/OCCP16IncomingRequestService'; @@ -315,9 +316,7 @@ export default class ChargingStation { public resetTransactionOnConnector(connectorId: number): void { this.initTransactionOnConnector(connectorId); - if (this.getConnector(connectorId)?.transactionSetInterval) { - clearInterval(this.getConnector(connectorId).transactionSetInterval); - } + this.stopMeterValues(connectorId); } public addToMessageQueue(message: string): void { @@ -361,8 +360,7 @@ export default class ChargingStation { stationTemplateFromFile = JSON.parse(fs.readFileSync(fileDescriptor, 'utf8')) as ChargingStationTemplate; fs.closeSync(fileDescriptor); } catch (error) { - logger.error('Template file ' + this.stationTemplateFile + ' loading error: %j', error); - throw error; + FileUtils.handleFileException(this.logPrefix(), 'Template', this.stationTemplateFile, error); } const stationInfo: ChargingStationInfo = stationTemplateFromFile || {} as ChargingStationInfo; if (!Utils.isEmptyArray(stationTemplateFromFile.power)) { @@ -613,8 +611,7 @@ export default class ChargingStation { authorizedTags = JSON.parse(fs.readFileSync(fileDescriptor, 'utf8')) as string[]; fs.closeSync(fileDescriptor); } catch (error) { - logger.error(this.logPrefix() + ' Authorization file ' + authorizationFile + ' loading error: %j', error); - throw error; + FileUtils.handleFileException(this.logPrefix(), 'Authorization', authorizationFile, error); } } else { logger.info(this.logPrefix() + ' No authorization file given in template file ' + this.stationTemplateFile); @@ -723,6 +720,13 @@ export default class ChargingStation { } } // Start the ATG + this.startAutomaticTransactionGenerator(); + if (this.getEnableStatistics()) { + this.performanceStatistics.start(); + } + } + + private startAutomaticTransactionGenerator() { if (this.stationInfo.AutomaticTransactionGenerator.enable) { if (!this.automaticTransactionGeneration) { this.automaticTransactionGeneration = new AutomaticTransactionGenerator(this); @@ -732,9 +736,6 @@ export default class ChargingStation { void this.automaticTransactionGeneration.start(); } } - if (this.getEnableStatistics()) { - this.performanceStatistics.start(); - } } private async stopMessageSequence(reason: StopTransactionReason = StopTransactionReason.NONE): Promise { @@ -758,7 +759,9 @@ export default class ChargingStation { } private startWebSocketPing(): void { - const webSocketPingInterval: number = this.getConfigurationKey(StandardParametersKey.WebSocketPingInterval) ? Utils.convertToInt(this.getConfigurationKey(StandardParametersKey.WebSocketPingInterval).value) : 0; + const webSocketPingInterval: number = this.getConfigurationKey(StandardParametersKey.WebSocketPingInterval) + ? Utils.convertToInt(this.getConfigurationKey(StandardParametersKey.WebSocketPingInterval).value) + : 0; if (webSocketPingInterval > 0 && !this.webSocketPingSetInterval) { this.webSocketPingSetInterval = setInterval(() => { if (this.isWebSocketOpen()) { @@ -812,12 +815,8 @@ export default class ChargingStation { } private openWSConnection(options?: WebSocket.ClientOptions, forceCloseOpened = false): void { - if (Utils.isUndefined(options)) { - options = {} as WebSocket.ClientOptions; - } - if (Utils.isUndefined(options?.handshakeTimeout)) { - options.handshakeTimeout = this.getConnectionTimeout() * 1000; - } + options ?? {} as WebSocket.ClientOptions; + options?.handshakeTimeout ?? this.getConnectionTimeout() * 1000; if (this.isWebSocketOpen() && forceCloseOpened) { this.wsConnection.close(); } @@ -834,45 +833,56 @@ export default class ChargingStation { logger.info(this.logPrefix() + ' Will communicate through URL ' + this.supervisionUrl); } + private stopMeterValues(connectorId: number) { + if (this.getConnector(connectorId)?.transactionSetInterval) { + clearInterval(this.getConnector(connectorId).transactionSetInterval); + } + } + private startAuthorizationFileMonitoring(): void { - fs.watch(this.getAuthorizationFile()).on('change', (e) => { + const authorizationFile = this.getAuthorizationFile(); + if (authorizationFile) { try { - logger.debug(this.logPrefix() + ' Authorization file ' + this.getAuthorizationFile() + ' have changed, reload'); - // Initialize authorizedTags - this.authorizedTags = this.getAuthorizedTags(); + fs.watch(authorizationFile).on('change', (e) => { + try { + logger.debug(this.logPrefix() + ' Authorization file ' + authorizationFile + ' have changed, reload'); + // Initialize authorizedTags + this.authorizedTags = this.getAuthorizedTags(); + } catch (error) { + logger.error(this.logPrefix() + ' Authorization file monitoring error: %j', error); + } + }); } catch (error) { - logger.error(this.logPrefix() + ' Authorization file monitoring error: %j', error); + FileUtils.handleFileException(this.logPrefix(), 'Authorization', authorizationFile, error); } - }); + } else { + logger.info(this.logPrefix() + ' No authorization file given in template file ' + this.stationTemplateFile + '. Not monitoring changes'); + } } private startStationTemplateFileMonitoring(): void { + try { // eslint-disable-next-line @typescript-eslint/no-misused-promises - fs.watch(this.stationTemplateFile).on('change', async (e): Promise => { - try { - logger.debug(this.logPrefix() + ' Template file ' + this.stationTemplateFile + ' have changed, reload'); - // Initialize - this.initialize(); - // Stop the ATG - if (!this.stationInfo.AutomaticTransactionGenerator.enable && + fs.watch(this.stationTemplateFile).on('change', async (e): Promise => { + try { + logger.debug(this.logPrefix() + ' Template file ' + this.stationTemplateFile + ' have changed, reload'); + // Initialize + this.initialize(); + // Stop the ATG + if (!this.stationInfo.AutomaticTransactionGenerator.enable && this.automaticTransactionGeneration) { - await this.automaticTransactionGeneration.stop(); - } - // Start the ATG - if (this.stationInfo.AutomaticTransactionGenerator.enable) { - if (!this.automaticTransactionGeneration) { - this.automaticTransactionGeneration = new AutomaticTransactionGenerator(this); - } - if (this.automaticTransactionGeneration.timeToStop) { - // The ATG might sleep - void this.automaticTransactionGeneration.start(); + await this.automaticTransactionGeneration.stop(); } + // Start the ATG + this.startAutomaticTransactionGenerator(); + // FIXME?: restart heartbeat and WebSocket ping when their interval values have changed + } catch (error) { + logger.error(this.logPrefix() + ' Charging station template file monitoring error: %j', error); } - // FIXME?: restart heartbeat and WebSocket ping when their interval values have changed - } catch (error) { - logger.error(this.logPrefix() + ' Charging station template file monitoring error: %j', error); - } - }); + }); + } catch (error) { + FileUtils.handleFileException(this.logPrefix(), 'Template', this.stationTemplateFile, error); + } } private getReconnectExponentialDelay(): boolean | undefined { @@ -887,7 +897,7 @@ export default class ChargingStation { this.stationInfo.AutomaticTransactionGenerator.stopOnConnectionFailure && this.automaticTransactionGeneration && !this.automaticTransactionGeneration.timeToStop) { - this.automaticTransactionGeneration.stop().catch(() => { }); + await this.automaticTransactionGeneration.stop(); } if (this.autoReconnectRetryCount < this.getAutoReconnectMaxRetries() || this.getAutoReconnectMaxRetries() === -1) { this.autoReconnectRetryCount++;