X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2FHelpers.ts;h=804eb7a1c0593891813a41622e866700aba067f3;hb=626d3ce5e6dfdc848cb2bb5833044fe6fbe68324;hp=2b3e1c7eae58408f212fd79940db666ae1c37cac;hpb=e566a66766f31a25664b06a1011d84e4d68f0e03;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/Helpers.ts b/src/charging-station/Helpers.ts index 2b3e1c7e..804eb7a1 100644 --- a/src/charging-station/Helpers.ts +++ b/src/charging-station/Helpers.ts @@ -1,18 +1,18 @@ import { createHash, randomBytes } from 'node:crypto' import type { EventEmitter } from 'node:events' -import { basename, dirname, join } from 'node:path' +import { basename, dirname, isAbsolute, join, parse, relative, resolve } from 'node:path' import { env } from 'node:process' import { fileURLToPath } from 'node:url' import chalk from 'chalk' import { - type Interval, addDays, addSeconds, addWeeks, differenceInDays, differenceInSeconds, differenceInWeeks, + type Interval, isAfter, isBefore, isDate, @@ -21,9 +21,8 @@ import { toDate } from 'date-fns' import { maxTime } from 'date-fns/constants' +import { isEmpty } from 'rambda' -import type { ChargingStation } from './ChargingStation.js' -import { getConfigurationKey } from './ConfigurationKeyUtils.js' import { BaseError } from '../exception/index.js' import { AmpereUnits, @@ -56,23 +55,34 @@ import { } from '../types/index.js' import { ACElectricUtils, - Constants, - DCElectricUtils, clone, + Constants, convertToDate, convertToInt, + DCElectricUtils, isArraySorted, - isEmptyObject, - isEmptyString, isNotEmptyArray, isNotEmptyString, isValidDate, logger, secureRandom } from '../utils/index.js' +import type { ChargingStation } from './ChargingStation.js' +import { getConfigurationKey } from './ConfigurationKeyUtils.js' const moduleName = 'Helpers' +export const buildTemplateName = (templateFile: string): string => { + if (isAbsolute(templateFile)) { + templateFile = relative( + resolve(join(dirname(fileURLToPath(import.meta.url)), 'assets', 'station-templates')), + templateFile + ) + } + const templateFileParsedPath = parse(templateFile) + return join(templateFileParsedPath.dir, templateFileParsedPath.name) +} + export const getChargingStationId = ( index: number, stationTemplate: ChargingStationTemplate | undefined @@ -243,12 +253,12 @@ export const checkTemplate = ( logger.error(`${logPrefix} ${errorMsg}`) throw new BaseError(errorMsg) } - if (isEmptyObject(stationTemplate)) { + if (isEmpty(stationTemplate)) { const errorMsg = `Empty charging station information from template file ${templateFile}` logger.error(`${logPrefix} ${errorMsg}`) throw new BaseError(errorMsg) } - if (stationTemplate.idTagsFile == null || isEmptyString(stationTemplate.idTagsFile)) { + if (stationTemplate.idTagsFile == null || isEmpty(stationTemplate.idTagsFile)) { logger.warn( `${logPrefix} Missing id tags file in template file ${templateFile}. That can lead to issues with the Automatic Transaction Generator` ) @@ -265,7 +275,7 @@ export const checkConfiguration = ( logger.error(`${logPrefix} ${errorMsg}`) throw new BaseError(errorMsg) } - if (isEmptyObject(stationConfiguration)) { + if (isEmpty(stationConfiguration)) { const errorMsg = `Empty charging station configuration from file ${configurationFile}` logger.error(`${logPrefix} ${errorMsg}`) throw new BaseError(errorMsg) @@ -296,7 +306,11 @@ export const checkConnectorsConfiguration = ( ) stationTemplate.randomConnectors = true } - return { configuredMaxConnectors, templateMaxConnectors, templateMaxAvailableConnectors } + return { + configuredMaxConnectors, + templateMaxConnectors, + templateMaxAvailableConnectors + } } export const checkStationInfoConnectorStatus = ( @@ -335,12 +349,11 @@ export const buildConnectorsMap = ( } export const setChargingStationOptions = ( - chargingStation: ChargingStation, stationInfo: ChargingStationInfo, options?: ChargingStationOptions ): ChargingStationInfo => { if (options?.supervisionUrls != null) { - chargingStation.setSupervisionUrls(options.supervisionUrls, false) + stationInfo.supervisionUrls = options.supervisionUrls } if (options?.persistentConfiguration != null) { stationInfo.stationInfoPersistentConfiguration = options.persistentConfiguration @@ -392,24 +405,31 @@ export const initializeConnectorsMapStatus = ( } } +export const resetAuthorizeConnectorStatus = (connectorStatus: ConnectorStatus): void => { + connectorStatus.idTagLocalAuthorized = false + connectorStatus.idTagAuthorized = false + delete connectorStatus.localAuthorizeIdTag + delete connectorStatus.authorizeIdTag +} + export const resetConnectorStatus = (connectorStatus: ConnectorStatus | undefined): void => { if (connectorStatus == null) { return } - connectorStatus.chargingProfiles = - connectorStatus.transactionId != null && isNotEmptyArray(connectorStatus.chargingProfiles) - ? connectorStatus.chargingProfiles.filter( - chargingProfile => chargingProfile.transactionId !== connectorStatus.transactionId - ) - : [] - connectorStatus.idTagLocalAuthorized = false - connectorStatus.idTagAuthorized = false + if (isNotEmptyArray(connectorStatus.chargingProfiles)) { + connectorStatus.chargingProfiles = connectorStatus.chargingProfiles.filter( + chargingProfile => + (chargingProfile.transactionId != null && + connectorStatus.transactionId != null && + chargingProfile.transactionId !== connectorStatus.transactionId) || + chargingProfile.transactionId == null + ) + } + resetAuthorizeConnectorStatus(connectorStatus) connectorStatus.transactionRemoteStarted = false connectorStatus.transactionStarted = false delete connectorStatus.transactionStart delete connectorStatus.transactionId - delete connectorStatus.localAuthorizeIdTag - delete connectorStatus.authorizeIdTag delete connectorStatus.transactionIdTag connectorStatus.transactionEnergyActiveImportRegisterValue = 0 delete connectorStatus.transactionBeginMeterValue @@ -515,7 +535,10 @@ export const createSerialNumber = ( randomSerialNumber?: boolean } ): void => { - params = { ...{ randomSerialNumberUpperCase: true, randomSerialNumber: true }, ...params } + params = { + ...{ randomSerialNumberUpperCase: true, randomSerialNumber: true }, + ...params + } const serialNumberSuffix = params.randomSerialNumber === true ? getRandomSerialNumberSuffix({ @@ -965,7 +988,7 @@ export const prepareChargingProfileKind = ( if (connectorStatus?.transactionStarted === true) { chargingProfile.chargingSchedule.startSchedule = connectorStatus.transactionStart } - // FIXME: Handle relative charging profile duration + // FIXME: handle relative charging profile duration break } return true