X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FChargingStation.ts;h=a52ebacb88eeb91a62e1d3ddf91d70b3a519f40b;hb=ad67a158ed1e333a255b49e0c8b4aaa9c7b85867;hp=a7a41dddcbf6dbf30a4487c0f925e54dfc1f8b25;hpb=5d280aae12d6ad7367136421c8e2414a676d2c1a;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ChargingStation.ts b/src/charging-station/ChargingStation.ts index a7a41ddd..a52ebacb 100644 --- a/src/charging-station/ChargingStation.ts +++ b/src/charging-station/ChargingStation.ts @@ -9,6 +9,23 @@ import { parentPort } from 'worker_threads'; import merge from 'just-merge'; import WebSocket, { type RawData } from 'ws'; +import AuthorizedTagsCache from './AuthorizedTagsCache'; +import AutomaticTransactionGenerator from './AutomaticTransactionGenerator'; +import { ChargingStationConfigurationUtils } from './ChargingStationConfigurationUtils'; +import { ChargingStationUtils } from './ChargingStationUtils'; +import ChargingStationWorkerBroadcastChannel from './ChargingStationWorkerBroadcastChannel'; +import { MessageChannelUtils } from './MessageChannelUtils'; +import OCPP16IncomingRequestService from './ocpp/1.6/OCPP16IncomingRequestService'; +import OCPP16RequestService from './ocpp/1.6/OCPP16RequestService'; +import OCPP16ResponseService from './ocpp/1.6/OCPP16ResponseService'; +import { OCPP16ServiceUtils } from './ocpp/1.6/OCPP16ServiceUtils'; +import OCPP20IncomingRequestService from './ocpp/2.0/OCPP20IncomingRequestService'; +import OCPP20RequestService from './ocpp/2.0/OCPP20RequestService'; +import OCPP20ResponseService from './ocpp/2.0/OCPP20ResponseService'; +import type OCPPIncomingRequestService from './ocpp/OCPPIncomingRequestService'; +import type OCPPRequestService from './ocpp/OCPPRequestService'; +import { OCPPServiceUtils } from './ocpp/OCPPServiceUtils'; +import SharedLRUCache from './SharedLRUCache'; import BaseError from '../exception/BaseError'; import OCPPError from '../exception/OCPPError'; import PerformanceStatistics from '../performance/PerformanceStatistics'; @@ -19,7 +36,6 @@ import type { ChargingStationOcppConfiguration } from '../types/ChargingStationO import { type ChargingStationTemplate, CurrentType, - type FirmwareUpgrade, PowerUnits, type WsOptions, } from '../types/ChargingStationTemplate'; @@ -76,23 +92,6 @@ import { ACElectricUtils, DCElectricUtils } from '../utils/ElectricUtils'; import FileUtils from '../utils/FileUtils'; import logger from '../utils/Logger'; import Utils from '../utils/Utils'; -import AuthorizedTagsCache from './AuthorizedTagsCache'; -import AutomaticTransactionGenerator from './AutomaticTransactionGenerator'; -import { ChargingStationConfigurationUtils } from './ChargingStationConfigurationUtils'; -import { ChargingStationUtils } from './ChargingStationUtils'; -import ChargingStationWorkerBroadcastChannel from './ChargingStationWorkerBroadcastChannel'; -import { MessageChannelUtils } from './MessageChannelUtils'; -import OCPP16IncomingRequestService from './ocpp/1.6/OCPP16IncomingRequestService'; -import OCPP16RequestService from './ocpp/1.6/OCPP16RequestService'; -import OCPP16ResponseService from './ocpp/1.6/OCPP16ResponseService'; -import { OCPP16ServiceUtils } from './ocpp/1.6/OCPP16ServiceUtils'; -import OCPP20IncomingRequestService from './ocpp/2.0/OCPP20IncomingRequestService'; -import OCPP20RequestService from './ocpp/2.0/OCPP20RequestService'; -import OCPP20ResponseService from './ocpp/2.0/OCPP20ResponseService'; -import type OCPPIncomingRequestService from './ocpp/OCPPIncomingRequestService'; -import type OCPPRequestService from './ocpp/OCPPRequestService'; -import { OCPPServiceUtils } from './ocpp/OCPPServiceUtils'; -import SharedLRUCache from './SharedLRUCache'; export default class ChargingStation { public readonly index: number; @@ -378,12 +377,15 @@ export default class ChargingStation { this.getHeartbeatInterval() > 0 && !this.heartbeatSetInterval ) { - // eslint-disable-next-line @typescript-eslint/no-misused-promises - this.heartbeatSetInterval = setInterval(async (): Promise => { - await this.ocppRequestService.requestHandler( - this, - RequestCommand.HEARTBEAT - ); + this.heartbeatSetInterval = setInterval(() => { + this.ocppRequestService + .requestHandler(this, RequestCommand.HEARTBEAT) + .catch((error) => { + logger.error( + `${this.logPrefix()} Error while sending '${RequestCommand.HEARTBEAT}':`, + error + ); + }); }, this.getHeartbeatInterval()); logger.info( this.logPrefix() + @@ -449,18 +451,16 @@ export default class ChargingStation { return; } if (interval > 0) { - // eslint-disable-next-line @typescript-eslint/no-misused-promises - this.getConnectorStatus(connectorId).transactionSetInterval = setInterval( - // eslint-disable-next-line @typescript-eslint/no-misused-promises - async (): Promise => { - // FIXME: Implement OCPP version agnostic helpers - const meterValue: MeterValue = OCPP16ServiceUtils.buildMeterValue( - this, - connectorId, - this.getConnectorStatus(connectorId).transactionId, - interval - ); - await this.ocppRequestService.requestHandler( + this.getConnectorStatus(connectorId).transactionSetInterval = setInterval(() => { + // FIXME: Implement OCPP version agnostic helpers + const meterValue: MeterValue = OCPP16ServiceUtils.buildMeterValue( + this, + connectorId, + this.getConnectorStatus(connectorId).transactionId, + interval + ); + this.ocppRequestService + .requestHandler( this, RequestCommand.METER_VALUES, { @@ -468,10 +468,14 @@ export default class ChargingStation { transactionId: this.getConnectorStatus(connectorId).transactionId, meterValue: [meterValue], } - ); - }, - interval - ); + ) + .catch((error) => { + logger.error( + `${this.logPrefix()} Error while sending '${RequestCommand.METER_VALUES}':`, + error + ); + }); + }, interval); } else { logger.error( `${this.logPrefix()} Charging station ${ @@ -565,15 +569,6 @@ export default class ChargingStation { } } - public getFirmwareUpgrade(): FirmwareUpgrade { - return merge( - { - reset: true, - }, - this.stationInfo.firmwareUpgrade - ); - } - public async reset(reason?: StopTransactionReason): Promise { await this.stop(reason); await Utils.sleep(this.stationInfo.resetTime); @@ -641,7 +636,7 @@ export default class ChargingStation { if (params?.terminateOpened) { this.terminateWSConnection(); } - const ocppVersion = this.getOcppVersion(); + const ocppVersion = this.stationInfo.ocppVersion ?? OCPPVersion.VERSION_16; let protocol: string; switch (ocppVersion) { case OCPPVersion.VERSION_16: @@ -843,6 +838,7 @@ export default class ChargingStation { this.index, stationTemplate ); + stationInfo.ocppVersion = stationTemplate.ocppVersion ?? OCPPVersion.VERSION_16; ChargingStationUtils.createSerialNumber(stationTemplate, stationInfo); if (!Utils.isEmptyArray(stationTemplate.power)) { stationTemplate.power = stationTemplate.power as number[]; @@ -870,6 +866,12 @@ export default class ChargingStation { } does not match firmware version pattern '${stationInfo.firmwareVersionPattern}'` ); } + stationInfo.firmwareUpgrade = merge( + { + reset: true, + }, + stationTemplate.firmwareUpgrade ?? {} + ); stationInfo.resetTime = stationTemplate.resetTime ? stationTemplate.resetTime * 1000 : Constants.CHARGING_STATION_DEFAULT_RESET_TIME; @@ -939,10 +941,6 @@ export default class ChargingStation { } } - private getOcppVersion(): OCPPVersion { - return this.stationInfo.ocppVersion ?? OCPPVersion.VERSION_16; - } - private getOcppPersistentConfiguration(): boolean { return this.stationInfo?.ocppPersistentConfiguration ?? true; } @@ -981,7 +979,8 @@ export default class ChargingStation { // OCPP configuration this.ocppConfiguration = this.getOcppConfiguration(); this.initializeOcppConfiguration(); - switch (this.getOcppVersion()) { + const ocppVersion = this.stationInfo.ocppVersion ?? OCPPVersion.VERSION_16; + switch (ocppVersion) { case OCPPVersion.VERSION_16: this.ocppIncomingRequestService = OCPP16IncomingRequestService.getInstance(); @@ -998,7 +997,7 @@ export default class ChargingStation { ); break; default: - this.handleUnsupportedVersion(this.getOcppVersion()); + this.handleUnsupportedVersion(ocppVersion); break; } if (this.stationInfo?.autoRegister === true) { @@ -1013,9 +1012,9 @@ export default class ChargingStation { this.stationInfo.firmwareVersion && this.stationInfo.firmwareVersionPattern ) { - const versionStep = this.getFirmwareUpgrade()?.versionUpgrade?.step ?? 1; + const versionStep = this.stationInfo.firmwareUpgrade?.versionUpgrade?.step ?? 1; const patternGroup: number = - this.getFirmwareUpgrade()?.versionUpgrade?.patternGroup ?? + this.stationInfo.firmwareUpgrade?.versionUpgrade?.patternGroup ?? this.stationInfo.firmwareVersion.split('.').length; const match = this.stationInfo.firmwareVersion .match(new RegExp(this.stationInfo.firmwareVersionPattern)) @@ -1807,8 +1806,11 @@ export default class ChargingStation { logger.error( `${this.logPrefix()} Charging profile id ${ matchingChargingProfile.chargingProfileId - } limit ${limit} is greater than connector id ${connectorId} maximum ${connectorMaximumPower}, dump charging profiles' stack: %j`, - this.getConnectorStatus(connectorId).chargingProfiles + } limit ${limit} is greater than connector id ${connectorId} maximum ${connectorMaximumPower}: %j`, + this.getConnectorStatus(connectorId).chargingProfiles.find( + (chargingProfile) => + chargingProfile.chargingProfileId === matchingChargingProfile.chargingProfileId + ) ); limit = connectorMaximumPower; }