perf: minimize OCPPUtils exports
[e-mobility-charging-stations-simulator.git] / src / charging-station / ocpp / 1.6 / OCPP16ServiceUtils.ts
index b194e08e8d5a58db9641a337bd58b7d27aa5799f..4062bc0af881d3445fdfc5207983d531dbf89b2a 100644 (file)
@@ -17,52 +17,27 @@ import {
   hasFeatureProfile,
   hasReservationExpired,
 } from '../../../charging-station';
-import { OCPPError } from '../../../exception';
 import {
-  type ClearChargingProfileRequest,
-  CurrentType,
-  ErrorType,
   type GenericResponse,
   type JsonType,
-  type MeasurandPerPhaseSampledValueTemplates,
-  type MeasurandValues,
-  MeterValueContext,
-  MeterValueLocation,
-  MeterValueUnit,
   OCPP16AuthorizationStatus,
   OCPP16AvailabilityType,
   type OCPP16ChangeAvailabilityResponse,
   OCPP16ChargePointStatus,
   type OCPP16ChargingProfile,
   type OCPP16ChargingSchedule,
+  type OCPP16ClearChargingProfileRequest,
   type OCPP16IncomingRequestCommand,
   type OCPP16MeterValue,
-  OCPP16MeterValueMeasurand,
-  OCPP16MeterValuePhase,
+  OCPP16MeterValueContext,
+  OCPP16MeterValueUnit,
   OCPP16RequestCommand,
-  type OCPP16SampledValue,
   OCPP16StandardParametersKey,
   OCPP16StopTransactionReason,
   type OCPP16SupportedFeatureProfiles,
   OCPPVersion,
-  type SampledValueTemplate,
 } from '../../../types';
