X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Focpp%2FOCPPServiceUtils.ts;h=8a42bf67a7b05f361374a1d04bf996ab5d6b304f;hb=c1fd615b55df8e46c87d9c184987b29fa2905213;hp=bd228564d9649ce2eddd153dab9aba1903704125;hpb=cc6845fc431ddf5cd37d70b750abae3c313a3589;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ocpp/OCPPServiceUtils.ts b/src/charging-station/ocpp/OCPPServiceUtils.ts index bd228564..8a42bf67 100644 --- a/src/charging-station/ocpp/OCPPServiceUtils.ts +++ b/src/charging-station/ocpp/OCPPServiceUtils.ts @@ -1,3 +1,4 @@ +import { randomInt } from 'node:crypto' import { readFileSync } from 'node:fs' import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' @@ -5,9 +6,6 @@ import { fileURLToPath } from 'node:url' import type { DefinedError, ErrorObject, JSONSchemaType } from 'ajv' import { isDate } from 'date-fns' -import { OCPP16Constants } from './1.6/OCPP16Constants.js' -import { OCPP20Constants } from './2.0/OCPP20Constants.js' -import { OCPPConstants } from './OCPPConstants.js' import { type ChargingStation, getConfigurationKey, @@ -20,7 +18,6 @@ import { type AuthorizeResponse, ChargePointErrorCode, ChargingStationEvents, - type ConnectorStatus, type ConnectorStatusEnum, CurrentType, ErrorType, @@ -52,23 +49,25 @@ import { import { ACElectricUtils, Constants, - DCElectricUtils, convertToFloat, convertToInt, + DCElectricUtils, getRandomFloatFluctuatedRounded, getRandomFloatRounded, - getRandomInteger, handleFileException, isNotEmptyArray, isNotEmptyString, - logPrefix, logger, + logPrefix, max, min, roundTo } from '../../utils/index.js' +import { OCPP16Constants } from './1.6/OCPP16Constants.js' +import { OCPP20Constants } from './2.0/OCPP20Constants.js' +import { OCPPConstants } from './OCPPConstants.js' -export const getMessageTypeString = (messageType: MessageType): string => { +export const getMessageTypeString = (messageType: MessageType | undefined): string => { switch (messageType) { case MessageType.CALL_MESSAGE: return 'request' @@ -81,7 +80,7 @@ export const getMessageTypeString = (messageType: MessageType): string => { } } -export const buildStatusNotificationRequest = ( +const buildStatusNotificationRequest = ( chargingStation: ChargingStation, connectorId: number, status: ConnectorStatusEnum, @@ -121,9 +120,12 @@ export const isIdTagAuthorized = async ( `${chargingStation.logPrefix()} The charging station expects to authorize RFID tags but nor local authorization nor remote authorization are enabled. Misbehavior may occur` ) } - if (chargingStation.getLocalAuthListEnabled() && isIdTagLocalAuthorized(chargingStation, idTag)) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const connectorStatus: ConnectorStatus = chargingStation.getConnectorStatus(connectorId)! + const connectorStatus = chargingStation.getConnectorStatus(connectorId) + if ( + connectorStatus != null && + chargingStation.getLocalAuthListEnabled() && + isIdTagLocalAuthorized(chargingStation, idTag) + ) { connectorStatus.localAuthorizeIdTag = idTag connectorStatus.idTagLocalAuthorized = true return true @@ -139,8 +141,8 @@ const isIdTagLocalAuthorized = (chargingStation: ChargingStation, idTag: string) isNotEmptyString( chargingStation.idTagsCache // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - .getIdTags(getIdTagsFile(chargingStation.stationInfo)!) - ?.find((tag) => tag === idTag) + .getIdTags(getIdTagsFile(chargingStation.stationInfo!)!) + ?.find(tag => tag === idTag) ) ) } @@ -161,7 +163,7 @@ const isIdTagRemoteAuthorized = async ( idTag } ) - )?.idTagInfo?.status === AuthorizationStatus.ACCEPTED + ).idTagInfo.status === AuthorizationStatus.ACCEPTED ) } @@ -197,19 +199,18 @@ const checkConnectorStatusTransition = ( connectorId: number, status: ConnectorStatusEnum ): boolean => { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const fromStatus = chargingStation.getConnectorStatus(connectorId)!.status + const fromStatus = chargingStation.getConnectorStatus(connectorId)?.status let transitionAllowed = false switch (chargingStation.stationInfo?.ocppVersion) { case OCPPVersion.VERSION_16: if ( (connectorId === 0 && OCPP16Constants.ChargePointStatusChargingStationTransitions.findIndex( - (transition) => transition.from === fromStatus && transition.to === status + transition => transition.from === fromStatus && transition.to === status ) !== -1) || (connectorId > 0 && OCPP16Constants.ChargePointStatusConnectorTransitions.findIndex( - (transition) => transition.from === fromStatus && transition.to === status + transition => transition.from === fromStatus && transition.to === status ) !== -1) ) { transitionAllowed = true @@ -220,11 +221,11 @@ const checkConnectorStatusTransition = ( if ( (connectorId === 0 && OCPP20Constants.ChargingStationStatusTransitions.findIndex( - (transition) => transition.from === fromStatus && transition.to === status + transition => transition.from === fromStatus && transition.to === status ) !== -1) || (connectorId > 0 && OCPP20Constants.ConnectorStatusTransitions.findIndex( - (transition) => transition.from === fromStatus && transition.to === status + transition => transition.from === fromStatus && transition.to === status ) !== -1) ) { transitionAllowed = true @@ -237,10 +238,10 @@ const checkConnectorStatusTransition = ( } if (!transitionAllowed) { logger.warn( - `${chargingStation.logPrefix()} OCPP ${chargingStation.stationInfo - ?.ocppVersion} connector id ${connectorId} status transition from '${ - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - chargingStation.getConnectorStatus(connectorId)!.status + `${chargingStation.logPrefix()} OCPP ${ + chargingStation.stationInfo.ocppVersion + } connector id ${connectorId} status transition from '${ + chargingStation.getConnectorStatus(connectorId)?.status }' to '${status}' is not allowed` ) } @@ -283,7 +284,7 @@ export const buildMeterValue = ( parseInt(socSampledValueTemplate.value), socSampledValueTemplate.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT ) - : getRandomInteger(socMaximumValue, socMinimumValue) + : randomInt(socMinimumValue, socMaximumValue) meterValue.sampledValue.push( buildSampledValue(socSampledValueTemplate, socSampledValueTemplateValue) ) @@ -323,7 +324,7 @@ export const buildMeterValue = ( if ( chargingStation.getNumberOfPhases() !== 3 || (chargingStation.getNumberOfPhases() === 3 && - chargingStation.stationInfo?.mainVoltageMeterValues === true) + chargingStation.stationInfo.mainVoltageMeterValues === true) ) { meterValue.sampledValue.push( buildSampledValue(voltageSampledValueTemplate, voltageMeasurandValue) @@ -365,7 +366,7 @@ export const buildMeterValue = ( phaseLineToNeutralValue as MeterValuePhase ) ) - if (chargingStation.stationInfo?.phaseLineToLineVoltageMeterValues === true) { + if (chargingStation.stationInfo.phaseLineToLineVoltageMeterValues === true) { const phaseLineToLineValue = `L${phase}-L${ (phase + 1) % chargingStation.getNumberOfPhases() !== 0 ? (phase + 1) % chargingStation.getNumberOfPhases() @@ -442,18 +443,17 @@ export const buildMeterValue = ( } } if (powerSampledValueTemplate != null) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - checkMeasurandPowerDivider(chargingStation, powerSampledValueTemplate.measurand!) + checkMeasurandPowerDivider(chargingStation, powerSampledValueTemplate.measurand) const errMsg = `MeterValues measurand ${ powerSampledValueTemplate.measurand ?? MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER - }: Unknown ${chargingStation.stationInfo?.currentOutType} currentOutType in template file ${ + }: Unknown ${chargingStation.stationInfo.currentOutType} currentOutType in template file ${ chargingStation.templateFile }, cannot calculate ${ powerSampledValueTemplate.measurand ?? MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER } measurand value` // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const powerMeasurandValues: MeasurandValues = {} as MeasurandValues - const unitDivider = powerSampledValueTemplate?.unit === MeterValueUnit.KILO_WATT ? 1000 : 1 + const unitDivider = powerSampledValueTemplate.unit === MeterValueUnit.KILO_WATT ? 1000 : 1 const connectorMaximumAvailablePower = chargingStation.getConnectorMaximumAvailablePower(connectorId) const connectorMaximumPower = Math.round(connectorMaximumAvailablePower) @@ -464,7 +464,7 @@ export const buildMeterValue = ( const connectorMinimumPowerPerPhase = Math.round( connectorMinimumPower / chargingStation.getNumberOfPhases() ) - switch (chargingStation.stationInfo?.currentOutType) { + switch (chargingStation.stationInfo.currentOutType) { case CurrentType.AC: if (chargingStation.getNumberOfPhases() === 3) { const defaultFluctuatedPowerPerPhase = isNotEmptyString( @@ -477,7 +477,7 @@ export const buildMeterValue = ( connectorMinimumPower / unitDivider, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumPower / unitDivider } ) / chargingStation.getNumberOfPhases(), @@ -490,16 +490,16 @@ export const buildMeterValue = ( ) ? getRandomFloatFluctuatedRounded( getLimitFromSampledValueTemplateCustomValue( - powerPerPhaseSampledValueTemplates.L1?.value, + powerPerPhaseSampledValueTemplates.L1.value, connectorMaximumPowerPerPhase / unitDivider, connectorMinimumPowerPerPhase / unitDivider, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumPowerPerPhase / unitDivider } ), - powerPerPhaseSampledValueTemplates.L1?.fluctuationPercent ?? + powerPerPhaseSampledValueTemplates.L1.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT ) : undefined @@ -508,16 +508,16 @@ export const buildMeterValue = ( ) ? getRandomFloatFluctuatedRounded( getLimitFromSampledValueTemplateCustomValue( - powerPerPhaseSampledValueTemplates.L2?.value, + powerPerPhaseSampledValueTemplates.L2.value, connectorMaximumPowerPerPhase / unitDivider, connectorMinimumPowerPerPhase / unitDivider, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumPowerPerPhase / unitDivider } ), - powerPerPhaseSampledValueTemplates.L2?.fluctuationPercent ?? + powerPerPhaseSampledValueTemplates.L2.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT ) : undefined @@ -526,16 +526,16 @@ export const buildMeterValue = ( ) ? getRandomFloatFluctuatedRounded( getLimitFromSampledValueTemplateCustomValue( - powerPerPhaseSampledValueTemplates.L3?.value, + powerPerPhaseSampledValueTemplates.L3.value, connectorMaximumPowerPerPhase / unitDivider, connectorMinimumPowerPerPhase / unitDivider, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumPowerPerPhase / unitDivider } ), - powerPerPhaseSampledValueTemplates.L3?.fluctuationPercent ?? + powerPerPhaseSampledValueTemplates.L3.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT ) : undefined @@ -569,7 +569,7 @@ export const buildMeterValue = ( connectorMinimumPower / unitDivider, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumPower / unitDivider } ), @@ -597,7 +597,7 @@ export const buildMeterValue = ( connectorMinimumPower / unitDivider, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumPower / unitDivider } ), @@ -710,10 +710,10 @@ export const buildMeterValue = ( } if (currentSampledValueTemplate != null) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - checkMeasurandPowerDivider(chargingStation, currentSampledValueTemplate.measurand!) + checkMeasurandPowerDivider(chargingStation, currentSampledValueTemplate.measurand) const errMsg = `MeterValues measurand ${ currentSampledValueTemplate.measurand ?? MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER - }: Unknown ${chargingStation.stationInfo?.currentOutType} currentOutType in template file ${ + }: Unknown ${chargingStation.stationInfo.currentOutType} currentOutType in template file ${ chargingStation.templateFile }, cannot calculate ${ currentSampledValueTemplate.measurand ?? MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER @@ -724,7 +724,7 @@ export const buildMeterValue = ( chargingStation.getConnectorMaximumAvailablePower(connectorId) const connectorMinimumAmperage = currentSampledValueTemplate.minimumValue ?? 0 let connectorMaximumAmperage: number - switch (chargingStation.stationInfo?.currentOutType) { + switch (chargingStation.stationInfo.currentOutType) { case CurrentType.AC: connectorMaximumAmperage = ACElectricUtils.amperagePerPhaseFromPower( chargingStation.getNumberOfPhases(), @@ -743,7 +743,7 @@ export const buildMeterValue = ( connectorMinimumAmperage, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumAmperage } ), @@ -756,16 +756,16 @@ export const buildMeterValue = ( ) ? getRandomFloatFluctuatedRounded( getLimitFromSampledValueTemplateCustomValue( - currentPerPhaseSampledValueTemplates.L1?.value, + currentPerPhaseSampledValueTemplates.L1.value, connectorMaximumAmperage, connectorMinimumAmperage, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumAmperage } ), - currentPerPhaseSampledValueTemplates.L1?.fluctuationPercent ?? + currentPerPhaseSampledValueTemplates.L1.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT ) : undefined @@ -774,16 +774,16 @@ export const buildMeterValue = ( ) ? getRandomFloatFluctuatedRounded( getLimitFromSampledValueTemplateCustomValue( - currentPerPhaseSampledValueTemplates.L2?.value, + currentPerPhaseSampledValueTemplates.L2.value, connectorMaximumAmperage, connectorMinimumAmperage, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumAmperage } ), - currentPerPhaseSampledValueTemplates.L2?.fluctuationPercent ?? + currentPerPhaseSampledValueTemplates.L2.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT ) : undefined @@ -792,16 +792,16 @@ export const buildMeterValue = ( ) ? getRandomFloatFluctuatedRounded( getLimitFromSampledValueTemplateCustomValue( - currentPerPhaseSampledValueTemplates.L3?.value, + currentPerPhaseSampledValueTemplates.L3.value, connectorMaximumAmperage, connectorMinimumAmperage, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumAmperage } ), - currentPerPhaseSampledValueTemplates.L3?.fluctuationPercent ?? + currentPerPhaseSampledValueTemplates.L3.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT ) : undefined @@ -826,7 +826,7 @@ export const buildMeterValue = ( connectorMinimumAmperage, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumAmperage } ), @@ -857,7 +857,7 @@ export const buildMeterValue = ( connectorMinimumAmperage, { limitationEnabled: - chargingStation.stationInfo?.customValueLimitationMeterValues, + chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumAmperage } ), @@ -930,10 +930,9 @@ export const buildMeterValue = ( // Energy.Active.Import.Register measurand (default) energySampledValueTemplate = getSampledValueTemplate(chargingStation, connectorId) if (energySampledValueTemplate != null) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - checkMeasurandPowerDivider(chargingStation, energySampledValueTemplate.measurand!) + checkMeasurandPowerDivider(chargingStation, energySampledValueTemplate.measurand) const unitDivider = - energySampledValueTemplate?.unit === MeterValueUnit.KILO_WATT_HOUR ? 1000 : 1 + energySampledValueTemplate.unit === MeterValueUnit.KILO_WATT_HOUR ? 1000 : 1 const connectorMaximumAvailablePower = chargingStation.getConnectorMaximumAvailablePower(connectorId) const connectorMaximumEnergyRounded = roundTo( @@ -951,7 +950,7 @@ export const buildMeterValue = ( connectorMaximumEnergyRounded, connectorMinimumEnergyRounded, { - limitationEnabled: chargingStation.stationInfo?.customValueLimitationMeterValues, + limitationEnabled: chargingStation.stationInfo.customValueLimitationMeterValues, fallbackValue: connectorMinimumEnergyRounded, unitMultiplier: unitDivider } @@ -1011,7 +1010,7 @@ export const buildMeterValue = ( export const buildTransactionEndMeterValue = ( chargingStation: ChargingStation, connectorId: number, - meterStop: number + meterStop: number | undefined ): MeterValue => { let meterValue: MeterValue let sampledValueTemplate: SampledValueTemplate | undefined @@ -1045,7 +1044,7 @@ export const buildTransactionEndMeterValue = ( const checkMeasurandPowerDivider = ( chargingStation: ChargingStation, - measurandType: MeterValueMeasurand + measurandType: MeterValueMeasurand | undefined ): void => { if (chargingStation.powerDivider == null) { const errMsg = `MeterValues measurand ${ @@ -1053,7 +1052,7 @@ const checkMeasurandPowerDivider = ( }: powerDivider is undefined` logger.error(`${chargingStation.logPrefix()} ${errMsg}`) throw new OCPPError(ErrorType.INTERNAL_ERROR, errMsg, RequestCommand.METER_VALUES) - } else if (chargingStation?.powerDivider <= 0) { + } else if (chargingStation.powerDivider <= 0) { const errMsg = `MeterValues measurand ${ measurandType ?? MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER }: powerDivider have zero or below value ${chargingStation.powerDivider}` @@ -1077,7 +1076,7 @@ const getLimitFromSampledValueTemplateCustomValue = ( ...options } const parsedValue = parseInt(value ?? '') - if (options?.limitationEnabled === true) { + if (options.limitationEnabled === true) { return max( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion min((!isNaN(parsedValue) ? parsedValue : Infinity) * options.unitMultiplier!, maxLimit), @@ -1115,7 +1114,7 @@ const getSampledValueTemplate = ( ) return } - const sampledValueTemplates: SampledValueTemplate[] = + const sampledValueTemplates = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion chargingStation.getConnectorStatus(connectorId)!.MeterValues for ( @@ -1175,12 +1174,11 @@ const buildSampledValue = ( context?: MeterValueContext, phase?: MeterValuePhase ): SampledValue => { - const sampledValueContext = context ?? sampledValueTemplate?.context + const sampledValueContext = context ?? sampledValueTemplate.context const sampledValueLocation = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - sampledValueTemplate?.location ?? getMeasurandDefaultLocation(sampledValueTemplate.measurand!) - const sampledValuePhase = phase ?? sampledValueTemplate?.phase - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + sampledValueTemplate.location ?? getMeasurandDefaultLocation(sampledValueTemplate.measurand!) + const sampledValuePhase = phase ?? sampledValueTemplate.phase return { ...(sampledValueTemplate.unit != null && { unit: sampledValueTemplate.unit @@ -1190,9 +1188,9 @@ const buildSampledValue = ( measurand: sampledValueTemplate.measurand }), ...(sampledValueLocation != null && { location: sampledValueLocation }), - ...(value != null && { value: value.toString() }), + ...{ value: value.toString() }, ...(sampledValuePhase != null && { phase: sampledValuePhase }) - } as SampledValue + } satisfies SampledValue } const getMeasurandDefaultLocation = ( @@ -1228,10 +1226,10 @@ const getMeasurandDefaultLocation = ( // eslint-disable-next-line @typescript-eslint/no-extraneous-class export class OCPPServiceUtils { - public static getMessageTypeString = getMessageTypeString - public static sendAndSetConnectorStatus = sendAndSetConnectorStatus - public static isIdTagAuthorized = isIdTagAuthorized - public static buildTransactionEndMeterValue = buildTransactionEndMeterValue + public static readonly getMessageTypeString = getMessageTypeString + public static readonly sendAndSetConnectorStatus = sendAndSetConnectorStatus + public static readonly isIdTagAuthorized = isIdTagAuthorized + public static readonly buildTransactionEndMeterValue = buildTransactionEndMeterValue protected static getSampledValueTemplate = getSampledValueTemplate protected static buildSampledValue = buildSampledValue @@ -1239,7 +1237,7 @@ export class OCPPServiceUtils { // This is intentional } - public static ajvErrorsToErrorType (errors: ErrorObject[] | null | undefined): ErrorType { + public static ajvErrorsToErrorType (errors: ErrorObject[] | undefined | null): ErrorType { if (isNotEmptyArray(errors)) { for (const error of errors as DefinedError[]) { switch (error.keyword) { @@ -1271,7 +1269,7 @@ export class OCPPServiceUtils { isRequestCommand && chargingStation.stationInfo?.commandsSupport?.outgoingCommands?.[command] != null ) { - return chargingStation.stationInfo?.commandsSupport?.outgoingCommands[command] + return chargingStation.stationInfo.commandsSupport.outgoingCommands[command] } logger.error(`${chargingStation.logPrefix()} Unknown outgoing OCPP command '${command}'`) return false @@ -1290,9 +1288,9 @@ export class OCPPServiceUtils { return true } else if ( isIncomingRequestCommand && - chargingStation.stationInfo?.commandsSupport?.incomingCommands?.[command] != null + chargingStation.stationInfo?.commandsSupport?.incomingCommands[command] != null ) { - return chargingStation.stationInfo?.commandsSupport?.incomingCommands[command] + return chargingStation.stationInfo.commandsSupport.incomingCommands[command] } logger.error(`${chargingStation.logPrefix()} Unknown incoming OCPP command '${command}'`) return false @@ -1309,7 +1307,7 @@ export class OCPPServiceUtils { isMessageTrigger && chargingStation.stationInfo?.messageTriggerSupport?.[messageTrigger] != null ) { - return chargingStation.stationInfo?.messageTriggerSupport[messageTrigger] + return chargingStation.stationInfo.messageTriggerSupport[messageTrigger] } logger.error( `${chargingStation.logPrefix()} Unknown incoming OCPP message trigger '${messageTrigger}'` @@ -1331,16 +1329,16 @@ export class OCPPServiceUtils { return true } - public static convertDateToISOString(obj: T): void { - for (const key in obj) { + public static convertDateToISOString(object: T): void { + for (const key in object) { // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion, @typescript-eslint/no-non-null-assertion - if (isDate(obj![key])) { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion, @typescript-eslint/no-non-null-assertion - (obj![key] as string) = (obj![key] as Date).toISOString() + if (isDate(object![key])) { // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion, @typescript-eslint/no-non-null-assertion - } else if (obj![key] !== null && typeof obj![key] === 'object') { + (object![key] as string) = (object![key] as Date).toISOString() + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion, @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-condition + } else if (typeof object![key] === 'object' && object![key] !== null) { // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion, @typescript-eslint/no-non-null-assertion - OCPPServiceUtils.convertDateToISOString(obj![key] as T) + OCPPServiceUtils.convertDateToISOString(object![key] as T) } } }