X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FChargingStation.ts;h=411c452217e7e166bf77a47a1bf486836054616c;hb=f4754f5b40d2bc5e18a0bd0bc7e12e6500060a2d;hp=bc7f63f9e43e0a6f8524abab29eb32bb8ed424aa;hpb=c0560973d259dbce64a24d10bab46246596fa1d5;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ChargingStation.ts b/src/charging-station/ChargingStation.ts index bc7f63f9..411c4522 100644 --- a/src/charging-station/ChargingStation.ts +++ b/src/charging-station/ChargingStation.ts @@ -1,4 +1,4 @@ -import { BootNotificationResponse, RegistrationStatus } from '../types/ocpp/RequestResponses'; +import { BootNotificationResponse, RegistrationStatus } from '../types/ocpp/Responses'; import ChargingStationConfiguration, { ConfigurationKey } from '../types/ChargingStationConfiguration'; import ChargingStationTemplate, { PowerOutType, VoltageOut } from '../types/ChargingStationTemplate'; import Connectors, { Connector } from '../types/Connectors'; @@ -29,6 +29,7 @@ import { WebSocketCloseEventStatusCode } from '../types/WebSocket'; import crypto from 'crypto'; import fs from 'fs'; import logger from '../utils/Logger'; +import path from 'path'; export default class ChargingStation { public stationTemplateFile: string; @@ -174,7 +175,8 @@ export default class ChargingStation { public startHeartbeat(): void { if (this.getHeartbeatInterval() && this.getHeartbeatInterval() > 0 && !this.heartbeatSetInterval) { - this.heartbeatSetInterval = setInterval(async () => { + // eslint-disable-next-line @typescript-eslint/no-misused-promises + this.heartbeatSetInterval = setInterval(async (): Promise => { await this.ocppRequestService.sendHeartbeat(); }, this.getHeartbeatInterval()); logger.info(this.logPrefix() + ' Heartbeat started every ' + Utils.milliSecondsToHHMMSS(this.getHeartbeatInterval())); @@ -209,7 +211,8 @@ export default class ChargingStation { return; } if (interval > 0) { - this.getConnector(connectorId).transactionSetInterval = setInterval(async () => { + // eslint-disable-next-line @typescript-eslint/no-misused-promises + this.getConnector(connectorId).transactionSetInterval = setInterval(async (): Promise => { if (this.getEnableStatistics()) { const sendMeterValues = performance.timerify(this.ocppRequestService.sendMeterValues); this.performanceObserver.observe({ @@ -221,7 +224,7 @@ export default class ChargingStation { } }, interval); } else { - logger.error(`${this.logPrefix()} Charging station ${StandardParametersKey.MeterValueSampleInterval} configuration set to ${Utils.milliSecondsToHHMMSS(interval)}, not sending MeterValues`); + logger.error(`${this.logPrefix()} Charging station ${StandardParametersKey.MeterValueSampleInterval} configuration set to ${interval ? Utils.milliSecondsToHHMMSS(interval) : interval}, not sending MeterValues`); } } @@ -317,6 +320,31 @@ export default class ChargingStation { } } + public addToMessageQueue(message: string): void { + let dups = false; + // Handle dups in buffer + for (const bufferedMessage of this.messageQueue) { + // Same message + if (message === bufferedMessage) { + dups = true; + break; + } + } + if (!dups) { + // Buffer message + this.messageQueue.push(message); + } + } + + private flushMessageQueue() { + if (!Utils.isEmptyArray(this.messageQueue)) { + this.messageQueue.forEach((message, index) => { + this.messageQueue.splice(index, 1); + this.wsConnection.send(message); + }); + } + } + private getChargingStationId(stationTemplate: ChargingStationTemplate): string { // In case of multiple instances: add instance index to charging station id let instanceIndex = process.env.CF_INSTANCE_INDEX ? process.env.CF_INSTANCE_INDEX : 0; @@ -461,13 +489,9 @@ export default class ChargingStation { } if (this.isRegistered()) { await this.startMessageSequence(); + this.hasStopped && (this.hasStopped = false); if (this.hasSocketRestarted && this.isWebSocketOpen()) { - if (!Utils.isEmptyArray(this.messageQueue)) { - this.messageQueue.forEach((message, index) => { - this.messageQueue.splice(index, 1); - this.wsConnection.send(message); - }); - } + this.flushMessageQueue(); } } else { logger.error(`${this.logPrefix()} Registration failure: max retries reached (${this.getRegistrationMaxRetries()}) or retry disabled (${this.getRegistrationMaxRetries()})`); @@ -575,7 +599,7 @@ export default class ChargingStation { } private getAuthorizationFile(): string { - return this.stationInfo.authorizationFile && this.stationInfo.authorizationFile; + return this.stationInfo.authorizationFile && path.join(path.resolve(__dirname, '../'), 'assets', path.basename(this.stationInfo.authorizationFile)); } private getAuthorizedTags(): string[] { @@ -703,7 +727,7 @@ export default class ChargingStation { this.automaticTransactionGeneration = new AutomaticTransactionGenerator(this); } if (this.automaticTransactionGeneration.timeToStop) { - this.automaticTransactionGeneration.start(); + await this.automaticTransactionGeneration.start(); } } if (this.getEnableStatistics()) { @@ -823,7 +847,8 @@ export default class ChargingStation { } private startStationTemplateFileMonitoring(): void { - fs.watch(this.stationTemplateFile).on('change', (e) => { + // 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 @@ -831,7 +856,7 @@ export default class ChargingStation { // Stop the ATG if (!this.stationInfo.AutomaticTransactionGenerator.enable && this.automaticTransactionGeneration) { - this.automaticTransactionGeneration.stop().catch(() => { }); + await this.automaticTransactionGeneration.stop(); } // Start the ATG if (this.stationInfo.AutomaticTransactionGenerator.enable) { @@ -839,7 +864,7 @@ export default class ChargingStation { this.automaticTransactionGeneration = new AutomaticTransactionGenerator(this); } if (this.automaticTransactionGeneration.timeToStop) { - this.automaticTransactionGeneration.start(); + await this.automaticTransactionGeneration.start(); } } // FIXME?: restart heartbeat and WebSocket ping when their interval values have changed