X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcharging-station%2Focpp%2FOCPPServiceUtils.ts;h=d9d712981c816790cb4e2b6f1c09fa6cd10e7dac;hb=ee7c1da0e12c70134f31537a1c1e7040d309af5a;hp=7c459809f45f2df877fcb69a2db54953c5e4a8a6;hpb=5adf6ca45d6644c0969ca1d60ac1b9dc0b7810f6;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ocpp/OCPPServiceUtils.ts b/src/charging-station/ocpp/OCPPServiceUtils.ts index 7c459809..d9d71298 100644 --- a/src/charging-station/ocpp/OCPPServiceUtils.ts +++ b/src/charging-station/ocpp/OCPPServiceUtils.ts @@ -15,6 +15,7 @@ import { type AuthorizeRequest, type AuthorizeResponse, ChargePointErrorCode, + ChargingStationEvents, type ConnectorStatus, type ConnectorStatusEnum, ErrorType, @@ -40,6 +41,7 @@ import { isNotEmptyString, logPrefix, logger, + max, min, } from '../../utils'; @@ -48,17 +50,19 @@ export class OCPPServiceUtils { // This is intentional } - public static ajvErrorsToErrorType(errors: ErrorObject[]): ErrorType { - for (const error of errors as DefinedError[]) { - switch (error.keyword) { - case 'type': - return ErrorType.TYPE_CONSTRAINT_VIOLATION; - case 'dependencies': - case 'required': - return ErrorType.OCCURRENCE_CONSTRAINT_VIOLATION; - case 'pattern': - case 'format': - return ErrorType.PROPERTY_CONSTRAINT_VIOLATION; + public static ajvErrorsToErrorType(errors: ErrorObject[] | null | undefined): ErrorType { + if (isNotEmptyArray(errors) === true) { + for (const error of errors as DefinedError[]) { + switch (error.keyword) { + case 'type': + return ErrorType.TYPE_CONSTRAINT_VIOLATION; + case 'dependencies': + case 'required': + return ErrorType.OCCURRENCE_CONSTRAINT_VIOLATION; + case 'pattern': + case 'format': + return ErrorType.PROPERTY_CONSTRAINT_VIOLATION; + } } } return ErrorType.FORMAT_VIOLATION; @@ -171,7 +175,7 @@ export class OCPPServiceUtils { status: ConnectorStatusEnum, evseId?: number, ): StatusNotificationRequest { - switch (chargingStation.stationInfo.ocppVersion ?? OCPPVersion.VERSION_16) { + switch (chargingStation.stationInfo?.ocppVersion) { case OCPPVersion.VERSION_16: return { connectorId, @@ -224,6 +228,10 @@ export class OCPPServiceUtils { ); } chargingStation.getConnectorStatus(connectorId)!.status = status; + chargingStation.emit(ChargingStationEvents.connectorStatusChanged, { + connectorId, + ...chargingStation.getConnectorStatus(connectorId), + }); } public static async isIdTagAuthorized( @@ -231,7 +239,10 @@ export class OCPPServiceUtils { connectorId: number, idTag: string, ): Promise { - if (!chargingStation.getLocalAuthListEnabled() && !chargingStation.getRemoteAuthorization()) { + if ( + !chargingStation.getLocalAuthListEnabled() && + !chargingStation.stationInfo?.remoteAuthorization + ) { logger.warn( `${chargingStation.logPrefix()} The charging station expects to authorize RFID tags but nor local authorization nor remote authorization are enabled. Misbehavior may occur`, ); @@ -244,7 +255,7 @@ export class OCPPServiceUtils { connectorStatus.localAuthorizeIdTag = idTag; connectorStatus.idTagLocalAuthorized = true; return true; - } else if (chargingStation.getRemoteAuthorization()) { + } else if (chargingStation.stationInfo?.remoteAuthorization) { return await OCPPServiceUtils.isIdTagRemoteAuthorized(chargingStation, connectorId, idTag); } return false; @@ -257,7 +268,7 @@ export class OCPPServiceUtils { ): boolean { const fromStatus = chargingStation.getConnectorStatus(connectorId)!.status; let transitionAllowed = false; - switch (chargingStation.stationInfo.ocppVersion) { + switch (chargingStation.stationInfo?.ocppVersion) { case OCPPVersion.VERSION_16: if ( (connectorId === 0 && @@ -290,14 +301,13 @@ export class OCPPServiceUtils { default: throw new BaseError( // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - `Cannot check connector status transition: OCPP version ${chargingStation.stationInfo.ocppVersion} not supported`, + `Cannot check connector status transition: OCPP version ${chargingStation.stationInfo?.ocppVersion} not supported`, ); } if (transitionAllowed === false) { logger.warn( - `${chargingStation.logPrefix()} OCPP ${ - chargingStation.stationInfo.ocppVersion - } connector id ${connectorId} status transition from '${ + `${chargingStation.logPrefix()} OCPP ${chargingStation.stationInfo + ?.ocppVersion} connector id ${connectorId} status transition from '${ chargingStation.getConnectorStatus(connectorId)!.status }' to '${status}' is not allowed`, ); @@ -408,22 +418,27 @@ export class OCPPServiceUtils { } protected static getLimitFromSampledValueTemplateCustomValue( - value: string, - limit: number, - options?: { limitationEnabled?: boolean; unitMultiplier?: number }, + value: string | undefined, + maxLimit: number, + minLimit: number, + options?: { limitationEnabled?: boolean; fallbackValue?: number; unitMultiplier?: number }, ): number { options = { ...{ - limitationEnabled: true, + limitationEnabled: false, unitMultiplier: 1, + fallbackValue: 0, }, ...options, }; - const parsedInt = parseInt(value); - const numberValue = isNaN(parsedInt) ? Infinity : parsedInt; - return options?.limitationEnabled - ? min(numberValue * options.unitMultiplier!, limit) - : numberValue * options.unitMultiplier!; + const parsedValue = parseInt(value ?? ''); + if (options?.limitationEnabled) { + return max( + min((!isNaN(parsedValue) ? parsedValue : Infinity) * options.unitMultiplier!, maxLimit), + minLimit, + ); + } + return (!isNaN(parsedValue) ? parsedValue : options.fallbackValue!) * options.unitMultiplier!; } private static isIdTagLocalAuthorized(chargingStation: ChargingStation, idTag: string): boolean {