X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcharging-station%2Focpp%2F1.6%2FOCPP16ServiceUtils.ts;h=d112270a6aa6e99124931ed66682b08c458ddde8;hb=c0f4be747574980ada77fd4be1c691637fa69347;hp=ead2558aa7cd6d07f94e4e37e81b475f1622bebc;hpb=290d006c2d91dce4e9d187189c3e4fae870647f7;p=e-mobility-charging-stations-simulator.git diff --git a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts index ead2558a..d112270a 100644 --- a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts +++ b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts @@ -1,39 +1,72 @@ -import { MeterValueContext, MeterValueLocation, MeterValueUnit, OCPP16MeterValue, OCPP16MeterValueMeasurand, OCPP16MeterValuePhase, OCPP16SampledValue } from '../../../types/ocpp/1.6/MeterValues'; +// Partial Copyright Jerome Benoit. 2021. All Rights Reserved. -import ChargingStation from '../../ChargingStation'; -import { SampledValueTemplate } from '../../../types/Connectors'; +import { + MeterValueContext, + MeterValueLocation, + MeterValueUnit, + OCPP16MeterValue, + OCPP16MeterValueMeasurand, + OCPP16MeterValuePhase, + OCPP16SampledValue, +} from '../../../types/ocpp/1.6/MeterValues'; + +import type ChargingStation from '../../ChargingStation'; +import { ErrorType } from '../../../types/ocpp/ErrorType'; +import OCPPError from '../../../exception/OCPPError'; +import { RequestCommand } from '../../../types/ocpp/Requests'; +import { SampledValueTemplate } from '../../../types/MeasurandPerPhaseSampledValueTemplates'; import Utils from '../../../utils/Utils'; import logger from '../../../utils/Logger'; export class OCPP16ServiceUtils { - public static checkMeasurandPowerDivider(chargingStation: ChargingStation, measurandType: OCPP16MeterValueMeasurand): void { + public static checkMeasurandPowerDivider( + chargingStation: ChargingStation, + measurandType: OCPP16MeterValueMeasurand + ): void { if (Utils.isUndefined(chargingStation.stationInfo.powerDivider)) { - const errMsg = `${chargingStation.logPrefix()} MeterValues measurand ${measurandType ?? OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER}: powerDivider is undefined`; + const errMsg = `${chargingStation.logPrefix()} MeterValues measurand ${ + measurandType ?? OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER + }: powerDivider is undefined`; logger.error(errMsg); - throw new Error(errMsg); + throw new OCPPError(ErrorType.INTERNAL_ERROR, errMsg, RequestCommand.METER_VALUES); } else if (chargingStation.stationInfo?.powerDivider <= 0) { - const errMsg = `${chargingStation.logPrefix()} MeterValues measurand ${measurandType ?? OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER}: powerDivider have zero or below value ${chargingStation.stationInfo.powerDivider}`; + const errMsg = `${chargingStation.logPrefix()} MeterValues measurand ${ + measurandType ?? OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER + }: powerDivider have zero or below value ${chargingStation.stationInfo.powerDivider}`; logger.error(errMsg); - throw new Error(errMsg); + throw new OCPPError(ErrorType.INTERNAL_ERROR, errMsg, RequestCommand.METER_VALUES); } } - public static buildSampledValue(sampledValueTemplate: SampledValueTemplate, value: number, context?: MeterValueContext, phase?: OCPP16MeterValuePhase): OCPP16SampledValue { - const sampledValueValue = value ?? (sampledValueTemplate?.value ?? null); - const sampledValueContext = context ?? (sampledValueTemplate?.context ?? null); - const sampledValueLocation = sampledValueTemplate?.location ?? OCPP16ServiceUtils.getMeasurandDefaultLocation(sampledValueTemplate?.measurand ?? null); - const sampledValuePhase = phase ?? (sampledValueTemplate?.phase ?? null); + public static buildSampledValue( + sampledValueTemplate: SampledValueTemplate, + value: number, + context?: MeterValueContext, + phase?: OCPP16MeterValuePhase + ): OCPP16SampledValue { + const sampledValueValue = value ?? sampledValueTemplate?.value ?? null; + const sampledValueContext = context ?? sampledValueTemplate?.context ?? null; + const sampledValueLocation = + sampledValueTemplate?.location ?? + OCPP16ServiceUtils.getMeasurandDefaultLocation(sampledValueTemplate?.measurand ?? null); + const sampledValuePhase = phase ?? sampledValueTemplate?.phase ?? null; return { - ...!Utils.isNullOrUndefined(sampledValueTemplate.unit) && { unit: sampledValueTemplate.unit }, - ...!Utils.isNullOrUndefined(sampledValueContext) && { context: sampledValueContext }, - ...!Utils.isNullOrUndefined(sampledValueTemplate.measurand) && { measurand: sampledValueTemplate.measurand }, - ...!Utils.isNullOrUndefined(sampledValueLocation) && { location: sampledValueLocation }, - ...!Utils.isNullOrUndefined(sampledValueValue) && { value: sampledValueValue.toString() }, - ...!Utils.isNullOrUndefined(sampledValuePhase) && { phase: sampledValuePhase }, + ...(!Utils.isNullOrUndefined(sampledValueTemplate.unit) && { + unit: sampledValueTemplate.unit, + }), + ...(!Utils.isNullOrUndefined(sampledValueContext) && { context: sampledValueContext }), + ...(!Utils.isNullOrUndefined(sampledValueTemplate.measurand) && { + measurand: sampledValueTemplate.measurand, + }), + ...(!Utils.isNullOrUndefined(sampledValueLocation) && { location: sampledValueLocation }), + ...(!Utils.isNullOrUndefined(sampledValueValue) && { value: sampledValueValue.toString() }), + ...(!Utils.isNullOrUndefined(sampledValuePhase) && { phase: sampledValuePhase }), }; } - public static getMeasurandDefaultUnit(measurandType: OCPP16MeterValueMeasurand): MeterValueUnit | undefined { + public static getMeasurandDefaultUnit( + measurandType: OCPP16MeterValueMeasurand + ): MeterValueUnit | undefined { switch (measurandType) { case OCPP16MeterValueMeasurand.CURRENT_EXPORT: case OCPP16MeterValueMeasurand.CURRENT_IMPORT: @@ -53,14 +86,20 @@ export class OCPP16ServiceUtils { } } - public static getMeasurandDefaultLocation(measurandType: OCPP16MeterValueMeasurand): MeterValueLocation | undefined { + public static getMeasurandDefaultLocation( + measurandType: OCPP16MeterValueMeasurand + ): MeterValueLocation | undefined { switch (measurandType) { case OCPP16MeterValueMeasurand.STATE_OF_CHARGE: return MeterValueLocation.EV; } } - public static buildTransactionBeginMeterValue(chargingStation: ChargingStation, connectorId: number, meterBegin: number): OCPP16MeterValue { + public static buildTransactionBeginMeterValue( + chargingStation: ChargingStation, + connectorId: number, + meterBegin: number + ): OCPP16MeterValue { const meterValue: OCPP16MeterValue = { timestamp: new Date().toISOString(), sampledValue: [], @@ -68,11 +107,21 @@ export class OCPP16ServiceUtils { // Energy.Active.Import.Register measurand (default) const sampledValueTemplate = chargingStation.getSampledValueTemplate(connectorId); const unitDivider = sampledValueTemplate?.unit === MeterValueUnit.KILO_WATT_HOUR ? 1000 : 1; - meterValue.sampledValue.push(OCPP16ServiceUtils.buildSampledValue(sampledValueTemplate, Utils.roundTo(meterBegin / unitDivider, 4), MeterValueContext.TRANSACTION_BEGIN)); + meterValue.sampledValue.push( + OCPP16ServiceUtils.buildSampledValue( + sampledValueTemplate, + Utils.roundTo(meterBegin / unitDivider, 4), + MeterValueContext.TRANSACTION_BEGIN + ) + ); return meterValue; } - public static buildTransactionEndMeterValue(chargingStation: ChargingStation, connectorId: number, meterEnd: number): OCPP16MeterValue { + public static buildTransactionEndMeterValue( + chargingStation: ChargingStation, + connectorId: number, + meterEnd: number + ): OCPP16MeterValue { const meterValue: OCPP16MeterValue = { timestamp: new Date().toISOString(), sampledValue: [], @@ -80,11 +129,20 @@ export class OCPP16ServiceUtils { // Energy.Active.Import.Register measurand (default) const sampledValueTemplate = chargingStation.getSampledValueTemplate(connectorId); const unitDivider = sampledValueTemplate?.unit === MeterValueUnit.KILO_WATT_HOUR ? 1000 : 1; - meterValue.sampledValue.push(OCPP16ServiceUtils.buildSampledValue(sampledValueTemplate, Utils.roundTo(meterEnd / unitDivider, 4), MeterValueContext.TRANSACTION_END)); + meterValue.sampledValue.push( + OCPP16ServiceUtils.buildSampledValue( + sampledValueTemplate, + Utils.roundTo(meterEnd / unitDivider, 4), + MeterValueContext.TRANSACTION_END + ) + ); return meterValue; } - public static buildTransactionDataMeterValues(transactionBeginMeterValue: OCPP16MeterValue, transactionEndMeterValue: OCPP16MeterValue): OCPP16MeterValue[] { + public static buildTransactionDataMeterValues( + transactionBeginMeterValue: OCPP16MeterValue, + transactionEndMeterValue: OCPP16MeterValue + ): OCPP16MeterValue[] { const meterValues: OCPP16MeterValue[] = []; meterValues.push(transactionBeginMeterValue); meterValues.push(transactionEndMeterValue);