import path from 'node:path';
import { fileURLToPath } from 'node:url';
+import chalk from 'chalk';
import moment from 'moment';
import type { ChargingStation } from './internal';
...(!Utils.isUndefined(stationTemplate.chargePointSerialNumberPrefix) && {
chargePointSerialNumber: stationTemplate.chargePointSerialNumberPrefix,
}),
- // FIXME?: Should a firmware version change always reference a new configuration file?
- ...(!Utils.isUndefined(stationTemplate.firmwareVersion) && {
- firmwareVersion: stationTemplate.firmwareVersion,
- }),
- ...(!Utils.isUndefined(stationTemplate.iccid) && { iccid: stationTemplate.iccid }),
- ...(!Utils.isUndefined(stationTemplate.imsi) && { imsi: stationTemplate.imsi }),
...(!Utils.isUndefined(stationTemplate.meterSerialNumberPrefix) && {
meterSerialNumber: stationTemplate.meterSerialNumberPrefix,
}),
.digest('hex');
}
+ public static checkChargingStation(chargingStation: ChargingStation, logPrefix: string): boolean {
+ if (chargingStation.started === false && chargingStation.starting === false) {
+ logger.warn(`${logPrefix} charging station is stopped, cannot proceed`);
+ return false;
+ }
+ return true;
+ }
+
public static getTemplateMaxNumberOfConnectors(stationTemplate: ChargingStationTemplate): number {
const templateConnectors = stationTemplate?.Connectors;
if (!templateConnectors) {
}
public static workerPoolInUse(): boolean {
- return [WorkerProcessType.DYNAMIC_POOL, WorkerProcessType.STATIC_POOL].includes(
+ return [WorkerProcessType.dynamicPool, WorkerProcessType.staticPool].includes(
Configuration.getWorker().processType
);
}
public static workerDynamicPoolInUse(): boolean {
- return Configuration.getWorker().processType === WorkerProcessType.DYNAMIC_POOL;
+ return Configuration.getWorker().processType === WorkerProcessType.dynamicPool;
}
- public static warnDeprecatedTemplateKey(
- template: ChargingStationTemplate,
- key: string,
+ public static warnTemplateKeysDeprecation(
templateFile: string,
- logPrefix: string,
- logMsgToAppend = ''
- ): void {
- if (!Utils.isUndefined(template[key])) {
- logger.warn(
- `${logPrefix} Deprecated template key '${key}' usage in file '${templateFile}'${
- Utils.isNotEmptyString(logMsgToAppend) && `. ${logMsgToAppend}`
- }`
+ stationTemplate: ChargingStationTemplate,
+ logPrefix: string
+ ) {
+ const templateKeys: { key: string; deprecatedKey: string }[] = [
+ { key: 'supervisionUrls', deprecatedKey: 'supervisionUrl' },
+ { key: 'idTagsFile', deprecatedKey: 'authorizationFile' },
+ ];
+ for (const templateKey of templateKeys) {
+ ChargingStationUtils.warnDeprecatedTemplateKey(
+ stationTemplate,
+ templateKey.deprecatedKey,
+ templateFile,
+ logPrefix,
+ `Use '${templateKey.key}' instead`
+ );
+ ChargingStationUtils.convertDeprecatedTemplateKey(
+ stationTemplate,
+ templateKey.deprecatedKey,
+ templateKey.key
);
- }
- }
-
- public static convertDeprecatedTemplateKey(
- template: ChargingStationTemplate,
- deprecatedKey: string,
- key: string
- ): void {
- if (!Utils.isUndefined(template[deprecatedKey])) {
- template[key] = template[deprecatedKey] as unknown;
- delete template[deprecatedKey];
}
}
connectorId: number
): number | undefined {
let limit: number, matchingChargingProfile: ChargingProfile;
- let chargingProfiles: ChargingProfile[] = [];
// Get charging profiles for connector and sort by stack level
- chargingProfiles = chargingStation
- .getConnectorStatus(connectorId)
- ?.chargingProfiles?.sort((a, b) => b.stackLevel - a.stackLevel);
+ const chargingProfiles =
+ Utils.cloneObject(chargingStation.getConnectorStatus(connectorId)?.chargingProfiles)?.sort(
+ (a, b) => b.stackLevel - a.stackLevel
+ ) ?? [];
// Get profiles on connector 0
if (chargingStation.getConnectorStatus(0)?.chargingProfiles) {
chargingProfiles.push(
- ...chargingStation
- .getConnectorStatus(0)
- .chargingProfiles.sort((a, b) => b.stackLevel - a.stackLevel)
+ ...Utils.cloneObject(chargingStation.getConnectorStatus(0).chargingProfiles).sort(
+ (a, b) => b.stackLevel - a.stackLevel
+ )
);
}
if (Utils.isNotEmptyArray(chargingProfiles)) {
return defaultVoltageOut;
}
- public static getAuthorizationFile(stationInfo: ChargingStationInfo): string | undefined {
+ public static getIdTagsFile(stationInfo: ChargingStationInfo): string | undefined {
return (
- stationInfo.authorizationFile &&
+ stationInfo.idTagsFile &&
path.join(
path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'),
'assets',
- path.basename(stationInfo.authorizationFile)
+ path.basename(stationInfo.idTagsFile)
)
);
}
+ private static warnDeprecatedTemplateKey(
+ template: ChargingStationTemplate,
+ key: string,
+ templateFile: string,
+ logPrefix: string,
+ logMsgToAppend = ''
+ ): void {
+ if (!Utils.isUndefined(template[key])) {
+ const logMsg = `Deprecated template key '${key}' usage in file '${templateFile}'${
+ Utils.isNotEmptyString(logMsgToAppend) ? `. ${logMsgToAppend}` : ''
+ }`;
+ logger.warn(`${logPrefix} ${logMsg}`);
+ console.warn(chalk.yellow(`${logMsg}`));
+ }
+ }
+
+ private static convertDeprecatedTemplateKey(
+ template: ChargingStationTemplate,
+ deprecatedKey: string,
+ key: string
+ ): void {
+ if (!Utils.isUndefined(template[deprecatedKey])) {
+ template[key] = template[deprecatedKey] as unknown;
+ delete template[deprecatedKey];
+ }
+ }
+
/**
* Charging profiles should already be sorted by connectorId and stack level (highest stack level has priority)
*
matchingChargingProfile: ChargingProfile;
} | null {
const debugLogMsg = `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Matching charging profile found for power limitation: %j`;
+ const currentMoment = moment();
+ const currentDate = new Date();
for (const chargingProfile of chargingProfiles) {
// Set helpers
- const currentMoment = moment();
const chargingSchedule = chargingProfile.chargingSchedule;
+ if (!chargingSchedule?.startSchedule) {
+ logger.warn(
+ `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: startSchedule is not defined in charging profile id ${chargingProfile.chargingProfileId}`
+ );
+ }
// Check type (recurring) and if it is already active
// Adjust the daily recurring schedule to today
if (
chargingProfile.recurrencyKind === RecurrencyKindType.DAILY &&
currentMoment.isAfter(chargingSchedule.startSchedule)
) {
- const currentDate = new Date();
- chargingSchedule.startSchedule = new Date(chargingSchedule.startSchedule);
+ if (!(chargingSchedule?.startSchedule instanceof Date)) {
+ logger.warn(
+ `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: startSchedule is not a Date object in charging profile id ${chargingProfile.chargingProfileId}. Trying to convert it to a Date object`
+ );
+ chargingSchedule.startSchedule = new Date(chargingSchedule.startSchedule);
+ }
chargingSchedule.startSchedule.setFullYear(
currentDate.getFullYear(),
currentDate.getMonth(),