-import { ChargingProfile, ChargingSchedulePeriod } from '../types/ocpp/ChargingProfile';
-import { ChargingProfileKindType, RecurrencyKindType } from '../types/ocpp/1.6/ChargingProfile';
+import crypto from 'crypto';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+import moment from 'moment';
+
+import BaseError from '../exception/BaseError';
+import type ChargingStationInfo from '../types/ChargingStationInfo';
import ChargingStationTemplate, {
AmpereUnits,
CurrentType,
Voltage,
} from '../types/ChargingStationTemplate';
+import type { SampledValueTemplate } from '../types/MeasurandPerPhaseSampledValueTemplates';
+import { ChargingProfileKindType, RecurrencyKindType } from '../types/ocpp/1.6/ChargingProfile';
+import type { ChargingProfile, ChargingSchedulePeriod } from '../types/ocpp/ChargingProfile';
+import { StandardParametersKey } from '../types/ocpp/Configuration';
import { MeterValueMeasurand, MeterValuePhase } from '../types/ocpp/MeterValues';
-
-import BaseError from '../exception/BaseError';
-import { BootNotificationRequest } from '../types/ocpp/Requests';
-import ChargingStation from './ChargingStation';
-import { ChargingStationConfigurationUtils } from './ChargingStationConfigurationUtils';
-import ChargingStationInfo from '../types/ChargingStationInfo';
+import {
+ BootNotificationRequest,
+ IncomingRequestCommand,
+ RequestCommand,
+} from '../types/ocpp/Requests';
+import { WorkerProcessType } from '../types/Worker';
import Configuration from '../utils/Configuration';
import Constants from '../utils/Constants';
-import { SampledValueTemplate } from '../types/MeasurandPerPhaseSampledValueTemplates';
-import { StandardParametersKey } from '../types/ocpp/Configuration';
-import Utils from '../utils/Utils';
-import { WebSocketCloseEventStatusString } from '../types/WebSocket';
-import { WorkerProcessType } from '../types/Worker';
-import crypto from 'crypto';
-import { fileURLToPath } from 'url';
import logger from '../utils/Logger';
-import moment from 'moment';
-import path from 'path';
+import Utils from '../utils/Utils';
+import type ChargingStation from './ChargingStation';
+import { ChargingStationConfigurationUtils } from './ChargingStationConfigurationUtils';
+
+const moduleName = 'ChargingStationUtils';
export class ChargingStationUtils {
+ private constructor() {
+ // This is intentional
+ }
+
public static getChargingStationId(
index: number,
stationTemplate: ChargingStationTemplate
public static workerPoolInUse(): boolean {
return [WorkerProcessType.DYNAMIC_POOL, WorkerProcessType.STATIC_POOL].includes(
- Configuration.getWorkerProcess()
+ Configuration.getWorker().processType
);
}
public static workerDynamicPoolInUse(): boolean {
- return Configuration.getWorkerProcess() === WorkerProcessType.DYNAMIC_POOL;
- }
-
- /**
- * Convert websocket error code to human readable string message
- *
- * @param code websocket error code
- * @returns human readable string message
- */
- public static getWebSocketCloseEventStatusString(code: number): string {
- if (code >= 0 && code <= 999) {
- return '(Unused)';
- } else if (code >= 1016) {
- if (code <= 1999) {
- return '(For WebSocket standard)';
- } else if (code <= 2999) {
- return '(For WebSocket extensions)';
- } else if (code <= 3999) {
- return '(For libraries and frameworks)';
- } else if (code <= 4999) {
- return '(For applications)';
- }
- }
- if (!Utils.isUndefined(WebSocketCloseEventStatusString[code])) {
- return WebSocketCloseEventStatusString[code] as string;
- }
- return '(Unknown)';
+ return Configuration.getWorker().processType === WorkerProcessType.DYNAMIC_POOL;
}
public static warnDeprecatedTemplateKey(
delete stationTemplate.chargeBoxSerialNumberPrefix;
delete stationTemplate.chargePointSerialNumberPrefix;
delete stationTemplate.meterSerialNumberPrefix;
- return stationTemplate;
+ return stationTemplate as unknown as ChargingStationInfo;
}
public static createStationInfoHash(stationInfo: ChargingStationInfo): void {
limit: number;
matchingChargingProfile: ChargingProfile;
} | null {
+ const debugLogMsg = `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Matching charging profile found for power limitation: %j`;
for (const chargingProfile of chargingProfiles) {
// Set helpers
const currentMoment = moment();
limit: schedulePeriod.limit,
matchingChargingProfile: chargingProfile,
};
- logger.debug(
- `${logPrefix} Matching charging profile found for power limitation: %j`,
- result
- );
+ logger.debug(debugLogMsg, result);
return result;
}
// Find the right schedule period
limit: lastButOneSchedule.limit,
matchingChargingProfile: chargingProfile,
};
- logger.debug(
- `${logPrefix} Matching charging profile found for power limitation: %j`,
- result
- );
+ logger.debug(debugLogMsg, result);
return result;
}
// Keep it
limit: lastButOneSchedule.limit,
matchingChargingProfile: chargingProfile,
};
- logger.debug(
- `${logPrefix} Matching charging profile found for power limitation: %j`,
- result
- );
+ logger.debug(debugLogMsg, result);
return result;
}
}
templateFile: string,
logPrefix: string
): Voltage {
- const errMsg = `${logPrefix} Unknown ${currentType} currentOutType in template file ${templateFile}, cannot define default voltage out`;
+ const errMsg = `Unknown ${currentType} currentOutType in template file ${templateFile}, cannot define default voltage out`;
let defaultVoltageOut: number;
switch (currentType) {
case CurrentType.AC:
defaultVoltageOut = Voltage.VOLTAGE_400;
break;
default:
- logger.error(errMsg);
- throw new Error(errMsg);
+ logger.error(`${logPrefix} ${errMsg}`);
+ throw new BaseError(errMsg);
}
return defaultVoltageOut;
}
}
}
if (measurand === MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER) {
- const errorMsg = `${chargingStation.logPrefix()} Missing MeterValues for default measurand '${measurand}' in template on connectorId ${connectorId}`;
- logger.error(errorMsg);
- throw new Error(errorMsg);
+ const errorMsg = `Missing MeterValues for default measurand '${measurand}' in template on connectorId ${connectorId}`;
+ logger.error(`${chargingStation.logPrefix()} ${errorMsg}`);
+ throw new BaseError(errorMsg);
}
logger.debug(
`${chargingStation.logPrefix()} No MeterValues for measurand '${measurand}' ${onPhaseStr}in template on connectorId ${connectorId}`
);
}
+ public static isRequestCommandSupported(
+ command: RequestCommand,
+ chargingStation: ChargingStation
+ ): boolean {
+ const isRequestCommand = Object.values(RequestCommand).includes(command);
+ if (isRequestCommand && !chargingStation.stationInfo?.commandsSupport?.outgoingCommands) {
+ return true;
+ } else if (isRequestCommand && chargingStation.stationInfo?.commandsSupport?.outgoingCommands) {
+ return chargingStation.stationInfo?.commandsSupport?.outgoingCommands[command] ?? false;
+ }
+ logger.error(`${chargingStation.logPrefix()} Unknown outgoing OCPP command '${command}'`);
+ return false;
+ }
+
+ public static isIncomingRequestCommandSupported(
+ command: IncomingRequestCommand,
+ chargingStation: ChargingStation
+ ): boolean {
+ const isIncomingRequestCommand = Object.values(IncomingRequestCommand).includes(command);
+ if (
+ isIncomingRequestCommand &&
+ !chargingStation.stationInfo?.commandsSupport?.incomingCommands
+ ) {
+ return true;
+ } else if (
+ isIncomingRequestCommand &&
+ chargingStation.stationInfo?.commandsSupport?.incomingCommands
+ ) {
+ return chargingStation.stationInfo?.commandsSupport?.incomingCommands[command] ?? false;
+ }
+ logger.error(`${chargingStation.logPrefix()} Unknown incoming OCPP command '${command}'`);
+ return false;
+ }
+
private static getRandomSerialNumberSuffix(params?: {
randomBytesLength?: number;
upperCase?: boolean;