Restructure EmuMeter Status and add AvgBatteries file

This commit is contained in:
atef 2023-02-23 16:32:06 +01:00
parent 18fa0bfc36
commit cba19ee1ed
6 changed files with 153 additions and 126 deletions

View File

@ -22,9 +22,5 @@
<ProjectReference Include="..\..\lib\Time\Time.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="src\StatusLog" />
</ItemGroup>
</Project>

View File

@ -27,46 +27,13 @@ public static class AsciiArt
.JoinLines();
}
public static String CreateBox(String title, String value)
{
if (value == "0")
{
value = "";
}
var contentWidth = Math.Max(title.Length, value.Length);
var horizontal = "".PadRight(contentWidth + 2, '-').SurroundWith("+");
var t = title.PadRight(contentWidth).SurroundWith(" ").SurroundWith("|");
var x = value.SplitLines().ToArray();
var values = "";
foreach (var line in x)
{
var temp = values;
values = line.PadRight(contentWidth).SurroundWith(" ").SurroundWith("|") + "\n";
values += temp;
}
values = values.Remove(values.LastIndexOf(Environment.NewLine));
return StringUtils.JoinLines(
horizontal,
t,
values,
horizontal
);
}
public static String CreateHorizontalArrow(Decimal value, String separator)
{
var valueToString = " " + value.W();
if (value == 0)
{
valueToString = "it's 0";
valueToString = "";
}
var contentWidth = separator.Length;

View File

@ -0,0 +1,51 @@
using InnovEnergy.Lib.Devices.Battery48TL;
namespace InnovEnergy.SaliMax.Controller;
public class AvgBatteriesStatus
{
public Decimal Soc { get; set; }
public Decimal Current { get; set; }
public Decimal Voltage { get; set; }
public Decimal Power { get; set; }
public Decimal BusVoltage { get; set; }
public Decimal BatteryTemperature { get; set; }
public IReadOnlyList<String> Warnings { get; set; }
public IReadOnlyList<String> Alarms { get; set; }
public Boolean HeaterOn { get; set; }
public Boolean EocReached { get; set; }
public Boolean BatteryCold { get; set; }
public Decimal MaxChargingPower { get; set; }
public Decimal MaxDischargingPower { get; set; }
public static AvgBatteriesStatus ReadBatteriesStatus(IReadOnlyList<Battery48TLStatus> batteriesStatus)
{
var soc = batteriesStatus.Any() ? batteriesStatus.Average(b => b.Soc) : 0;
var current = batteriesStatus.Select(b => b.Dc.Current).Aggregate(0m,(a, b) => a + b);
var voltage = batteriesStatus.Any() ? batteriesStatus.Average(b => b.Dc.Voltage) : 0;
var power = batteriesStatus.Select(b => b.Dc.Power).Aggregate(0m,(a, b) => a + b);
var busVoltage = batteriesStatus.Any() ? batteriesStatus.Average(b => b.BusVoltage): 0;
var batteryTemperature = batteriesStatus.Any() ? batteriesStatus.Average(b => b.Temperature): 0;
var heaterOn = batteriesStatus.Any() && batteriesStatus.Select(b => b.HeaterOn).Aggregate((a, b) => a | b);
var eocReached = batteriesStatus.All(b => b.EocReached);
var batteryCold = batteriesStatus.Any(b => b.BatteryCold);
var maxChargingPower = batteriesStatus.Select(b => b.MaxChargingPower).Aggregate(0m, (a, b) => a + b);
var maxDischargingPower = batteriesStatus.Select(b => b.MaxDischargingPower).Aggregate(0m, (a, b) => a + b);
return new AvgBatteriesStatus
{
Soc = soc,
Current = current,
Voltage = voltage,
Power = power,
BusVoltage = busVoltage,
BatteryTemperature = batteryTemperature,
HeaterOn = heaterOn,
EocReached = eocReached,
BatteryCold = batteryCold,
MaxChargingPower = maxChargingPower,
MaxDischargingPower = maxDischargingPower
};
}
}

View File

@ -1,5 +1,6 @@
{
"sdk": {
"version": "6.0.0",
"rollForward": "latestMajor",
"allowPrerelease": true
}

View File

@ -1,5 +1,9 @@
using InnovEnergy.Lib.Protocols.Modbus.Clients;
using InnovEnergy.Lib.Protocols.Modbus.Connections;
using InnovEnergy.Lib.StatusApi.Connections;
using InnovEnergy.Lib.StatusApi.Phases;
using InnovEnergy.Lib.Utils;
using static DecimalMath.DecimalEx;
namespace InnovEnergy.Lib.Devices.EmuMeter;
@ -25,7 +29,7 @@ public class EmuMeterDevice
return null;
}
}
private static Decimal GetPhi(Decimal cosPhi) => cosPhi.Clamp(-1m, 1m).Apply(ACos);
private EmuMeterStatus TryReadStatus()
{
@ -35,54 +39,81 @@ public class EmuMeterDevice
var voltageFreq = Modbus.ReadHoldingRegisters(9200, 112).ToDecimals(); // To check with Ivo
var energyTotal = Modbus.ReadHoldingRegisters(6000, 24) .ToUInt64s();
var energyPhases = Modbus.ReadHoldingRegisters(6100, 104).ToUInt64s();
var activePowerL123 = powerCurrent[0];
var activePowerL1 = powerCurrent[1];
var activePowerL2 = powerCurrent[2];
var activePowerL3 = powerCurrent[3];
var reactivePowerL123 = powerCurrent[5];
var reactivePowerL1 = powerCurrent[6];
var reactivePowerL2 = powerCurrent[7];
var reactivePowerL3 = powerCurrent[8];
var apparentPowerL123 = powerCurrent[10];
var apparentPowerL1 = powerCurrent[11];
var apparentPowerL2 = powerCurrent[12];
var apparentPowerL3 = powerCurrent[13];
var currentL123 = powerCurrent[50];
var currentL1 = powerCurrent[51];
var currentL2 = powerCurrent[52];
var currentL3 = powerCurrent[53];
var voltageL1N = voltageFreq[0];
var voltageL2N = voltageFreq[1];
var voltageL3N = voltageFreq[2];
var voltageL1L2 = voltageFreq[3];
var voltageL2L3 = voltageFreq[4];
var voltageL3L1 = voltageFreq[5];
var powerFactorL1 = voltageFreq[50];
var powerFactorL2 = voltageFreq[51];
var powerFactorL3 = voltageFreq[52];
var frequency = voltageFreq[55];
var energyImportL123 = energyTotal[0 / 4] / 1000.0m;
var energyExportL123 = energyTotal[20 / 4] / 1000.0m;
var energyImportL1 = energyPhases[0 / 4] / 1000.0m;
var energyExportL1 = energyPhases[20 / 4] / 1000.0m;
var energyImportL2 = energyPhases[40 / 4] / 1000.0m;
var energyExportL2 = energyPhases[60 / 4] / 1000.0m;
var energyImportL3 = energyPhases[80 / 4] / 1000.0m;
var energyExportL3 = energyPhases[100 / 4] / 1000.0m;
return new EmuMeterStatus
{
ActivePowerL123 = powerCurrent[0],
ActivePowerL1 = powerCurrent[1],
ActivePowerL2 = powerCurrent[2],
ActivePowerL3 = powerCurrent[3],
ReactivePowerL123 = powerCurrent[5],
ReactivePowerL1 = powerCurrent[6],
ReactivePowerL2 = powerCurrent[7],
ReactivePowerL3 = powerCurrent[8],
ApparentPowerL123 = powerCurrent[10],
ApparentPowerL1 = powerCurrent[11],
ApparentPowerL2 = powerCurrent[12],
ApparentPowerL3 = powerCurrent[13],
CurrentL123 = powerCurrent[50],
CurrentL1 = powerCurrent[51],
CurrentL2 = powerCurrent[52],
CurrentL3 = powerCurrent[53],
VoltageL1N = voltageFreq[0],
VoltageL2N = voltageFreq[1],
VoltageL3N = voltageFreq[2],
VoltageL1L2 = voltageFreq[3],
VoltageL2L3 = voltageFreq[4],
VoltageL3L1 = voltageFreq[5],
PowerFactorL1 = voltageFreq[50],
PowerFactorL2 = voltageFreq[51],
PowerFactorL3 = voltageFreq[52],
Frequency = voltageFreq[55],
EnergyImportL123 = energyTotal[0 / 4] / 1000.0m,
EnergyExportL123 = energyTotal[20 / 4] / 1000.0m,
EnergyImportL1 = energyPhases[0 / 4] / 1000.0m,
EnergyExportL1 = energyPhases[20 / 4] / 1000.0m,
EnergyImportL2 = energyPhases[40 / 4] / 1000.0m,
EnergyExportL2 = energyPhases[60 / 4] / 1000.0m,
EnergyImportL3 = energyPhases[80 / 4] / 1000.0m,
EnergyExportL3 = energyPhases[100 / 4] / 1000.0m,
};
(
Ac: new ThreePhaseAcConnection
(
new AcPhase(
voltageL1N,
currentL1,
GetPhi(powerFactorL1)
),
new AcPhase(
voltageL2N,
currentL2,
GetPhi(powerFactorL2)
),
new AcPhase(
voltageL3N,
currentL3,
GetPhi(powerFactorL3)
),
frequency
),
activePowerL123,
reactivePowerL123,
apparentPowerL123,
currentL123,
voltageL1L2,
voltageL2L3,
voltageL3L1,
energyImportL123,
energyImportL1,
energyImportL2,
energyImportL3,
energyExportL123,
energyExportL1,
energyExportL2,
energyExportL3
);
}
}

