X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Focpp%2FOCPPServiceUtils.ts;h=c5387f33f9c693f41ff21f1b20d9f40d7c5cd514;hb=c3da35d496cbb2c78e85fb3d2e125ffd6fd297f4;hp=ea3dfe7ecd0d79efa02049a571a1c0dfcd6f2f59;hpb=48b750721134de072049b7d2d7ea94e69428721f;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ocpp/OCPPServiceUtils.ts b/src/charging-station/ocpp/OCPPServiceUtils.ts index ea3dfe7e..c5387f33 100644 --- a/src/charging-station/ocpp/OCPPServiceUtils.ts +++ b/src/charging-station/ocpp/OCPPServiceUtils.ts @@ -1,8 +1,12 @@ import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; import type { DefinedError, ErrorObject, JSONSchemaType } from 'ajv'; -import { OCPP16Constants, OCPP20Constants } from './internal'; +import { OCPP16Constants } from './1.6/OCPP16Constants'; +import { OCPP20Constants } from './2.0/OCPP20Constants'; +import { OCPPConstants } from './OCPPConstants'; import { type ChargingStation, ChargingStationConfigurationUtils } from '../../charging-station'; import { BaseError } from '../../exception'; import { @@ -26,7 +30,7 @@ import { type StatusNotificationRequest, type StatusNotificationResponse, } from '../../types'; -import { Constants, FileUtils, Utils, logger } from '../../utils'; +import { Constants, ErrorUtils, Utils, logger } from '../../utils'; export class OCPPServiceUtils { protected constructor() { @@ -126,7 +130,7 @@ export class OCPPServiceUtils { ): boolean { if (connectorId < 0) { logger.error( - `${chargingStation.logPrefix()} ${ocppCommand} incoming request received with invalid connector Id ${connectorId}` + `${chargingStation.logPrefix()} ${ocppCommand} incoming request received with invalid connector id ${connectorId}` ); return false; } @@ -146,7 +150,8 @@ export class OCPPServiceUtils { public static buildStatusNotificationRequest( chargingStation: ChargingStation, connectorId: number, - status: ConnectorStatusEnum + status: ConnectorStatusEnum, + evseId?: number ): StatusNotificationRequest { switch (chargingStation.stationInfo.ocppVersion ?? OCPPVersion.VERSION_16) { case OCPPVersion.VERSION_16: @@ -161,7 +166,7 @@ export class OCPPServiceUtils { timestamp: new Date(), connectorStatus: status, connectorId, - evseId: connectorId, + evseId, } as OCPP20StatusNotificationRequest; default: throw new BaseError('Cannot build status notification payload: OCPP version not supported'); @@ -179,7 +184,8 @@ export class OCPPServiceUtils { public static async sendAndSetConnectorStatus( chargingStation: ChargingStation, connectorId: number, - status: ConnectorStatusEnum + status: ConnectorStatusEnum, + evseId?: number ) { OCPPServiceUtils.checkConnectorStatusTransition(chargingStation, connectorId, status); await chargingStation.ocppRequestService.requestHandler< @@ -188,7 +194,7 @@ export class OCPPServiceUtils { >( chargingStation, RequestCommand.STATUS_NOTIFICATION, - OCPPServiceUtils.buildStatusNotificationRequest(chargingStation, connectorId, status) + OCPPServiceUtils.buildStatusNotificationRequest(chargingStation, connectorId, status, evseId) ); chargingStation.getConnectorStatus(connectorId).status = status; } @@ -203,16 +209,14 @@ export class OCPPServiceUtils { switch (chargingStation.stationInfo.ocppVersion) { case OCPPVersion.VERSION_16: if ( - connectorId === 0 && - OCPP16Constants.ChargePointStatusChargingStationTransitions.findIndex( - (transition) => transition.from === fromStatus && transition.to === status - ) !== -1 - ) { - transitionAllowed = true; - } else if ( - OCPP16Constants.ChargePointStatusConnectorTransitions.findIndex( - (transition) => transition.from === fromStatus && transition.to === status - ) !== -1 + (connectorId === 0 && + OCPP16Constants.ChargePointStatusChargingStationTransitions.findIndex( + (transition) => transition.from === fromStatus && transition.to === status + ) !== -1) || + (connectorId > 0 && + OCPP16Constants.ChargePointStatusConnectorTransitions.findIndex( + (transition) => transition.from === fromStatus && transition.to === status + ) !== -1) ) { transitionAllowed = true; } @@ -220,16 +224,14 @@ export class OCPPServiceUtils { case OCPPVersion.VERSION_20: case OCPPVersion.VERSION_201: if ( - connectorId === 0 && - OCPP20Constants.ChargingStationStatusTransitions.findIndex( - (transition) => transition.from === fromStatus && transition.to === status - ) !== -1 - ) { - transitionAllowed = true; - } else if ( - OCPP20Constants.ConnectorStatusTransitions.findIndex( - (transition) => transition.from === fromStatus && transition.to === status - ) !== -1 + (connectorId === 0 && + OCPP20Constants.ChargingStationStatusTransitions.findIndex( + (transition) => transition.from === fromStatus && transition.to === status + ) !== -1) || + (connectorId > 0 && + OCPP20Constants.ConnectorStatusTransitions.findIndex( + (transition) => transition.from === fromStatus && transition.to === status + ) !== -1) ) { transitionAllowed = true; } @@ -244,7 +246,7 @@ export class OCPPServiceUtils { logger.warn( `${chargingStation.logPrefix()} OCPP ${ chargingStation.stationInfo.ocppVersion - } connector ${connectorId} status transition from '${ + } connector id ${connectorId} status transition from '${ chargingStation.getConnectorStatus(connectorId).status }' to '${status}' is not allowed` ); @@ -253,15 +255,16 @@ export class OCPPServiceUtils { } protected static parseJsonSchemaFile( - filePath: string, + relativePath: string, ocppVersion: OCPPVersion, moduleName?: string, methodName?: string ): JSONSchemaType { + const filePath = path.join(path.dirname(fileURLToPath(import.meta.url)), relativePath); try { return JSON.parse(fs.readFileSync(filePath, 'utf8')) as JSONSchemaType; } catch (error) { - FileUtils.handleFileException( + ErrorUtils.handleFileException( filePath, FileType.JsonSchema, error as NodeJS.ErrnoException, @@ -278,9 +281,9 @@ export class OCPPServiceUtils { phase?: MeterValuePhase ): SampledValueTemplate | undefined { const onPhaseStr = phase ? `on phase ${phase} ` : ''; - if (Constants.SUPPORTED_MEASURANDS.includes(measurand) === false) { + if (OCPPConstants.OCPP_MEASURANDS_SUPPORTED.includes(measurand) === false) { logger.warn( - `${chargingStation.logPrefix()} Trying to get unsupported MeterValues measurand '${measurand}' ${onPhaseStr}in template on connectorId ${connectorId}` + `${chargingStation.logPrefix()} Trying to get unsupported MeterValues measurand '${measurand}' ${onPhaseStr}in template on connector id ${connectorId}` ); return; } @@ -292,7 +295,7 @@ export class OCPPServiceUtils { )?.value?.includes(measurand) === false ) { logger.debug( - `${chargingStation.logPrefix()} Trying to get MeterValues measurand '${measurand}' ${onPhaseStr}in template on connectorId ${connectorId} not found in '${ + `${chargingStation.logPrefix()} Trying to get MeterValues measurand '${measurand}' ${onPhaseStr}in template on connector id ${connectorId} not found in '${ StandardParametersKey.MeterValuesSampledData }' OCPP parameter` ); @@ -306,13 +309,13 @@ export class OCPPServiceUtils { index++ ) { if ( - Constants.SUPPORTED_MEASURANDS.includes( + OCPPConstants.OCPP_MEASURANDS_SUPPORTED.includes( sampledValueTemplates[index]?.measurand ?? MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER ) === false ) { logger.warn( - `${chargingStation.logPrefix()} Unsupported MeterValues measurand '${measurand}' ${onPhaseStr}in template on connectorId ${connectorId}` + `${chargingStation.logPrefix()} Unsupported MeterValues measurand '${measurand}' ${onPhaseStr}in template on connector id ${connectorId}` ); } else if ( phase && @@ -343,12 +346,12 @@ export class OCPPServiceUtils { } } if (measurand === MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER) { - const errorMsg = `Missing MeterValues for default measurand '${measurand}' in template on connectorId ${connectorId}`; + const errorMsg = `Missing MeterValues for default measurand '${measurand}' in template on connector id ${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}` + `${chargingStation.logPrefix()} No MeterValues for measurand '${measurand}' ${onPhaseStr}in template on connector id ${connectorId}` ); }