import { HeartbeatRequest, OCPP16BootNotificationRequest, OCPP16IncomingRequestCommand, OCPP16RequestCommand, StatusNotificationRequest } from '../../../types/ocpp/1.6/Requests';
import { MeterValue, MeterValueLocation, MeterValuePhase, MeterValueUnit, MeterValuesRequest, OCPP16MeterValueMeasurand, OCPP16SampledValue } from '../../../types/ocpp/1.6/MeterValues';
+import { ACElectricUtils } from '../../../utils/ElectricUtils';
import Constants from '../../../utils/Constants';
-import ElectricUtils from '../../../utils/ElectricUtils';
import MeasurandValues from '../../../types/MeasurandValues';
import { MessageType } from '../../../types/ocpp/MessageType';
import { OCPP16BootNotificationResponse } from '../../../types/ocpp/1.6/Responses';
let maxAmperage: number;
switch (self.chargingStation.getPowerOutType()) {
case PowerOutType.AC:
- maxAmperage = ElectricUtils.ampPerPhaseFromPower(self.chargingStation.getNumberOfPhases(), self.chargingStation.stationInfo.maxPower / self.chargingStation.stationInfo.powerDivider, self.chargingStation.getVoltageOut());
+ maxAmperage = ACElectricUtils.amperagePerPhaseFromPower(self.chargingStation.getNumberOfPhases(), self.chargingStation.stationInfo.maxPower / self.chargingStation.stationInfo.powerDivider, self.chargingStation.getVoltageOut());
if (Utils.isUndefined(meterValuesTemplate[index].value)) {
currentMeasurandValues.L1 = Utils.getRandomFloatRounded(maxAmperage);
currentMeasurandValues.L2 = 0;
}
break;
case PowerOutType.DC:
- maxAmperage = ElectricUtils.ampTotalFromPower(self.chargingStation.stationInfo.maxPower / self.chargingStation.stationInfo.powerDivider, self.chargingStation.getVoltageOut());
+ maxAmperage = ACElectricUtils.amperageTotalFromPower(self.chargingStation.stationInfo.maxPower / self.chargingStation.stationInfo.powerDivider, self.chargingStation.getVoltageOut());
if (Utils.isUndefined(meterValuesTemplate[index].value)) {
currentMeasurandValues.allPhases = Utils.getRandomFloatRounded(maxAmperage);
}
/**
* Rationale: https://wiki.piment-noir.org/doku.php/en:cs:modelling_multi-phased_electrical_system_interconnexion
+ */
+
+/**
* Targeted to AC related values calculation.
- * To use for DC, always consider cosPhi = 1 and do not use per phase helpers
*/
-export default class ElectricUtils {
- static ampTotal(nbOfPhases: number, Iph: number): number {
+export class ACElectricUtils {
+ static amperageTotal(nbOfPhases: number, Iph: number): number {
return nbOfPhases * Iph;
}
}
static powerTotal(nbOfPhases: number, V: number, Iph: number, cosPhi = 1): number {
- return nbOfPhases * ElectricUtils.powerPerPhase(V, Iph, cosPhi);
+ return nbOfPhases * ACElectricUtils.powerPerPhase(V, Iph, cosPhi);
}
- static ampTotalFromPower(P: number, V: number, cosPhi = 1): number {
- const power = P / (V * cosPhi);
+ static amperageTotalFromPower(P: number, V: number, cosPhi = 1): number {
+ const amperage = P / (V * cosPhi);
if (cosPhi === 1 && P % V === 0) {
- return power;
+ return amperage;
}
- return Math.round(power);
+ return Math.round(amperage);
}
- static ampPerPhaseFromPower(nbOfPhases: number, P: number, V: number, cosPhi = 1): number {
- const power = ElectricUtils.ampTotalFromPower(P, V, cosPhi);
- const powerPerPhase = power / nbOfPhases;
- if (power % nbOfPhases === 0) {
- return powerPerPhase;
+ static amperagePerPhaseFromPower(nbOfPhases: number, P: number, V: number, cosPhi = 1): number {
+ const amperage = ACElectricUtils.amperageTotalFromPower(P, V, cosPhi);
+ const amperagePerPhase = amperage / nbOfPhases;
+ if (amperage % nbOfPhases === 0) {
+ return amperagePerPhase;
}
- return Math.round(powerPerPhase);
+ return Math.round(amperagePerPhase);
+ }
+}
+
+/**
+ * Targeted to DC related values calculation.
+ */
+export class DCElectricUtils {
+ static power(V: number, I: number): number {
+ return V * I;
+ }
+
+ static amperage(P: number, V: number): number {
+ const amperage = P / V;
+ if (P % V === 0) {
+ return amperage;
+ }
+ return Math.round(amperage);
}
}