-import {
-  ACElectricUtils,
-  Constants,
-  DCElectricUtils,
-  convertToFloat,
-  convertToInt,
-  getRandomFloatFluctuatedRounded,
-  getRandomFloatRounded,
-  getRandomInteger,
-  isNotEmptyArray,
-  isNotEmptyString,
-  isNullOrUndefined,
-  isUndefined,
-  logger,
-  roundTo,
-} from '../../../utils';
+import { isNotEmptyArray, isNullOrUndefined, logger, roundTo } from '../../../utils';
 import { OCPPServiceUtils } from '../OCPPServiceUtils';
 
 export class OCPP16ServiceUtils extends OCPPServiceUtils {
@@ -82,764 +57,6 @@ export class OCPP16ServiceUtils extends OCPPServiceUtils {
     return true;
   }
 
-  public static buildMeterValue(
-    chargingStation: ChargingStation,
-    connectorId: number,
-    transactionId: number,
-    interval: number,
-    debug = false,
-  ): OCPP16MeterValue {
-    const meterValue: OCPP16MeterValue = {
-      timestamp: new Date(),
-      sampledValue: [],
-    };
-    const connector = chargingStation.getConnectorStatus(connectorId);
-    // SoC measurand
-    const socSampledValueTemplate = OCPP16ServiceUtils.getSampledValueTemplate(
-      chargingStation,
-      connectorId,
-      OCPP16MeterValueMeasurand.STATE_OF_CHARGE,
-    );
-    if (socSampledValueTemplate) {
-      const socMaximumValue = 100;
-      const socMinimumValue = socSampledValueTemplate.minimumValue ?? 0;
-      const socSampledValueTemplateValue = isNotEmptyString(socSampledValueTemplate.value)
-        ? getRandomFloatFluctuatedRounded(
-            parseInt(socSampledValueTemplate.value),
-            socSampledValueTemplate.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT,
-          )
-        : getRandomInteger(socMaximumValue, socMinimumValue);
-      meterValue.sampledValue.push(
-        OCPP16ServiceUtils.buildSampledValue(socSampledValueTemplate, socSampledValueTemplateValue),
-      );
-      const sampledValuesIndex = meterValue.sampledValue.length - 1;
-      if (
-        convertToInt(meterValue.sampledValue[sampledValuesIndex].value) > socMaximumValue ||
-        convertToInt(meterValue.sampledValue[sampledValuesIndex].value) < socMinimumValue ||
-        debug
-      ) {
-        logger.error(
-          `${chargingStation.logPrefix()} MeterValues measurand ${
-            meterValue.sampledValue[sampledValuesIndex].measurand ??
-            OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-          }: connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${socMinimumValue}/${
-            meterValue.sampledValue[sampledValuesIndex].value
-          }/${socMaximumValue}`,
-        );
-      }
-    }
-    // Voltage measurand
-    const voltageSampledValueTemplate = OCPP16ServiceUtils.getSampledValueTemplate(
-      chargingStation,
-      connectorId,
-      OCPP16MeterValueMeasurand.VOLTAGE,
-    );
-    if (voltageSampledValueTemplate) {
-      const voltageSampledValueTemplateValue = isNotEmptyString(voltageSampledValueTemplate.value)
-        ? parseInt(voltageSampledValueTemplate.value)
-        : chargingStation.stationInfo.voltageOut!;
-      const fluctuationPercent =
-        voltageSampledValueTemplate.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT;
-      const voltageMeasurandValue = getRandomFloatFluctuatedRounded(
-        voltageSampledValueTemplateValue,
-        fluctuationPercent,
-      );
-      if (
-        chargingStation.getNumberOfPhases() !== 3 ||
-        (chargingStation.getNumberOfPhases() === 3 &&
-          chargingStation.stationInfo?.mainVoltageMeterValues)
-      ) {
-        meterValue.sampledValue.push(
-          OCPP16ServiceUtils.buildSampledValue(voltageSampledValueTemplate, voltageMeasurandValue),
-        );
-      }
-      for (
-        let phase = 1;
-        chargingStation.getNumberOfPhases() === 3 && phase <= chargingStation.getNumberOfPhases();
-        phase++
-      ) {
-        const phaseLineToNeutralValue = `L${phase}-N`;
-        const voltagePhaseLineToNeutralSampledValueTemplate =
-          OCPP16ServiceUtils.getSampledValueTemplate(
-            chargingStation,
-            connectorId,
-            OCPP16MeterValueMeasurand.VOLTAGE,
-            phaseLineToNeutralValue as OCPP16MeterValuePhase,
-          );
-        let voltagePhaseLineToNeutralMeasurandValue: number | undefined;
-        if (voltagePhaseLineToNeutralSampledValueTemplate) {
-          const voltagePhaseLineToNeutralSampledValueTemplateValue = isNotEmptyString(
-            voltagePhaseLineToNeutralSampledValueTemplate.value,
-          )
-            ? parseInt(voltagePhaseLineToNeutralSampledValueTemplate.value)
-            : chargingStation.stationInfo.voltageOut!;
-          const fluctuationPhaseToNeutralPercent =
-            voltagePhaseLineToNeutralSampledValueTemplate.fluctuationPercent ??
-            Constants.DEFAULT_FLUCTUATION_PERCENT;
-          voltagePhaseLineToNeutralMeasurandValue = getRandomFloatFluctuatedRounded(
-            voltagePhaseLineToNeutralSampledValueTemplateValue,
-            fluctuationPhaseToNeutralPercent,
-          );
-        }
-        meterValue.sampledValue.push(
-          OCPP16ServiceUtils.buildSampledValue(
-            voltagePhaseLineToNeutralSampledValueTemplate ?? voltageSampledValueTemplate,
-            voltagePhaseLineToNeutralMeasurandValue ?? voltageMeasurandValue,
-            undefined,
-            phaseLineToNeutralValue as OCPP16MeterValuePhase,
-          ),
-        );
-        if (chargingStation.stationInfo?.phaseLineToLineVoltageMeterValues) {
-          const phaseLineToLineValue = `L${phase}-L${
-            (phase + 1) % chargingStation.getNumberOfPhases() !== 0
-              ? (phase + 1) % chargingStation.getNumberOfPhases()
-              : chargingStation.getNumberOfPhases()
-          }`;
-          const voltagePhaseLineToLineValueRounded = roundTo(
-            Math.sqrt(chargingStation.getNumberOfPhases()) *
-              chargingStation.stationInfo.voltageOut!,
-            2,
-          );
-          const voltagePhaseLineToLineSampledValueTemplate =
-            OCPP16ServiceUtils.getSampledValueTemplate(
-              chargingStation,
-              connectorId,
-              OCPP16MeterValueMeasurand.VOLTAGE,
-              phaseLineToLineValue as OCPP16MeterValuePhase,
-            );
-          let voltagePhaseLineToLineMeasurandValue: number | undefined;
-          if (voltagePhaseLineToLineSampledValueTemplate) {
-            const voltagePhaseLineToLineSampledValueTemplateValue = isNotEmptyString(
-              voltagePhaseLineToLineSampledValueTemplate.value,
-            )
-              ? parseInt(voltagePhaseLineToLineSampledValueTemplate.value)
-              : voltagePhaseLineToLineValueRounded;
-            const fluctuationPhaseLineToLinePercent =
-              voltagePhaseLineToLineSampledValueTemplate.fluctuationPercent ??
-              Constants.DEFAULT_FLUCTUATION_PERCENT;
-            voltagePhaseLineToLineMeasurandValue = getRandomFloatFluctuatedRounded(
-              voltagePhaseLineToLineSampledValueTemplateValue,
-              fluctuationPhaseLineToLinePercent,
-            );
-          }
-          const defaultVoltagePhaseLineToLineMeasurandValue = getRandomFloatFluctuatedRounded(
-            voltagePhaseLineToLineValueRounded,
-            fluctuationPercent,
-          );
-          meterValue.sampledValue.push(
-            OCPP16ServiceUtils.buildSampledValue(
-              voltagePhaseLineToLineSampledValueTemplate ?? voltageSampledValueTemplate,
-              voltagePhaseLineToLineMeasurandValue ?? defaultVoltagePhaseLineToLineMeasurandValue,
-              undefined,
-              phaseLineToLineValue as OCPP16MeterValuePhase,
-            ),
-          );
-        }
-      }
-    }
-    // Power.Active.Import measurand
-    const powerSampledValueTemplate = OCPP16ServiceUtils.getSampledValueTemplate(
-      chargingStation,
-      connectorId,
-      OCPP16MeterValueMeasurand.POWER_ACTIVE_IMPORT,
-    );
-    let powerPerPhaseSampledValueTemplates: MeasurandPerPhaseSampledValueTemplates = {};
-    if (chargingStation.getNumberOfPhases() === 3) {
-      powerPerPhaseSampledValueTemplates = {
-        L1: OCPP16ServiceUtils.getSampledValueTemplate(
-          chargingStation,
-          connectorId,
-          OCPP16MeterValueMeasurand.POWER_ACTIVE_IMPORT,
-          OCPP16MeterValuePhase.L1_N,
-        ),
-        L2: OCPP16ServiceUtils.getSampledValueTemplate(
-          chargingStation,
-          connectorId,
-          OCPP16MeterValueMeasurand.POWER_ACTIVE_IMPORT,
-          OCPP16MeterValuePhase.L2_N,
-        ),
-        L3: OCPP16ServiceUtils.getSampledValueTemplate(
-          chargingStation,
-          connectorId,
-          OCPP16MeterValueMeasurand.POWER_ACTIVE_IMPORT,
-          OCPP16MeterValuePhase.L3_N,
-        ),
-      };
-    }
-    if (powerSampledValueTemplate) {
-      OCPP16ServiceUtils.checkMeasurandPowerDivider(
-        chargingStation,
-        powerSampledValueTemplate.measurand!,
-      );
-      const errMsg = `MeterValues measurand ${
-        powerSampledValueTemplate.measurand ??
-        OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-      }: Unknown ${chargingStation.stationInfo?.currentOutType} currentOutType in template file ${
-        chargingStation.templateFile
-      }, cannot calculate ${
-        powerSampledValueTemplate.measurand ??
-        OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-      } measurand value`;
-      const powerMeasurandValues: MeasurandValues = {} as MeasurandValues;
-      const unitDivider = powerSampledValueTemplate?.unit === MeterValueUnit.KILO_WATT ? 1000 : 1;
-      const connectorMaximumAvailablePower =
-        chargingStation.getConnectorMaximumAvailablePower(connectorId);
-      const connectorMaximumPower = Math.round(connectorMaximumAvailablePower);
-      const connectorMaximumPowerPerPhase = Math.round(
-        connectorMaximumAvailablePower / chargingStation.getNumberOfPhases(),
-      );
-      const connectorMinimumPower = Math.round(powerSampledValueTemplate.minimumValue ?? 0);
-      const connectorMinimumPowerPerPhase = Math.round(
-        connectorMinimumPower / chargingStation.getNumberOfPhases(),
-      );
-      switch (chargingStation.stationInfo?.currentOutType) {
-        case CurrentType.AC:
-          if (chargingStation.getNumberOfPhases() === 3) {
-            const defaultFluctuatedPowerPerPhase = isNotEmptyString(powerSampledValueTemplate.value)
-              ? getRandomFloatFluctuatedRounded(
-                  OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                    powerSampledValueTemplate.value,
-                    connectorMaximumPower / unitDivider,
-                    connectorMinimumPower / unitDivider,
-                    {
-                      limitationEnabled:
-                        chargingStation.stationInfo?.customValueLimitationMeterValues,
-                      fallbackValue: connectorMinimumPower / unitDivider,
-                    },
-                  ) / chargingStation.getNumberOfPhases(),
-                  powerSampledValueTemplate.fluctuationPercent ??
-                    Constants.DEFAULT_FLUCTUATION_PERCENT,
-                )
-              : undefined;
-            const phase1FluctuatedValue = isNotEmptyString(
-              powerPerPhaseSampledValueTemplates.L1?.value,
-            )
-              ? getRandomFloatFluctuatedRounded(
-                  OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                    powerPerPhaseSampledValueTemplates.L1?.value,
-                    connectorMaximumPowerPerPhase / unitDivider,
-                    connectorMinimumPowerPerPhase / unitDivider,
-                    {
-                      limitationEnabled:
-                        chargingStation.stationInfo?.customValueLimitationMeterValues,
-                      fallbackValue: connectorMinimumPowerPerPhase / unitDivider,
-                    },
-                  ),
-                  powerPerPhaseSampledValueTemplates.L1?.fluctuationPercent ??
-                    Constants.DEFAULT_FLUCTUATION_PERCENT,
-                )
-              : undefined;
-            const phase2FluctuatedValue = isNotEmptyString(
-              powerPerPhaseSampledValueTemplates.L2?.value,
-            )
-              ? getRandomFloatFluctuatedRounded(
-                  OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                    powerPerPhaseSampledValueTemplates.L2?.value,
-                    connectorMaximumPowerPerPhase / unitDivider,
-                    connectorMinimumPowerPerPhase / unitDivider,
-                    {
-                      limitationEnabled:
-                        chargingStation.stationInfo?.customValueLimitationMeterValues,
-                      fallbackValue: connectorMinimumPowerPerPhase / unitDivider,
-                    },
-                  ),
-                  powerPerPhaseSampledValueTemplates.L2?.fluctuationPercent ??
-                    Constants.DEFAULT_FLUCTUATION_PERCENT,
-                )
-              : undefined;
-            const phase3FluctuatedValue = isNotEmptyString(
-              powerPerPhaseSampledValueTemplates.L3?.value,
-            )
-              ? getRandomFloatFluctuatedRounded(
-                  OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                    powerPerPhaseSampledValueTemplates.L3?.value,
-                    connectorMaximumPowerPerPhase / unitDivider,
-                    connectorMinimumPowerPerPhase / unitDivider,
-                    {
-                      limitationEnabled:
-                        chargingStation.stationInfo?.customValueLimitationMeterValues,
-                      fallbackValue: connectorMinimumPowerPerPhase / unitDivider,
-                    },
-                  ),
-                  powerPerPhaseSampledValueTemplates.L3?.fluctuationPercent ??
-                    Constants.DEFAULT_FLUCTUATION_PERCENT,
-                )
-              : undefined;
-            powerMeasurandValues.L1 =
-              phase1FluctuatedValue ??
-              defaultFluctuatedPowerPerPhase ??
-              getRandomFloatRounded(
-                connectorMaximumPowerPerPhase / unitDivider,
-                connectorMinimumPowerPerPhase / unitDivider,
-              );
-            powerMeasurandValues.L2 =
-              phase2FluctuatedValue ??
-              defaultFluctuatedPowerPerPhase ??
-              getRandomFloatRounded(
-                connectorMaximumPowerPerPhase / unitDivider,
-                connectorMinimumPowerPerPhase / unitDivider,
-              );
-            powerMeasurandValues.L3 =
-              phase3FluctuatedValue ??
-              defaultFluctuatedPowerPerPhase ??
-              getRandomFloatRounded(
-                connectorMaximumPowerPerPhase / unitDivider,
-                connectorMinimumPowerPerPhase / unitDivider,
-              );
-          } else {
-            powerMeasurandValues.L1 = isNotEmptyString(powerSampledValueTemplate.value)
-              ? getRandomFloatFluctuatedRounded(
-                  OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                    powerSampledValueTemplate.value,
-                    connectorMaximumPower / unitDivider,
-                    connectorMinimumPower / unitDivider,
-                    {
-                      limitationEnabled:
-                        chargingStation.stationInfo?.customValueLimitationMeterValues,
-                      fallbackValue: connectorMinimumPower / unitDivider,
-                    },
-                  ),
-                  powerSampledValueTemplate.fluctuationPercent ??
-                    Constants.DEFAULT_FLUCTUATION_PERCENT,
-                )
-              : getRandomFloatRounded(
-                  connectorMaximumPower / unitDivider,
-                  connectorMinimumPower / unitDivider,
-                );
-            powerMeasurandValues.L2 = 0;
-            powerMeasurandValues.L3 = 0;
-          }
-          powerMeasurandValues.allPhases = roundTo(
-            powerMeasurandValues.L1 + powerMeasurandValues.L2 + powerMeasurandValues.L3,
-            2,
-          );
-          break;
-        case CurrentType.DC:
-          powerMeasurandValues.allPhases = isNotEmptyString(powerSampledValueTemplate.value)
-            ? getRandomFloatFluctuatedRounded(
-                OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                  powerSampledValueTemplate.value,
-                  connectorMaximumPower / unitDivider,
-                  connectorMinimumPower / unitDivider,
-                  {
-                    limitationEnabled:
-                      chargingStation.stationInfo?.customValueLimitationMeterValues,
-                    fallbackValue: connectorMinimumPower / unitDivider,
-                  },
-                ),
-                powerSampledValueTemplate.fluctuationPercent ??
-                  Constants.DEFAULT_FLUCTUATION_PERCENT,
-              )
-            : getRandomFloatRounded(
-                connectorMaximumPower / unitDivider,
-                connectorMinimumPower / unitDivider,
-              );
-          break;
-        default:
-          logger.error(`${chargingStation.logPrefix()} ${errMsg}`);
-          throw new OCPPError(ErrorType.INTERNAL_ERROR, errMsg, OCPP16RequestCommand.METER_VALUES);
-      }
-      meterValue.sampledValue.push(
-        OCPP16ServiceUtils.buildSampledValue(
-          powerSampledValueTemplate,
-          powerMeasurandValues.allPhases,
-        ),
-      );
-      const sampledValuesIndex = meterValue.sampledValue.length - 1;
-      const connectorMaximumPowerRounded = roundTo(connectorMaximumPower / unitDivider, 2);
-      const connectorMinimumPowerRounded = roundTo(connectorMinimumPower / unitDivider, 2);
-      if (
-        convertToFloat(meterValue.sampledValue[sampledValuesIndex].value) >
-          connectorMaximumPowerRounded ||
-        convertToFloat(meterValue.sampledValue[sampledValuesIndex].value) <
-          connectorMinimumPowerRounded ||
-        debug
-      ) {
-        logger.error(
-          `${chargingStation.logPrefix()} MeterValues measurand ${
-            meterValue.sampledValue[sampledValuesIndex].measurand ??
-            OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-          }: connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${connectorMinimumPowerRounded}/${
-            meterValue.sampledValue[sampledValuesIndex].value
-          }/${connectorMaximumPowerRounded}`,
-        );
-      }
-      for (
-        let phase = 1;
-        chargingStation.getNumberOfPhases() === 3 && phase <= chargingStation.getNumberOfPhases();
-        phase++
-      ) {
-        const phaseValue = `L${phase}-N`;
-        meterValue.sampledValue.push(
-          OCPP16ServiceUtils.buildSampledValue(
-            powerPerPhaseSampledValueTemplates[
-              `L${phase}` as keyof MeasurandPerPhaseSampledValueTemplates
-            ] ?? powerSampledValueTemplate,
-            powerMeasurandValues[`L${phase}` as keyof MeasurandPerPhaseSampledValueTemplates],
-            undefined,
-            phaseValue as OCPP16MeterValuePhase,
-          ),
-        );
-        const sampledValuesPerPhaseIndex = meterValue.sampledValue.length - 1;
-        const connectorMaximumPowerPerPhaseRounded = roundTo(
-          connectorMaximumPowerPerPhase / unitDivider,
-          2,
-        );
-        const connectorMinimumPowerPerPhaseRounded = roundTo(
-          connectorMinimumPowerPerPhase / unitDivider,
-          2,
-        );
-        if (
-          convertToFloat(meterValue.sampledValue[sampledValuesPerPhaseIndex].value) >
-            connectorMaximumPowerPerPhaseRounded ||
-          convertToFloat(meterValue.sampledValue[sampledValuesPerPhaseIndex].value) <
-            connectorMinimumPowerPerPhaseRounded ||
-          debug
-        ) {
-          logger.error(
-            `${chargingStation.logPrefix()} MeterValues measurand ${
-              meterValue.sampledValue[sampledValuesPerPhaseIndex].measurand ??
-              OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-            }: phase ${
-              meterValue.sampledValue[sampledValuesPerPhaseIndex].phase
-            }, connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${connectorMinimumPowerPerPhaseRounded}/${
-              meterValue.sampledValue[sampledValuesPerPhaseIndex].value
-            }/${connectorMaximumPowerPerPhaseRounded}`,
-          );
-        }
-      }
-    }
-    // Current.Import measurand
-    const currentSampledValueTemplate = OCPP16ServiceUtils.getSampledValueTemplate(
-      chargingStation,
-      connectorId,
-      OCPP16MeterValueMeasurand.CURRENT_IMPORT,
-    );
-    let currentPerPhaseSampledValueTemplates: MeasurandPerPhaseSampledValueTemplates = {};
-    if (chargingStation.getNumberOfPhases() === 3) {
-      currentPerPhaseSampledValueTemplates = {
-        L1: OCPP16ServiceUtils.getSampledValueTemplate(
-          chargingStation,
-          connectorId,
-          OCPP16MeterValueMeasurand.CURRENT_IMPORT,
-          OCPP16MeterValuePhase.L1,
-        ),
-        L2: OCPP16ServiceUtils.getSampledValueTemplate(
-          chargingStation,
-          connectorId,
-          OCPP16MeterValueMeasurand.CURRENT_IMPORT,
-          OCPP16MeterValuePhase.L2,
-        ),
-        L3: OCPP16ServiceUtils.getSampledValueTemplate(
-          chargingStation,
-          connectorId,
-          OCPP16MeterValueMeasurand.CURRENT_IMPORT,
-          OCPP16MeterValuePhase.L3,
-        ),
-      };
-    }
-    if (currentSampledValueTemplate) {
-      OCPP16ServiceUtils.checkMeasurandPowerDivider(
-        chargingStation,
-        currentSampledValueTemplate.measurand!,
-      );
-      const errMsg = `MeterValues measurand ${
-        currentSampledValueTemplate.measurand ??
-        OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-      }: Unknown ${chargingStation.stationInfo?.currentOutType} currentOutType in template file ${
-        chargingStation.templateFile
-      }, cannot calculate ${
-        currentSampledValueTemplate.measurand ??
-        OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-      } measurand value`;
-      const currentMeasurandValues: MeasurandValues = {} as MeasurandValues;
-      const connectorMaximumAvailablePower =
-        chargingStation.getConnectorMaximumAvailablePower(connectorId);
-      const connectorMinimumAmperage = currentSampledValueTemplate.minimumValue ?? 0;
-      let connectorMaximumAmperage: number;
-      switch (chargingStation.stationInfo?.currentOutType) {
-        case CurrentType.AC:
-          connectorMaximumAmperage = ACElectricUtils.amperagePerPhaseFromPower(
-            chargingStation.getNumberOfPhases(),
-            connectorMaximumAvailablePower,
-            chargingStation.stationInfo.voltageOut!,
-          );
-          if (chargingStation.getNumberOfPhases() === 3) {
-            const defaultFluctuatedAmperagePerPhase = isNotEmptyString(
-              currentSampledValueTemplate.value,
-            )
-              ? getRandomFloatFluctuatedRounded(
-                  OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                    currentSampledValueTemplate.value,
-                    connectorMaximumAmperage,
-                    connectorMinimumAmperage,
-                    {
-                      limitationEnabled:
-                        chargingStation.stationInfo?.customValueLimitationMeterValues,
-                      fallbackValue: connectorMinimumAmperage,
-                    },
-                  ),
-                  currentSampledValueTemplate.fluctuationPercent ??
-                    Constants.DEFAULT_FLUCTUATION_PERCENT,
-                )
-              : undefined;
-            const phase1FluctuatedValue = isNotEmptyString(
-              currentPerPhaseSampledValueTemplates.L1?.value,
-            )
-              ? getRandomFloatFluctuatedRounded(
-                  OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                    currentPerPhaseSampledValueTemplates.L1?.value,
-                    connectorMaximumAmperage,
-                    connectorMinimumAmperage,
-                    {
-                      limitationEnabled:
-                        chargingStation.stationInfo?.customValueLimitationMeterValues,
-                      fallbackValue: connectorMinimumAmperage,
-                    },
-                  ),
-                  currentPerPhaseSampledValueTemplates.L1?.fluctuationPercent ??
-                    Constants.DEFAULT_FLUCTUATION_PERCENT,
-                )
-              : undefined;
-            const phase2FluctuatedValue = isNotEmptyString(
-              currentPerPhaseSampledValueTemplates.L2?.value,
-            )
-              ? getRandomFloatFluctuatedRounded(
-                  OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                    currentPerPhaseSampledValueTemplates.L2?.value,
-                    connectorMaximumAmperage,
-                    connectorMinimumAmperage,
-                    {
-                      limitationEnabled:
-                        chargingStation.stationInfo?.customValueLimitationMeterValues,
-                      fallbackValue: connectorMinimumAmperage,
-                    },
-                  ),
-                  currentPerPhaseSampledValueTemplates.L2?.fluctuationPercent ??
-                    Constants.DEFAULT_FLUCTUATION_PERCENT,
-                )
-              : undefined;
-            const phase3FluctuatedValue = isNotEmptyString(
-              currentPerPhaseSampledValueTemplates.L3?.value,
-            )
-              ? getRandomFloatFluctuatedRounded(
-                  OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                    currentPerPhaseSampledValueTemplates.L3?.value,
-                    connectorMaximumAmperage,
-                    connectorMinimumAmperage,
-                    {
-                      limitationEnabled:
-                        chargingStation.stationInfo?.customValueLimitationMeterValues,
-                      fallbackValue: connectorMinimumAmperage,
-                    },
-                  ),
-                  currentPerPhaseSampledValueTemplates.L3?.fluctuationPercent ??
-                    Constants.DEFAULT_FLUCTUATION_PERCENT,
-                )
-              : undefined;
-            currentMeasurandValues.L1 =
-              phase1FluctuatedValue ??
-              defaultFluctuatedAmperagePerPhase ??
-              getRandomFloatRounded(connectorMaximumAmperage, connectorMinimumAmperage);
-            currentMeasurandValues.L2 =
-              phase2FluctuatedValue ??
-              defaultFluctuatedAmperagePerPhase ??
-              getRandomFloatRounded(connectorMaximumAmperage, connectorMinimumAmperage);
-            currentMeasurandValues.L3 =
-              phase3FluctuatedValue ??
-              defaultFluctuatedAmperagePerPhase ??
-              getRandomFloatRounded(connectorMaximumAmperage, connectorMinimumAmperage);
-          } else {
-            currentMeasurandValues.L1 = isNotEmptyString(currentSampledValueTemplate.value)
-              ? getRandomFloatFluctuatedRounded(
-                  OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                    currentSampledValueTemplate.value,
-                    connectorMaximumAmperage,
-                    connectorMinimumAmperage,
-                    {
-                      limitationEnabled:
-                        chargingStation.stationInfo?.customValueLimitationMeterValues,
-                      fallbackValue: connectorMinimumAmperage,
-                    },
-                  ),
-                  currentSampledValueTemplate.fluctuationPercent ??
-                    Constants.DEFAULT_FLUCTUATION_PERCENT,
-                )
-              : getRandomFloatRounded(connectorMaximumAmperage, connectorMinimumAmperage);
-            currentMeasurandValues.L2 = 0;
-            currentMeasurandValues.L3 = 0;
-          }
-          currentMeasurandValues.allPhases = roundTo(
-            (currentMeasurandValues.L1 + currentMeasurandValues.L2 + currentMeasurandValues.L3) /
-              chargingStation.getNumberOfPhases(),
-            2,
-          );
-          break;
-        case CurrentType.DC:
-          connectorMaximumAmperage = DCElectricUtils.amperage(
-            connectorMaximumAvailablePower,
-            chargingStation.stationInfo.voltageOut!,
-          );
-          currentMeasurandValues.allPhases = isNotEmptyString(currentSampledValueTemplate.value)
-            ? getRandomFloatFluctuatedRounded(
-                OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-                  currentSampledValueTemplate.value,
-                  connectorMaximumAmperage,
-                  connectorMinimumAmperage,
-                  {
-                    limitationEnabled:
-                      chargingStation.stationInfo?.customValueLimitationMeterValues,
-                    fallbackValue: connectorMinimumAmperage,
-                  },
-                ),
-                currentSampledValueTemplate.fluctuationPercent ??
-                  Constants.DEFAULT_FLUCTUATION_PERCENT,
-              )
-            : getRandomFloatRounded(connectorMaximumAmperage, connectorMinimumAmperage);
-          break;
-        default:
-          logger.error(`${chargingStation.logPrefix()} ${errMsg}`);
-          throw new OCPPError(ErrorType.INTERNAL_ERROR, errMsg, OCPP16RequestCommand.METER_VALUES);
-      }
-      meterValue.sampledValue.push(
-        OCPP16ServiceUtils.buildSampledValue(
-          currentSampledValueTemplate,
-          currentMeasurandValues.allPhases,
-        ),
-      );
-      const sampledValuesIndex = meterValue.sampledValue.length - 1;
-      if (
-        convertToFloat(meterValue.sampledValue[sampledValuesIndex].value) >
-          connectorMaximumAmperage ||
-        convertToFloat(meterValue.sampledValue[sampledValuesIndex].value) <
-          connectorMinimumAmperage ||
-        debug
-      ) {
-        logger.error(
-          `${chargingStation.logPrefix()} MeterValues measurand ${
-            meterValue.sampledValue[sampledValuesIndex].measurand ??
-            OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-          }: connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${connectorMinimumAmperage}/${
-            meterValue.sampledValue[sampledValuesIndex].value
-          }/${connectorMaximumAmperage}`,
-        );
-      }
-      for (
-        let phase = 1;
-        chargingStation.getNumberOfPhases() === 3 && phase <= chargingStation.getNumberOfPhases();
-        phase++
-      ) {
-        const phaseValue = `L${phase}`;
-        meterValue.sampledValue.push(
-          OCPP16ServiceUtils.buildSampledValue(
-            currentPerPhaseSampledValueTemplates[
-              phaseValue as keyof MeasurandPerPhaseSampledValueTemplates
-            ] ?? currentSampledValueTemplate,
-            currentMeasurandValues[phaseValue as keyof MeasurandPerPhaseSampledValueTemplates],
-            undefined,
-            phaseValue as OCPP16MeterValuePhase,
-          ),
-        );
-        const sampledValuesPerPhaseIndex = meterValue.sampledValue.length - 1;
-        if (
-          convertToFloat(meterValue.sampledValue[sampledValuesPerPhaseIndex].value) >
-            connectorMaximumAmperage ||
-          convertToFloat(meterValue.sampledValue[sampledValuesPerPhaseIndex].value) <
-            connectorMinimumAmperage ||
-          debug
-        ) {
-          logger.error(
-            `${chargingStation.logPrefix()} MeterValues measurand ${
-              meterValue.sampledValue[sampledValuesPerPhaseIndex].measurand ??
-              OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-            }: phase ${
-              meterValue.sampledValue[sampledValuesPerPhaseIndex].phase
-            }, connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${connectorMinimumAmperage}/${
-              meterValue.sampledValue[sampledValuesPerPhaseIndex].value
-            }/${connectorMaximumAmperage}`,
-          );
-        }
-      }
-    }
-    // Energy.Active.Import.Register measurand (default)
-    const energySampledValueTemplate = OCPP16ServiceUtils.getSampledValueTemplate(
-      chargingStation,
-      connectorId,
-    );
-    if (energySampledValueTemplate) {
-      OCPP16ServiceUtils.checkMeasurandPowerDivider(
-        chargingStation,
-        energySampledValueTemplate.measurand!,
-      );
-      const unitDivider =
-        energySampledValueTemplate?.unit === MeterValueUnit.KILO_WATT_HOUR ? 1000 : 1;
-      const connectorMaximumAvailablePower =
-        chargingStation.getConnectorMaximumAvailablePower(connectorId);
-      const connectorMaximumEnergyRounded = roundTo(
-        (connectorMaximumAvailablePower * interval) / (3600 * 1000),
-        2,
-      );
-      const connectorMinimumEnergyRounded = roundTo(
-        energySampledValueTemplate.minimumValue ?? 0,
-        2,
-      );
-      const energyValueRounded = isNotEmptyString(energySampledValueTemplate.value)
-        ? getRandomFloatFluctuatedRounded(
-            OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
-              energySampledValueTemplate.value,
-              connectorMaximumEnergyRounded,
-              connectorMinimumEnergyRounded,
-              {
-                limitationEnabled: chargingStation.stationInfo?.customValueLimitationMeterValues,
-                fallbackValue: connectorMinimumEnergyRounded,
-                unitMultiplier: unitDivider,
-              },
-            ),
-            energySampledValueTemplate.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT,
-          )
-        : getRandomFloatRounded(connectorMaximumEnergyRounded, connectorMinimumEnergyRounded);
-      // Persist previous value on connector
-      if (connector) {
-        if (
-          isNullOrUndefined(connector.energyActiveImportRegisterValue) === false &&
-          connector.energyActiveImportRegisterValue! >= 0 &&
-          isNullOrUndefined(connector.transactionEnergyActiveImportRegisterValue) === false &&
-          connector.transactionEnergyActiveImportRegisterValue! >= 0
-        ) {
-          connector.energyActiveImportRegisterValue! += energyValueRounded;
-          connector.transactionEnergyActiveImportRegisterValue! += energyValueRounded;
-        } else {
-          connector.energyActiveImportRegisterValue = 0;
-          connector.transactionEnergyActiveImportRegisterValue = 0;
-        }
-      }
-      meterValue.sampledValue.push(
-        OCPP16ServiceUtils.buildSampledValue(
-          energySampledValueTemplate,
-          roundTo(
-            chargingStation.getEnergyActiveImportRegisterByTransactionId(transactionId) /
-              unitDivider,
-            2,
-          ),
-        ),
-      );
-      const sampledValuesIndex = meterValue.sampledValue.length - 1;
-      if (
-        energyValueRounded > connectorMaximumEnergyRounded ||
-        energyValueRounded < connectorMinimumEnergyRounded ||
-        debug
-      ) {
-        logger.error(
-          `${chargingStation.logPrefix()} MeterValues measurand ${
-            meterValue.sampledValue[sampledValuesIndex].measurand ??
-            OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-          }: connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${connectorMinimumEnergyRounded}/${energyValueRounded}/${connectorMaximumEnergyRounded}, duration: ${interval}ms`,
-        );
-      }
-    }
-    return meterValue;
-  }
-
   public static buildTransactionBeginMeterValue(
     chargingStation: ChargingStation,
     connectorId: number,
@@ -854,37 +71,13 @@ export class OCPP16ServiceUtils extends OCPPServiceUtils {
       chargingStation,
       connectorId,
     );
-    const unitDivider = sampledValueTemplate?.unit === MeterValueUnit.KILO_WATT_HOUR ? 1000 : 1;
+    const unitDivider =
+      sampledValueTemplate?.unit === OCPP16MeterValueUnit.KILO_WATT_HOUR ? 1000 : 1;
     meterValue.sampledValue.push(
       OCPP16ServiceUtils.buildSampledValue(
         sampledValueTemplate!,
         roundTo((meterStart ?? 0) / unitDivider, 4),
-        MeterValueContext.TRANSACTION_BEGIN,
-      ),
-    );
-    return meterValue;
-  }
-
-  public static buildTransactionEndMeterValue(
-    chargingStation: ChargingStation,
-    connectorId: number,
-    meterStop: number,
-  ): OCPP16MeterValue {
-    const meterValue: OCPP16MeterValue = {
-      timestamp: new Date(),
-      sampledValue: [],
-    };
-    // Energy.Active.Import.Register measurand (default)
-    const sampledValueTemplate = OCPP16ServiceUtils.getSampledValueTemplate(
-      chargingStation,
-      connectorId,
-    );
-    const unitDivider = sampledValueTemplate?.unit === MeterValueUnit.KILO_WATT_HOUR ? 1000 : 1;
-    meterValue.sampledValue.push(
-      OCPP16ServiceUtils.buildSampledValue(
-        sampledValueTemplate!,
-        roundTo((meterStop ?? 0) / unitDivider, 4),
-        MeterValueContext.TRANSACTION_END,
+        OCPP16MeterValueContext.TRANSACTION_BEGIN,
       ),
     );
     return meterValue;
@@ -988,7 +181,7 @@ export class OCPP16ServiceUtils extends OCPPServiceUtils {
 
   public static clearChargingProfiles = (
     chargingStation: ChargingStation,
-    commandPayload: ClearChargingProfileRequest,
+    commandPayload: OCPP16ClearChargingProfileRequest,
     chargingProfiles: OCPP16ChargingProfile[] | undefined,
   ): boolean => {
     const { id, chargingProfilePurpose, stackLevel } = commandPayload;
@@ -1329,79 +522,4 @@ export class OCPP16ServiceUtils extends OCPPServiceUtils {
       return chargingSchedule;
     }
   };
-
-  private static buildSampledValue(
-    sampledValueTemplate: SampledValueTemplate,
-    value: number,
-    context?: MeterValueContext,
-    phase?: OCPP16MeterValuePhase,
-  ): OCPP16SampledValue {
-    const sampledValueContext = context ?? sampledValueTemplate?.context;
-    const sampledValueLocation =
-      sampledValueTemplate?.location ??
-      OCPP16ServiceUtils.getMeasurandDefaultLocation(sampledValueTemplate.measurand!);
-    const sampledValuePhase = phase ?? sampledValueTemplate?.phase;
-    return {
-      ...(!isNullOrUndefined(sampledValueTemplate.unit) && {
-        unit: sampledValueTemplate.unit,
-      }),
-      ...(!isNullOrUndefined(sampledValueContext) && { context: sampledValueContext }),
-      ...(!isNullOrUndefined(sampledValueTemplate.measurand) && {
-        measurand: sampledValueTemplate.measurand,
-      }),
-      ...(!isNullOrUndefined(sampledValueLocation) && { location: sampledValueLocation }),
-      ...(!isNullOrUndefined(value) && { value: value.toString() }),
-      ...(!isNullOrUndefined(sampledValuePhase) && { phase: sampledValuePhase }),
-    } as OCPP16SampledValue;
-  }
-
-  private static checkMeasurandPowerDivider(
-    chargingStation: ChargingStation,
-    measurandType: OCPP16MeterValueMeasurand,
-  ): void {
-    if (isUndefined(chargingStation.powerDivider)) {
-      const errMsg = `MeterValues measurand ${
-        measurandType ?? OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-      }: powerDivider is undefined`;
-      logger.error(`${chargingStation.logPrefix()} ${errMsg}`);
-      throw new OCPPError(ErrorType.INTERNAL_ERROR, errMsg, OCPP16RequestCommand.METER_VALUES);
-    } else if (chargingStation?.powerDivider <= 0) {
-      const errMsg = `MeterValues measurand ${
-        measurandType ?? OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
-      }: powerDivider have zero or below value ${chargingStation.powerDivider}`;
-      logger.error(`${chargingStation.logPrefix()} ${errMsg}`);
-      throw new OCPPError(ErrorType.INTERNAL_ERROR, errMsg, OCPP16RequestCommand.METER_VALUES);
-    }
-  }
-
-  private static getMeasurandDefaultLocation(
-    measurandType: OCPP16MeterValueMeasurand,
-  ): MeterValueLocation | undefined {
-    switch (measurandType) {
-      case OCPP16MeterValueMeasurand.STATE_OF_CHARGE:
-        return MeterValueLocation.EV;
-    }
-  }
-
-  // private static getMeasurandDefaultUnit(
-  //   measurandType: OCPP16MeterValueMeasurand,
-  // ): MeterValueUnit | undefined {
-  //   switch (measurandType) {
-  //     case OCPP16MeterValueMeasurand.CURRENT_EXPORT:
-  //     case OCPP16MeterValueMeasurand.CURRENT_IMPORT:
-  //     case OCPP16MeterValueMeasurand.CURRENT_OFFERED:
-  //       return MeterValueUnit.AMP;
-  //     case OCPP16MeterValueMeasurand.ENERGY_ACTIVE_EXPORT_REGISTER:
-  //     case OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER:
-  //       return MeterValueUnit.WATT_HOUR;
-  //     case OCPP16MeterValueMeasurand.POWER_ACTIVE_EXPORT:
-  //     case OCPP16MeterValueMeasurand.POWER_ACTIVE_IMPORT:
-  //     case OCPP16MeterValueMeasurand.POWER_OFFERED:
-  //       return MeterValueUnit.WATT;
-  //     case OCPP16MeterValueMeasurand.STATE_OF_CHARGE:
-  //       return MeterValueUnit.PERCENT;
-  //     case OCPP16MeterValueMeasurand.VOLTAGE:
-  //       return MeterValueUnit.VOLT;
-  //   }
-  // }
 }