OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
}: connector id ${connectorId}, transaction id ${connector?.transactionId}, value: ${socMinimumValue}/${
meterValue.sampledValue[sampledValuesIndex].value
- }/${socMaximumValue}}`,
+ }/${socMaximumValue}`,
);
}
}
if (voltageSampledValueTemplate) {
const voltageSampledValueTemplateValue = voltageSampledValueTemplate.value
? parseInt(voltageSampledValueTemplate.value)
- : chargingStation.getVoltageOut();
+ : chargingStation.stationInfo.voltageOut!;
const fluctuationPercent =
voltageSampledValueTemplate.fluctuationPercent ?? Constants.DEFAULT_FLUCTUATION_PERCENT;
const voltageMeasurandValue = getRandomFloatFluctuatedRounded(
);
if (
chargingStation.getNumberOfPhases() !== 3 ||
- (chargingStation.getNumberOfPhases() === 3 && chargingStation.getMainVoltageMeterValues())
+ (chargingStation.getNumberOfPhases() === 3 &&
+ chargingStation.stationInfo?.mainVoltageMeterValues)
) {
meterValue.sampledValue.push(
OCPP16ServiceUtils.buildSampledValue(voltageSampledValueTemplate, voltageMeasurandValue),
const voltagePhaseLineToNeutralSampledValueTemplateValue =
voltagePhaseLineToNeutralSampledValueTemplate.value
? parseInt(voltagePhaseLineToNeutralSampledValueTemplate.value)
- : chargingStation.getVoltageOut();
+ : chargingStation.stationInfo.voltageOut!;
const fluctuationPhaseToNeutralPercent =
voltagePhaseLineToNeutralSampledValueTemplate.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT;
phaseLineToNeutralValue as OCPP16MeterValuePhase,
),
);
- if (chargingStation.getPhaseLineToLineVoltageMeterValues()) {
+ if (chargingStation.stationInfo?.phaseLineToLineVoltageMeterValues) {
const phaseLineToLineValue = `L${phase}-L${
(phase + 1) % chargingStation.getNumberOfPhases() !== 0
? (phase + 1) % chargingStation.getNumberOfPhases()
const errMsg = `MeterValues measurand ${
powerSampledValueTemplate.measurand ??
OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
- }: Unknown ${chargingStation.getCurrentOutType()} currentOutType in template file ${
+ }: Unknown ${chargingStation.stationInfo?.currentOutType} currentOutType in template file ${
chargingStation.templateFile
}, cannot calculate ${
powerSampledValueTemplate.measurand ??
const connectorMinimumPowerPerPhase = Math.round(
connectorMinimumPower / chargingStation.getNumberOfPhases(),
);
- switch (chargingStation.getCurrentOutType()) {
+ switch (chargingStation.stationInfo?.currentOutType) {
case CurrentType.AC:
if (chargingStation.getNumberOfPhases() === 3) {
const defaultFluctuatedPowerPerPhase =
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
powerSampledValueTemplate.value,
connectorMaximumPower / unitDivider,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
) / chargingStation.getNumberOfPhases(),
powerSampledValueTemplate.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
powerPerPhaseSampledValueTemplates.L1.value,
connectorMaximumPowerPerPhase / unitDivider,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
),
powerPerPhaseSampledValueTemplates.L1.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
powerPerPhaseSampledValueTemplates.L2.value,
connectorMaximumPowerPerPhase / unitDivider,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
),
powerPerPhaseSampledValueTemplates.L2.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
powerPerPhaseSampledValueTemplates.L3.value,
connectorMaximumPowerPerPhase / unitDivider,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
),
powerPerPhaseSampledValueTemplates.L3.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
powerSampledValueTemplate.value,
connectorMaximumPower / unitDivider,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
),
powerSampledValueTemplate.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
powerSampledValueTemplate.value,
connectorMaximumPower / unitDivider,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
),
powerSampledValueTemplate.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
const errMsg = `MeterValues measurand ${
currentSampledValueTemplate.measurand ??
OCPP16MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER
- }: Unknown ${chargingStation.getCurrentOutType()} currentOutType in template file ${
+ }: Unknown ${chargingStation.stationInfo?.currentOutType} currentOutType in template file ${
chargingStation.templateFile
}, cannot calculate ${
currentSampledValueTemplate.measurand ??
chargingStation.getConnectorMaximumAvailablePower(connectorId);
const connectorMinimumAmperage = currentSampledValueTemplate.minimumValue ?? 0;
let connectorMaximumAmperage: number;
- switch (chargingStation.getCurrentOutType()) {
+ switch (chargingStation.stationInfo?.currentOutType) {
case CurrentType.AC:
connectorMaximumAmperage = ACElectricUtils.amperagePerPhaseFromPower(
chargingStation.getNumberOfPhases(),
connectorMaximumAvailablePower,
- chargingStation.getVoltageOut(),
+ chargingStation.stationInfo.voltageOut!,
);
if (chargingStation.getNumberOfPhases() === 3) {
const defaultFluctuatedAmperagePerPhase =
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
currentSampledValueTemplate.value,
connectorMaximumAmperage,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
),
currentSampledValueTemplate.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
currentPerPhaseSampledValueTemplates.L1.value,
connectorMaximumAmperage,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
),
currentPerPhaseSampledValueTemplates.L1.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
currentPerPhaseSampledValueTemplates.L2.value,
connectorMaximumAmperage,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
),
currentPerPhaseSampledValueTemplates.L2.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
currentPerPhaseSampledValueTemplates.L3.value,
connectorMaximumAmperage,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
),
currentPerPhaseSampledValueTemplates.L3.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
currentSampledValueTemplate.value,
connectorMaximumAmperage,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
),
currentSampledValueTemplate.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
case CurrentType.DC:
connectorMaximumAmperage = DCElectricUtils.amperage(
connectorMaximumAvailablePower,
- chargingStation.getVoltageOut(),
+ chargingStation.stationInfo.voltageOut!,
);
currentMeasurandValues.allPhases = currentSampledValueTemplate.value
? getRandomFloatFluctuatedRounded(
OCPP16ServiceUtils.getLimitFromSampledValueTemplateCustomValue(
currentSampledValueTemplate.value,
connectorMaximumAmperage,
- { limitationEnabled: chargingStation.getCustomValueLimitationMeterValues() },
+ {
+ limitationEnabled:
+ chargingStation.stationInfo?.customValueLimitationMeterValues,
+ },
),
currentSampledValueTemplate.fluctuationPercent ??
Constants.DEFAULT_FLUCTUATION_PERCENT,
energySampledValueTemplate.value,
connectorMaximumEnergyRounded,
{
- limitationEnabled: chargingStation.getCustomValueLimitationMeterValues(),
+ limitationEnabled: chargingStation.stationInfo?.customValueLimitationMeterValues,
unitMultiplier: unitDivider,
},
),
public static composeChargingSchedules = (
chargingScheduleHigher: OCPP16ChargingSchedule | undefined,
chargingScheduleLower: OCPP16ChargingSchedule | undefined,
- targetInterval: Interval,
+ compositeInterval: Interval,
): OCPP16ChargingSchedule | undefined => {
if (!chargingScheduleHigher && !chargingScheduleLower) {
return undefined;
}
if (chargingScheduleHigher && !chargingScheduleLower) {
- return OCPP16ServiceUtils.composeChargingSchedule(chargingScheduleHigher, targetInterval);
+ return OCPP16ServiceUtils.composeChargingSchedule(chargingScheduleHigher, compositeInterval);
}
if (!chargingScheduleHigher && chargingScheduleLower) {
- return OCPP16ServiceUtils.composeChargingSchedule(chargingScheduleLower, targetInterval);
+ return OCPP16ServiceUtils.composeChargingSchedule(chargingScheduleLower, compositeInterval);
}
const compositeChargingScheduleHigher: OCPP16ChargingSchedule | undefined =
- OCPP16ServiceUtils.composeChargingSchedule(chargingScheduleHigher!, targetInterval);
+ OCPP16ServiceUtils.composeChargingSchedule(chargingScheduleHigher!, compositeInterval);
const compositeChargingScheduleLower: OCPP16ChargingSchedule | undefined =
- OCPP16ServiceUtils.composeChargingSchedule(chargingScheduleLower!, targetInterval);
+ OCPP16ServiceUtils.composeChargingSchedule(chargingScheduleLower!, compositeInterval);
const compositeChargingScheduleHigherInterval: Interval = {
start: compositeChargingScheduleHigher!.startSchedule!,
end: addSeconds(
};
}),
...compositeChargingScheduleLower!.chargingSchedulePeriod
- .filter((schedulePeriod) => {
+ .filter((schedulePeriod, index) => {
if (
higherFirst &&
isWithinInterval(
) {
return false;
}
+ if (
+ higherFirst &&
+ index < compositeChargingScheduleLower!.chargingSchedulePeriod.length - 1 &&
+ !isWithinInterval(
+ addSeconds(
+ compositeChargingScheduleLowerInterval.start,
+ schedulePeriod.startPeriod,
+ ),
+ {
+ start: compositeChargingScheduleLowerInterval.start,
+ end: compositeChargingScheduleHigherInterval.end,
+ },
+ ) &&
+ isWithinInterval(
+ addSeconds(
+ compositeChargingScheduleLowerInterval.start,
+ compositeChargingScheduleLower!.chargingSchedulePeriod[index + 1].startPeriod,
+ ),
+ {
+ start: compositeChargingScheduleLowerInterval.start,
+ end: compositeChargingScheduleHigherInterval.end,
+ },
+ )
+ ) {
+ return false;
+ }
if (
!higherFirst &&
isWithinInterval(
}
return true;
})
- .map((schedulePeriod) => {
+ .map((schedulePeriod, index) => {
+ if (index === 0 && schedulePeriod.startPeriod !== 0) {
+ schedulePeriod.startPeriod = 0;
+ }
return {
...schedulePeriod,
startPeriod: higherFirst
private static composeChargingSchedule = (
chargingSchedule: OCPP16ChargingSchedule,
- targetInterval: Interval,
+ compositeInterval: Interval,
): OCPP16ChargingSchedule | undefined => {
const chargingScheduleInterval: Interval = {
start: chargingSchedule.startSchedule!,
end: addSeconds(chargingSchedule.startSchedule!, chargingSchedule.duration!),
};
- if (areIntervalsOverlapping(chargingScheduleInterval, targetInterval)) {
+ if (areIntervalsOverlapping(chargingScheduleInterval, compositeInterval)) {
chargingSchedule.chargingSchedulePeriod.sort((a, b) => a.startPeriod - b.startPeriod);
- if (isBefore(chargingScheduleInterval.start, targetInterval.start)) {
+ if (isBefore(chargingScheduleInterval.start, compositeInterval.start)) {
return {
...chargingSchedule,
- startSchedule: targetInterval.start as Date,
- duration: differenceInSeconds(chargingScheduleInterval.end, targetInterval.start as Date),
- chargingSchedulePeriod: chargingSchedule.chargingSchedulePeriod.filter(
- (schedulePeriod, index) => {
+ startSchedule: compositeInterval.start as Date,
+ duration: differenceInSeconds(
+ chargingScheduleInterval.end,
+ compositeInterval.start as Date,
+ ),
+ chargingSchedulePeriod: chargingSchedule.chargingSchedulePeriod
+ .filter((schedulePeriod, index) => {
if (
isWithinInterval(
addSeconds(chargingScheduleInterval.start, schedulePeriod.startPeriod)!,
- targetInterval,
+ compositeInterval,
)
) {
return true;
index < chargingSchedule.chargingSchedulePeriod.length - 1 &&
!isWithinInterval(
addSeconds(chargingScheduleInterval.start, schedulePeriod.startPeriod),
- targetInterval,
+ compositeInterval,
) &&
isWithinInterval(
addSeconds(
chargingScheduleInterval.start,
chargingSchedule.chargingSchedulePeriod[index + 1].startPeriod,
),
- targetInterval,
+ compositeInterval,
)
) {
- schedulePeriod.startPeriod = 0;
return true;
}
return false;
- },
- ),
+ })
+ .map((schedulePeriod, index) => {
+ if (index === 0 && schedulePeriod.startPeriod !== 0) {
+ schedulePeriod.startPeriod = 0;
+ }
+ return schedulePeriod;
+ }),
};
}
- if (isAfter(chargingScheduleInterval.end, targetInterval.end)) {
+ if (isAfter(chargingScheduleInterval.end, compositeInterval.end)) {
return {
...chargingSchedule,
- duration: differenceInSeconds(targetInterval.end as Date, chargingScheduleInterval.start),
+ duration: differenceInSeconds(
+ compositeInterval.end as Date,
+ chargingScheduleInterval.start,
+ ),
chargingSchedulePeriod: chargingSchedule.chargingSchedulePeriod.filter((schedulePeriod) =>
isWithinInterval(
addSeconds(chargingScheduleInterval.start, schedulePeriod.startPeriod)!,
- targetInterval,
+ compositeInterval,
),
),
};
context?: MeterValueContext,
phase?: OCPP16MeterValuePhase,
): OCPP16SampledValue {
- const sampledValueValue = value ?? sampledValueTemplate?.value ?? null;
- const sampledValueContext = context ?? sampledValueTemplate?.context ?? null;
+ const sampledValueValue = value ?? sampledValueTemplate?.value;
+ const sampledValueContext = context ?? sampledValueTemplate?.context;
const sampledValueLocation =
sampledValueTemplate?.location ??
OCPP16ServiceUtils.getMeasurandDefaultLocation(sampledValueTemplate.measurand!);
- const sampledValuePhase = phase ?? sampledValueTemplate?.phase ?? null;
+ const sampledValuePhase = phase ?? sampledValueTemplate?.phase;
return {
...(!isNullOrUndefined(sampledValueTemplate.unit) && {
unit: sampledValueTemplate.unit,