+ public static isMessageTriggerSupported(
+ chargingStation: ChargingStation,
+ messageTrigger: MessageTrigger
+ ): boolean {
+ const isMessageTrigger = Object.values(MessageTrigger).includes(messageTrigger);
+ if (isMessageTrigger === true && !chargingStation.stationInfo?.messageTriggerSupport) {
+ return true;
+ } else if (isMessageTrigger === true && chargingStation.stationInfo?.messageTriggerSupport) {
+ return chargingStation.stationInfo?.messageTriggerSupport[messageTrigger] ?? false;
+ }
+ logger.error(
+ `${chargingStation.logPrefix()} Unknown incoming OCPP message trigger '${messageTrigger}'`
+ );
+ return false;
+ }
+
+ public static isConnectorIdValid(
+ chargingStation: ChargingStation,
+ ocppCommand: IncomingRequestCommand,
+ connectorId: number
+ ): boolean {
+ if (connectorId < 0) {
+ logger.error(
+ `${chargingStation.logPrefix()} ${ocppCommand} incoming request received with invalid connector Id ${connectorId}`
+ );
+ return false;
+ }
+ return true;
+ }
+
+ public static convertDateToISOString<T extends JsonType>(obj: T): void {
+ for (const key in obj) {
+ if (obj[key] instanceof Date) {
+ (obj as JsonObject)[key] = (obj[key] as Date).toISOString();
+ } else if (obj[key] !== null && typeof obj[key] === 'object') {
+ this.convertDateToISOString<T>(obj[key] as T);
+ }
+ }
+ }
+
+ public static buildStatusNotificationRequest(
+ chargingStation: ChargingStation,
+ connectorId: number,
+ status: ConnectorStatusEnum
+ ): StatusNotificationRequest {
+ switch (chargingStation.stationInfo.ocppVersion ?? OCPPVersion.VERSION_16) {
+ case OCPPVersion.VERSION_16:
+ return {
+ connectorId,
+ status,
+ errorCode: ChargePointErrorCode.NO_ERROR,
+ } as OCPP16StatusNotificationRequest;
+ case OCPPVersion.VERSION_20:
+ case OCPPVersion.VERSION_201:
+ return {
+ timestamp: new Date(),
+ connectorStatus: status,
+ connectorId,
+ evseId: connectorId,
+ } as OCPP20StatusNotificationRequest;
+ default:
+ throw new BaseError('Cannot build status notification payload: OCPP version not supported');
+ }
+ }
+
+ protected static parseJsonSchemaFile<T extends JsonType>(
+ filePath: string,
+ ocppVersion: OCPPVersion
+ ): JSONSchemaType<T> {
+ try {
+ return JSON.parse(fs.readFileSync(filePath, 'utf8')) as JSONSchemaType<T>;
+ } catch (error) {
+ FileUtils.handleFileException(
+ filePath,
+ FileType.JsonSchema,
+ error as NodeJS.ErrnoException,
+ OCPPServiceUtils.logPrefix(ocppVersion),
+ { throwError: false }
+ );
+ }
+ }
+