import fs from 'node:fs';
import path from 'node:path';
import { URL } from 'node:url';
-import { parentPort } from 'worker_threads';
+import { parentPort } from 'node: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';
-import type { AutomaticTransactionGeneratorConfiguration } from '../types/AutomaticTransactionGenerator';
-import type { ChargingStationConfiguration } from '../types/ChargingStationConfiguration';
-import type { ChargingStationInfo } from '../types/ChargingStationInfo';
-import type { ChargingStationOcppConfiguration } from '../types/ChargingStationOcppConfiguration';
import {
- type ChargingStationTemplate,
- CurrentType,
- type FirmwareUpgrade,
- PowerUnits,
- type WsOptions,
-} from '../types/ChargingStationTemplate';
-import { SupervisionUrlDistribution } from '../types/ConfigurationData';
-import type { ConnectorStatus } from '../types/ConnectorStatus';
-import { FileType } from '../types/FileType';
-import type { JsonType } from '../types/JsonType';
+ AuthorizedTagsCache,
+ AutomaticTransactionGenerator,
+ ChargingStationConfigurationUtils,
+ ChargingStationUtils,
+ ChargingStationWorkerBroadcastChannel,
+ MessageChannelUtils,
+ SharedLRUCache,
+} from './internal';
import {
- ConnectorPhaseRotation,
- StandardParametersKey,
- SupportedFeatureProfiles,
- VendorDefaultParametersKey,
-} from '../types/ocpp/Configuration';
-import { ConnectorStatusEnum } from '../types/ocpp/ConnectorStatusEnum';
-import { ErrorType } from '../types/ocpp/ErrorType';
-import { MessageType } from '../types/ocpp/MessageType';
-import { MeterValue, MeterValueMeasurand } from '../types/ocpp/MeterValues';
-import { OCPPVersion } from '../types/ocpp/OCPPVersion';
+ // OCPP16IncomingRequestService,
+ OCPP16RequestService,
+ // OCPP16ResponseService,
+ OCPP16ServiceUtils,
+ OCPP20IncomingRequestService,
+ OCPP20RequestService,
+ // OCPP20ResponseService,
+ type OCPPIncomingRequestService,
+ type OCPPRequestService,
+ // OCPPServiceUtils,
+} from './ocpp';
+import { OCPP16IncomingRequestService } from './ocpp/1.6/OCPP16IncomingRequestService';
+import { OCPP16ResponseService } from './ocpp/1.6/OCPP16ResponseService';
+import { OCPP20ResponseService } from './ocpp/2.0/OCPP20ResponseService';
+import { OCPPServiceUtils } from './ocpp/OCPPServiceUtils';
+import { BaseError, OCPPError } from '../exception';
+import { PerformanceStatistics } from '../performance';
import {
+ type AutomaticTransactionGeneratorConfiguration,
AvailabilityType,
type BootNotificationRequest,
+ type BootNotificationResponse,
type CachedRequest,
+ type ChargingStationConfiguration,
+ type ChargingStationInfo,
+ type ChargingStationOcppConfiguration,
+ type ChargingStationTemplate,
+ ConnectorPhaseRotation,
+ ConnectorStatus,
+ ConnectorStatusEnum,
+ CurrentType,
type ErrorCallback,
+ type ErrorResponse,
+ ErrorType,
+ FileType,
FirmwareStatus,
type FirmwareStatusNotificationRequest,
+ type FirmwareStatusNotificationResponse,
+ type FirmwareUpgrade,
type HeartbeatRequest,
+ type HeartbeatResponse,
type IncomingRequest,
- IncomingRequestCommand,
+ type IncomingRequestCommand,
+ type JsonType,
+ MessageType,
+ type MeterValue,
+ MeterValueMeasurand,
type MeterValuesRequest,
+ type MeterValuesResponse,
+ OCPPVersion,
type OutgoingRequest,
+ PowerUnits,
+ RegistrationStatusEnumType,
RequestCommand,
+ type Response,
type ResponseCallback,
+ StandardParametersKey,
type StatusNotificationRequest,
-} from '../types/ocpp/Requests';
-import {
- type BootNotificationResponse,
- type ErrorResponse,
- type FirmwareStatusNotificationResponse,
- type HeartbeatResponse,
- type MeterValuesResponse,
- RegistrationStatusEnumType,
- type Response,
type StatusNotificationResponse,
-} from '../types/ocpp/Responses';
-import {
StopTransactionReason,
type StopTransactionRequest,
type StopTransactionResponse,
-} from '../types/ocpp/Transaction';
-import { WSError, WebSocketCloseEventStatusCode } from '../types/WebSocket';
-import Configuration from '../utils/Configuration';
-import Constants from '../utils/Constants';
-import { ACElectricUtils, DCElectricUtils } from '../utils/ElectricUtils';
-import FileUtils from '../utils/FileUtils';
-import logger from '../utils/Logger';
-import Utils from '../utils/Utils';
-
-export default class ChargingStation {
+ SupervisionUrlDistribution,
+ SupportedFeatureProfiles,
+ VendorParametersKey,
+ type WSError,
+ WebSocketCloseEventStatusCode,
+ type WsOptions,
+} from '../types';
+import {
+ ACElectricUtils,
+ Configuration,
+ Constants,
+ DCElectricUtils,
+ FileUtils,
+ Utils,
+ logger,
+} from '../utils';
+
+export class ChargingStation {
public readonly index: number;
public readonly templateFile: string;
public stationInfo!: ChargingStationInfo;
}
public openWSConnection(
- options: WsOptions = this.stationInfo?.wsOptions ?? {},
+ options: WsOptions = this.stationInfo?.wsOptions ?? Constants.EMPTY_OBJECT,
params: { closeOpened?: boolean; terminateOpened?: boolean } = {
closeOpened: false,
terminateOpened: false,
}
private getSupervisionUrlOcppKey(): string {
- return this.stationInfo.supervisionUrlOcppKey ?? VendorDefaultParametersKey.ConnectionUrl;
+ return this.stationInfo.supervisionUrlOcppKey ?? VendorParametersKey.ConnectionUrl;
}
private getTemplateFromFile(): ChargingStationTemplate | undefined {
},
reset: true,
},
- stationTemplate?.firmwareUpgrade ?? {}
+ stationTemplate?.firmwareUpgrade ?? Constants.EMPTY_OBJECT
);
stationInfo.resetTime = !Utils.isNullOrUndefined(stationTemplate?.resetTime)
? stationTemplate.resetTime * 1000
fs.mkdirSync(path.dirname(this.configurationFile), { recursive: true });
}
const configurationData: ChargingStationConfiguration =
- this.getConfigurationFromFile() ?? {};
+ Utils.cloneObject(this.getConfigurationFromFile()) ?? Constants.EMPTY_OBJECT;
this.ocppConfiguration?.configurationKey &&
(configurationData.configurationKey = this.ocppConfiguration.configurationKey);
this.stationInfo && (configurationData.stationInfo = this.stationInfo);
const configurationFromFile = this.getConfigurationFromFile();
configuration = configurationFromFile?.configurationKey && configurationFromFile;
}
- configuration && delete configuration.stationInfo;
+ if (!Utils.isNullOrUndefined(configuration)) {
+ delete configuration.stationInfo;
+ delete configuration.configurationHash;
+ }
return configuration;
}
(this.isChargingStationAvailable() === false ||
this.isConnectorAvailable(connectorId) === false)
) {
- connectorStatus = ConnectorStatusEnum.UNAVAILABLE;
+ connectorStatus = ConnectorStatusEnum.Unavailable;
} else if (
!this.getConnectorStatus(connectorId)?.status &&
this.getConnectorStatus(connectorId)?.bootStatus
connectorStatus = this.getConnectorStatus(connectorId)?.status;
} else {
// Set default status
- connectorStatus = ConnectorStatusEnum.AVAILABLE;
+ connectorStatus = ConnectorStatusEnum.Available;
}
await this.ocppRequestService.requestHandler<
StatusNotificationRequest,
OCPPServiceUtils.buildStatusNotificationRequest(
this,
connectorId,
- ConnectorStatusEnum.UNAVAILABLE
+ ConnectorStatusEnum.Unavailable
)
);
this.getConnectorStatus(connectorId).status = undefined;
const supervisionUrls = this.stationInfo?.supervisionUrls ?? Configuration.getSupervisionUrls();
if (Utils.isNotEmptyArray(supervisionUrls)) {
switch (Configuration.getSupervisionUrlDistribution()) {
- case SupervisionUrlDistribution.ROUND_ROBIN:
- // FIXME
- this.configuredSupervisionUrlIndex = (this.index - 1) % supervisionUrls.length;
- break;
case SupervisionUrlDistribution.RANDOM:
this.configuredSupervisionUrlIndex = Math.floor(
Utils.secureRandom() * supervisionUrls.length
);
break;
+ case SupervisionUrlDistribution.ROUND_ROBIN:
case SupervisionUrlDistribution.CHARGING_STATION_AFFINITY:
- this.configuredSupervisionUrlIndex = (this.index - 1) % supervisionUrls.length;
- break;
default:
- logger.error(
- `${this.logPrefix()} Unknown supervision url distribution '${Configuration.getSupervisionUrlDistribution()}' from values '${SupervisionUrlDistribution.toString()}', defaulting to ${
- SupervisionUrlDistribution.CHARGING_STATION_AFFINITY
- }`
- );
+ Object.values(SupervisionUrlDistribution).includes(
+ Configuration.getSupervisionUrlDistribution()
+ ) === false &&
+ logger.error(
+ `${this.logPrefix()} Unknown supervision url distribution '${Configuration.getSupervisionUrlDistribution()}' from values '${SupervisionUrlDistribution.toString()}', defaulting to ${
+ SupervisionUrlDistribution.CHARGING_STATION_AFFINITY
+ }`
+ );
this.configuredSupervisionUrlIndex = (this.index - 1) % supervisionUrls.length;
break;
}
`${this.logPrefix()} WebSocket connection retry #${this.autoReconnectRetryCount.toString()}`
);
this.openWSConnection(
- { ...(this.stationInfo?.wsOptions ?? {}), handshakeTimeout: reconnectTimeout },
+ {
+ ...(this.stationInfo?.wsOptions ?? Constants.EMPTY_OBJECT),
+ handshakeTimeout: reconnectTimeout,
+ },
{ closeOpened: true }
);
this.wsConnectionRestarted = true;