import { createHash, randomBytes } from 'node:crypto';
import type { EventEmitter } from 'node:events';
import { basename, dirname, join } from 'node:path';
+import { env } from 'node:process';
import { fileURLToPath } from 'node:url';
import chalk from 'chalk';
import {
+ type Interval,
addDays,
addSeconds,
addWeeks,
isDate,
isPast,
isWithinInterval,
- maxTime,
toDate,
} from 'date-fns';
+import { maxTime } from 'date-fns/constants';
import type { ChargingStation } from './ChargingStation';
import { getConfigurationKey } from './ConfigurationKeyUtils';
ChargingProfileKindType,
ChargingRateUnitType,
type ChargingSchedulePeriod,
+ type ChargingStationConfiguration,
type ChargingStationInfo,
type ChargingStationTemplate,
ChargingStationWorkerMessageEvents,
export const getChargingStationId = (
index: number,
- stationTemplate: ChargingStationTemplate,
+ stationTemplate: ChargingStationTemplate | undefined,
): string => {
+ if (stationTemplate === undefined) {
+ return "Unknown 'chargingStationId'";
+ }
// In case of multiple instances: add instance index to charging station id
- const instanceIndex = process.env.CF_INSTANCE_INDEX ?? 0;
+ const instanceIndex = env.CF_INSTANCE_INDEX ?? 0;
const idSuffix = stationTemplate?.nameSuffix ?? '';
const idStr = `000000000${index.toString()}`;
return stationTemplate?.fixedName
} else if (connectorId > 0 && numberOfPhases === 0) {
return `${connectorId}.${ConnectorPhaseRotation.NotApplicable}`;
// AC
- } else if (connectorId > 0 && numberOfPhases === 1) {
+ } else if (connectorId >= 0 && numberOfPhases === 1) {
return `${connectorId}.${ConnectorPhaseRotation.NotApplicable}`;
- } else if (connectorId > 0 && numberOfPhases === 3) {
+ } else if (connectorId >= 0 && numberOfPhases === 3) {
return `${connectorId}.${ConnectorPhaseRotation.RST}`;
}
};
}
};
+export const checkConfiguration = (
+ stationConfiguration: ChargingStationConfiguration | undefined,
+ logPrefix: string,
+ configurationFile: string,
+): void => {
+ if (isNullOrUndefined(stationConfiguration)) {
+ const errorMsg = `Failed to read charging station configuration file ${configurationFile}`;
+ logger.error(`${logPrefix} ${errorMsg}`);
+ throw new BaseError(errorMsg);
+ }
+ if (isEmptyObject(stationConfiguration!)) {
+ const errorMsg = `Empty charging station configuration from file ${configurationFile}`;
+ logger.error(`${logPrefix} ${errorMsg}`);
+ throw new BaseError(errorMsg);
+ }
+};
+
export const checkConnectorsConfiguration = (
stationTemplate: ChargingStationTemplate,
logPrefix: string,
stationInfo: ChargingStationInfo,
bootReason: BootReasonEnumType = BootReasonEnumType.PowerUp,
): BootNotificationRequest => {
- const ocppVersion = stationInfo.ocppVersion ?? OCPPVersion.VERSION_16;
+ const ocppVersion = stationInfo.ocppVersion!;
switch (ocppVersion) {
case OCPPVersion.VERSION_16:
return {
if (!isNullOrUndefined(result)) {
limit = result?.limit;
chargingProfile = result?.chargingProfile;
- switch (chargingStation.getCurrentOutType()) {
+ switch (chargingStation.stationInfo?.currentOutType) {
case CurrentType.AC:
limit =
chargingProfile?.chargingSchedule?.chargingRateUnit === ChargingRateUnitType.WATT
? limit
: ACElectricUtils.powerTotal(
chargingStation.getNumberOfPhases(),
- chargingStation.getVoltageOut(),
+ chargingStation.stationInfo.voltageOut!,
limit!,
);
break;
limit =
chargingProfile?.chargingSchedule?.chargingRateUnit === ChargingRateUnitType.WATT
? limit
- : DCElectricUtils.power(chargingStation.getVoltageOut(), limit!);
+ : DCElectricUtils.power(chargingStation.stationInfo.voltageOut!, limit!);
}
const connectorMaximumPower =
- chargingStation.getMaximumPower() / chargingStation.powerDivider;
+ chargingStation.stationInfo.maximumPower! / chargingStation.powerDivider;
if (limit! > connectorMaximumPower) {
logger.error(
`${chargingStation.logPrefix()} ${moduleName}.getChargingStationConnectorChargingProfilesPowerLimit: Charging profile id ${chargingProfile?.chargingProfileId} limit ${limit} is greater than connector id ${connectorId} maximum ${connectorMaximumPower}: %j`,