View File

@ -1,45 +1,26 @@
using InnovEnergy.Lib.StatusApi.Connections;
using InnovEnergy.Lib.StatusApi.Devices;
namespace InnovEnergy.Lib.Devices.EmuMeter;
public record EmuMeterStatus
{
public Decimal ActivePowerL123 { get; init; }
public Decimal ActivePowerL1 { get; init; }
public Decimal ActivePowerL2 { get; init; }
public Decimal ActivePowerL3 { get; init; }
public Decimal ReactivePowerL123 { get; init; }
public Decimal ReactivePowerL1 { get; init; }
public Decimal ReactivePowerL2 { get; init; }
public Decimal ReactivePowerL3 { get; init; }
public Decimal ApparentPowerL123 { get; init; }
public Decimal ApparentPowerL1 { get; init; }
public Decimal ApparentPowerL2 { get; init; }
public Decimal ApparentPowerL3 { get; init; }
public Decimal CurrentL123 { get; init; }
public Decimal CurrentL1 { get; init; }
public Decimal CurrentL2 { get; init; }
public Decimal CurrentL3 { get; init; }
public Decimal VoltageL1N { get; init; }
public Decimal VoltageL2N { get; init; }
public Decimal VoltageL3N { get; init; }
public Decimal VoltageL1L2 { get; init; }
public Decimal VoltageL2L3 { get; init; }
public Decimal VoltageL3L1 { get; init; }
public Decimal PowerFactorL1 { get; init; }
public Decimal PowerFactorL2 { get; init; }
public Decimal PowerFactorL3 { get; init; }
public Decimal EnergyImportL123 { get; init; }
public Decimal EnergyImportL1 { get; init; }
public Decimal EnergyImportL2 { get; init; }
public Decimal EnergyImportL3 { get; init; }
public Decimal EnergyExportL123 { get; init; }
public Decimal EnergyExportL1 { get; init; }
public Decimal EnergyExportL2 { get; init; }
public Decimal EnergyExportL3 { get; init; }
(
ThreePhaseAcConnection Ac,
Decimal ActivePowerL123,
Decimal ReactivePowerL123,
Decimal ApparentPowerL123,
Decimal CurrentL123,
Decimal VoltageL1L2,
Decimal VoltageL2L3,
Decimal VoltageL3L1,
Decimal EnergyImportL123,
Decimal EnergyImportL1,
Decimal EnergyImportL2,
Decimal EnergyImportL3,
Decimal EnergyExportL123,
Decimal EnergyExportL1,
Decimal EnergyExportL2,
Decimal EnergyExportL3
):GridMeter(Ac)
{}
public Decimal Frequency { get; init; }
}