+import { randomInt } from 'node:crypto'
import { readFileSync } from 'node:fs'
import { dirname, join } from 'node:path'
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,
type AuthorizeResponse,
ChargePointErrorCode,
ChargingStationEvents,
- type ConnectorStatusEnum,
+ type ConnectorStatus,
+ ConnectorStatusEnum,
CurrentType,
ErrorType,
FileType,
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'
})
}
+export const restoreConnectorStatus = async (
+ chargingStation: ChargingStation,
+ connectorId: number,
+ connectorStatus: ConnectorStatus | undefined
+): Promise<void> => {
+ if (
+ connectorStatus?.reservation != null &&
+ connectorStatus.status !== ConnectorStatusEnum.Reserved
+ ) {
+ await sendAndSetConnectorStatus(chargingStation, connectorId, ConnectorStatusEnum.Reserved)
+ } else if (connectorStatus?.status !== ConnectorStatusEnum.Available) {
+ await sendAndSetConnectorStatus(chargingStation, connectorId, ConnectorStatusEnum.Available)
+ }
+}
+
const checkConnectorStatusTransition = (
chargingStation: ChargingStation,
connectorId: number,
const socMinimumValue = socSampledValueTemplate.minimumValue ?? 0
const socSampledValueTemplateValue = isNotEmptyString(socSampledValueTemplate.value)
? getRandomFloatFluctuatedRounded(
- parseInt(socSampledValueTemplate.value),
+ Number.parseInt(socSampledValueTemplate.value),
socSampledValueTemplate.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT
)
- : getRandomInteger(socMaximumValue, socMinimumValue)
+ : randomInt(socMinimumValue, socMaximumValue)
meterValue.sampledValue.push(
buildSampledValue(socSampledValueTemplate, socSampledValueTemplateValue)
)
`${chargingStation.logPrefix()} MeterValues measurand ${
meterValue.sampledValue[sampledValuesIndex].measurand ??
MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
- }: connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${socMinimumValue}/${
+ }: connector id ${connectorId}, transaction id ${
+ connector?.transactionId
+ }, value: ${socMinimumValue}/${
meterValue.sampledValue[sampledValuesIndex].value
}/${socMaximumValue}`
)
)
if (voltageSampledValueTemplate != null) {
const voltageSampledValueTemplateValue = isNotEmptyString(voltageSampledValueTemplate.value)
- ? parseInt(voltageSampledValueTemplate.value)
+ ? Number.parseInt(voltageSampledValueTemplate.value)
: // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
chargingStation.stationInfo.voltageOut!
const fluctuationPercent =
const voltagePhaseLineToNeutralSampledValueTemplateValue = isNotEmptyString(
voltagePhaseLineToNeutralSampledValueTemplate.value
)
- ? parseInt(voltagePhaseLineToNeutralSampledValueTemplate.value)
+ ? Number.parseInt(voltagePhaseLineToNeutralSampledValueTemplate.value)
: // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
chargingStation.stationInfo.voltageOut!
const fluctuationPhaseToNeutralPercent =
const voltagePhaseLineToLineSampledValueTemplateValue = isNotEmptyString(
voltagePhaseLineToLineSampledValueTemplate.value
)
- ? parseInt(voltagePhaseLineToLineSampledValueTemplate.value)
+ ? Number.parseInt(voltagePhaseLineToLineSampledValueTemplate.value)
: voltagePhaseLineToLineValueRounded
const fluctuationPhaseLineToLinePercent =
voltagePhaseLineToLineSampledValueTemplate.fluctuationPercent ??
`${chargingStation.logPrefix()} MeterValues measurand ${
meterValue.sampledValue[sampledValuesIndex].measurand ??
MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
- }: connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${connectorMinimumPowerRounded}/${
+ }: connector id ${connectorId}, transaction id ${
+ connector?.transactionId
+ }, value: ${connectorMinimumPowerRounded}/${
meterValue.sampledValue[sampledValuesIndex].value
}/${connectorMaximumPowerRounded}`
)
MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
}: phase ${
meterValue.sampledValue[sampledValuesPerPhaseIndex].phase
- }, connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${connectorMinimumPowerPerPhaseRounded}/${
+ }, connector id ${connectorId}, transaction id ${
+ connector?.transactionId
+ }, value: ${connectorMinimumPowerPerPhaseRounded}/${
meterValue.sampledValue[sampledValuesPerPhaseIndex].value
}/${connectorMaximumPowerPerPhaseRounded}`
)
`${chargingStation.logPrefix()} MeterValues measurand ${
meterValue.sampledValue[sampledValuesIndex].measurand ??
MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
- }: connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${connectorMinimumAmperage}/${
+ }: connector id ${connectorId}, transaction id ${
+ connector?.transactionId
+ }, value: ${connectorMinimumAmperage}/${
meterValue.sampledValue[sampledValuesIndex].value
}/${connectorMaximumAmperage}`
)
MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
}: phase ${
meterValue.sampledValue[sampledValuesPerPhaseIndex].phase
- }, connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${connectorMinimumAmperage}/${
+ }, connector id ${connectorId}, transaction id ${
+ connector?.transactionId
+ }, value: ${connectorMinimumAmperage}/${
meterValue.sampledValue[sampledValuesPerPhaseIndex].value
}/${connectorMaximumAmperage}`
)
`${chargingStation.logPrefix()} MeterValues measurand ${
meterValue.sampledValue[sampledValuesIndex].measurand ??
MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
- }: connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${connectorMinimumEnergyRounded}/${energyValueRounded}/${connectorMaximumEnergyRounded}, duration: ${interval}ms`
+ }: connector id ${connectorId}, transaction id ${
+ connector?.transactionId
+ }, value: ${connectorMinimumEnergyRounded}/${energyValueRounded}/${connectorMaximumEnergyRounded}, duration: ${interval}ms`
)
}
}
value: string | undefined,
maxLimit: number,
minLimit: number,
- options?: { limitationEnabled?: boolean, fallbackValue?: number, unitMultiplier?: number }
+ options?: {
+ limitationEnabled?: boolean
+ fallbackValue?: number
+ unitMultiplier?: number
+ }
): number => {
options = {
...{
},
...options
}
- const parsedValue = parseInt(value ?? '')
+ const parsedValue = Number.parseInt(value ?? '')
if (options.limitationEnabled === true) {
return max(
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- min((!isNaN(parsedValue) ? parsedValue : Infinity) * options.unitMultiplier!, maxLimit),
+ min(
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ (!isNaN(parsedValue) ? parsedValue : Number.POSITIVE_INFINITY) * options.unitMultiplier!,
+ maxLimit
+ ),
minLimit
)
}
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
export class OCPPServiceUtils {
- public static readonly getMessageTypeString = getMessageTypeString
public static readonly sendAndSetConnectorStatus = sendAndSetConnectorStatus
+ public static readonly restoreConnectorStatus = restoreConnectorStatus
public static readonly isIdTagAuthorized = isIdTagAuthorized
public static readonly buildTransactionEndMeterValue = buildTransactionEndMeterValue
protected static getSampledValueTemplate = getSampledValueTemplate
}
}
- public static startHeartbeatInterval (chargingStation: ChargingStation, interval: number): void {
- if (chargingStation.heartbeatSetInterval == null) {
- chargingStation.startHeartbeat()
- } else if (chargingStation.getHeartbeatInterval() !== interval) {
- chargingStation.restartHeartbeat()
- }
- }
-
protected static parseJsonSchemaFile<T extends JsonType>(
relativePath: string,
ocppVersion: OCPPVersion,