X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Focpp%2FOCPPServiceUtils.ts;h=b74740875b2753642eb673ae3dcd9a8cb5a3c89a;hb=d372f6da34cd27ce947ea2457dc37646a7edb472;hp=dcd7447272a4dccb74c1dc21844141f2353385b2;hpb=e1d9a0f4d6ff1a90048e9a694fd12b7031cc6961;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ocpp/OCPPServiceUtils.ts b/src/charging-station/ocpp/OCPPServiceUtils.ts index dcd74472..b7474087 100644 --- a/src/charging-station/ocpp/OCPPServiceUtils.ts +++ b/src/charging-station/ocpp/OCPPServiceUtils.ts @@ -3,19 +3,23 @@ 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'; import { OCPP20Constants } from './2.0/OCPP20Constants'; import { OCPPConstants } from './OCPPConstants'; -import { type ChargingStation, ChargingStationConfigurationUtils } from '../../charging-station'; +import { type ChargingStation, getConfigurationKey, getIdTagsFile } from '../../charging-station'; import { BaseError } from '../../exception'; import { + AuthorizationStatus, + type AuthorizeRequest, + type AuthorizeResponse, ChargePointErrorCode, + type ConnectorStatus, type ConnectorStatusEnum, ErrorType, FileType, IncomingRequestCommand, - type JsonObject, type JsonType, MessageTrigger, MessageType, @@ -144,10 +148,14 @@ export class OCPPServiceUtils { } public static convertDateToISOString(obj: T): void { - for (const key in obj as JsonObject) { - if (obj![key] instanceof Date) { - obj![key] = (obj![key] as Date).toISOString(); + for (const key in obj) { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + if (isDate(obj![key])) { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + (obj![key] as string) = (obj![key] as Date).toISOString(); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion } else if (obj![key] !== null && typeof obj![key] === 'object') { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion OCPPServiceUtils.convertDateToISOString(obj![key] as T); } } @@ -214,6 +222,35 @@ export class OCPPServiceUtils { chargingStation.getConnectorStatus(connectorId)!.status = status; } + public static async isIdTagAuthorized( + chargingStation: ChargingStation, + connectorId: number, + idTag: string, + ): Promise { + if (!chargingStation.getLocalAuthListEnabled() && !chargingStation.getRemoteAuthorization()) { + logger.warn( + `${chargingStation.logPrefix()} The charging station expects to authorize RFID tags but nor local authorization nor remote authorization are enabled. Misbehavior may occur`, + ); + } + let authorized = false; + if ( + chargingStation.getLocalAuthListEnabled() === true && + OCPPServiceUtils.isIdTagLocalAuthorized(chargingStation, idTag) + ) { + const connectorStatus: ConnectorStatus = chargingStation.getConnectorStatus(connectorId)!; + connectorStatus.localAuthorizeIdTag = idTag; + connectorStatus.idTagLocalAuthorized = true; + authorized = true; + } else if (chargingStation.getRemoteAuthorization()) { + authorized = await OCPPServiceUtils.isIdTagRemoteAuthorized( + chargingStation, + connectorId, + idTag, + ); + } + return authorized; + } + protected static checkConnectorStatusTransition( chargingStation: ChargingStation, connectorId: number, @@ -305,7 +342,7 @@ export class OCPPServiceUtils { } if ( measurand !== MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER && - ChargingStationConfigurationUtils.getConfigurationKey( + getConfigurationKey( chargingStation, StandardParametersKey.MeterValuesSampledData, )?.value?.includes(measurand) === false @@ -337,7 +374,7 @@ export class OCPPServiceUtils { phase && sampledValueTemplates[index]?.phase === phase && sampledValueTemplates[index]?.measurand === measurand && - ChargingStationConfigurationUtils.getConfigurationKey( + getConfigurationKey( chargingStation, StandardParametersKey.MeterValuesSampledData, )?.value?.includes(measurand) === true @@ -347,7 +384,7 @@ export class OCPPServiceUtils { !phase && !sampledValueTemplates[index].phase && sampledValueTemplates[index]?.measurand === measurand && - ChargingStationConfigurationUtils.getConfigurationKey( + getConfigurationKey( chargingStation, StandardParametersKey.MeterValuesSampledData, )?.value?.includes(measurand) === true @@ -393,6 +430,35 @@ export class OCPPServiceUtils { : numberValue * options.unitMultiplier!; } + private static isIdTagLocalAuthorized(chargingStation: ChargingStation, idTag: string): boolean { + return ( + chargingStation.hasIdTags() === true && + isNotEmptyString( + chargingStation.idTagsCache + .getIdTags(getIdTagsFile(chargingStation.stationInfo)!) + ?.find((tag) => tag === idTag), + ) + ); + } + + private static async isIdTagRemoteAuthorized( + chargingStation: ChargingStation, + connectorId: number, + idTag: string, + ): Promise { + chargingStation.getConnectorStatus(connectorId)!.authorizeIdTag = idTag; + return ( + ( + await chargingStation.ocppRequestService.requestHandler< + AuthorizeRequest, + AuthorizeResponse + >(chargingStation, RequestCommand.AUTHORIZE, { + idTag, + }) + )?.idTagInfo?.status === AuthorizationStatus.ACCEPTED + ); + } + private static logPrefix = ( ocppVersion: OCPPVersion, moduleName?: string,