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';
stationTemplate: ChargingStationTemplate,
): string => {
// 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}`;
}
};
checkConfiguredMaxConnectors(configuredMaxConnectors, logPrefix, templateFile);
const templateMaxConnectors = getMaxNumberOfConnectors(stationTemplate.Connectors!);
checkTemplateMaxConnectors(templateMaxConnectors, logPrefix, templateFile);
- const templateMaxAvailableConnectors = stationTemplate.Connectors![0]
+ const templateMaxAvailableConnectors = stationTemplate.Connectors?.[0]
? templateMaxConnectors - 1
: templateMaxConnectors;
if (
};
export const resetConnectorStatus = (connectorStatus: ConnectorStatus): void => {
+ connectorStatus.chargingProfiles =
+ connectorStatus.transactionId && isNotEmptyArray(connectorStatus.chargingProfiles)
+ ? connectorStatus.chargingProfiles?.filter(
+ (chargingProfile) => chargingProfile.transactionId !== connectorStatus.transactionId,
+ )
+ : [];
connectorStatus.idTagLocalAuthorized = false;
connectorStatus.idTagAuthorized = false;
connectorStatus.transactionRemoteStarted = false;
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 {
export const createSerialNumber = (
stationTemplate: ChargingStationTemplate,
stationInfo: ChargingStationInfo,
- params: {
+ params?: {
randomSerialNumberUpperCase?: boolean;
randomSerialNumber?: boolean;
- } = {
- randomSerialNumberUpperCase: true,
- randomSerialNumber: true,
},
): void => {
params = { ...{ randomSerialNumberUpperCase: true, randomSerialNumber: true }, ...params };
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`,
} else if (isUndefined(stationTemplate.numberOfConnectors) === false) {
configuredMaxNumberOfConnectors = stationTemplate.numberOfConnectors as number;
} else if (stationTemplate.Connectors && !stationTemplate.Evses) {
- configuredMaxNumberOfConnectors = stationTemplate.Connectors[0]
+ configuredMaxNumberOfConnectors = stationTemplate.Connectors?.[0]
? getMaxNumberOfConnectors(stationTemplate.Connectors) - 1
: getMaxNumberOfConnectors(stationTemplate.Connectors);
} else if (stationTemplate.Evses && !stationTemplate.Connectors) {
templateFile: string,
logMsgToAppend = '',
): void => {
- if (!isUndefined(template[key as keyof ChargingStationTemplate])) {
+ if (!isUndefined(template?.[key as keyof ChargingStationTemplate])) {
const logMsg = `Deprecated template key '${key}' usage in file '${templateFile}'${
isNotEmptyString(logMsgToAppend) ? `. ${logMsgToAppend}` : ''
}`;
logger.warn(`${logPrefix} ${logMsg}`);
- console.warn(chalk.yellow(`${logMsg}`));
+ console.warn(`${chalk.green(logPrefix)} ${chalk.yellow(logMsg)}`);
}
};
deprecatedKey: string,
key?: string,
): void => {
- if (!isUndefined(template[deprecatedKey as keyof ChargingStationTemplate])) {
+ if (!isUndefined(template?.[deprecatedKey as keyof ChargingStationTemplate])) {
if (!isUndefined(key)) {
(template as unknown as Record<string, unknown>)[key!] =
template[deprecatedKey as keyof ChargingStationTemplate];
);
return false;
}
- if (isNullOrUndefined(chargingProfile.chargingSchedule.startSchedule)) {
+ if (
+ chargingProfile.chargingProfileKind === ChargingProfileKindType.RECURRING &&
+ isNullOrUndefined(chargingProfile.chargingSchedule.startSchedule)
+ ) {
logger.error(
`${logPrefix} ${moduleName}.canProceedRecurringChargingProfile: Recurring charging profile id ${chargingProfile.chargingProfileId} has no startSchedule defined`,
);