From 664290c44b36e98dab288cd17cd55b624e19e265 Mon Sep 17 00:00:00 2001 From: ig Date: Wed, 23 Aug 2023 09:23:50 +0200 Subject: [PATCH] reorder Topology generation code --- csharp/App/SaliMax/src/Ess/Controller.cs | 7 +- csharp/App/SaliMax/src/Program.cs | 1 - csharp/App/SaliMax/src/Topology.cs | 177 +++++++++++++++-------- csharp/Lib/Utils/TextBlock.cs | 8 +- 4 files changed, 125 insertions(+), 68 deletions(-) diff --git a/csharp/App/SaliMax/src/Ess/Controller.cs b/csharp/App/SaliMax/src/Ess/Controller.cs index 187212b67..368b86850 100644 --- a/csharp/App/SaliMax/src/Ess/Controller.cs +++ b/csharp/App/SaliMax/src/Ess/Controller.cs @@ -2,6 +2,7 @@ using InnovEnergy.Lib.Devices.Battery48TL.DataTypes; using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc.DataTypes; using InnovEnergy.Lib.Time.Unix; +using InnovEnergy.Lib.Units; using InnovEnergy.Lib.Utils; namespace InnovEnergy.App.SaliMax.Ess; @@ -26,9 +27,7 @@ public static class Controller public static EssControl ControlEss(this StatusRecord s) { - var mode = s.SelectControlMode(); - - mode.WriteLine(); + var mode = s.SelectControlMode().WriteLine(); if (mode is EssMode.Off or EssMode.NoGridMeter) return EssControl.Default; @@ -164,7 +163,7 @@ public static class Controller maxChargePower = s.Battery.Devices.Sum(b => b.MaxChargePower); } - maxChargePower.WriteLine(" Max Charge Power"); + maxChargePower.W().ToDisplayString().WriteLine(" Max Charge Power"); return maxChargePower; } diff --git a/csharp/App/SaliMax/src/Program.cs b/csharp/App/SaliMax/src/Program.cs index 5ab9a4011..cd91a3eb3 100644 --- a/csharp/App/SaliMax/src/Program.cs +++ b/csharp/App/SaliMax/src/Program.cs @@ -128,7 +128,6 @@ internal static class Program var loadOnDc = new DcPowerDevice { Power = dcPower} ; - return new StatusRecord { AcDc = acDc ?? AcDcDevicesRecord.Null, diff --git a/csharp/App/SaliMax/src/Topology.cs b/csharp/App/SaliMax/src/Topology.cs index 463c4476d..00345a4ff 100644 --- a/csharp/App/SaliMax/src/Topology.cs +++ b/csharp/App/SaliMax/src/Topology.cs @@ -12,88 +12,147 @@ public static class Topology { public static TextBlock From(this StatusRecord s) { + // Topology is built up from right to left + // Power Measurement Values var inverterPower = s.AcDc.Ac.Power.Active; - var islandLoadPower = s.LoadOnAcIsland is not null ? s.LoadOnAcIsland.Ac.Power.Active : 0; - var dcBatteryPower = s.DcDc.Dc.Battery.Power; - var dcdcPower = s.DcDc.Dc.Link.Power; + var islandLoadPower = s.LoadOnAcIsland is not null + ? s.LoadOnAcIsland.Ac.Power.Active + : 0; // TODO - - // Power Calculated Values - ActivePower islandToGridBusPower = inverterPower + islandLoadPower; + var islandTopology = CreateIslandTopology(s, islandLoadPower, inverterPower); - var islandBusPv = 0.W(); // TODO - var islandBusColumn = ColumnBox("Pv" , islandBusPv, - "Island Bus", s.AcDc.Ac.PhasePowersActive(), - "Load" , islandLoadPower); + if (s.GridMeter is null) // no grid meter? + return islandTopology; // we're done + + var gridBusColumn = GridBusColumn(s); + var gridBox = CreateGridBox(s); - var dcBusLoad = 0.W(); // TODO - var dcLinkVoltage = s.DcDc.Dc.Link.Voltage.ToDisplayString(); - - var pvOnDcPower = s.PvOnDc.Dc!.Power; // TODO ! - var dcBusColumn = ColumnBox("Pv" , pvOnDcPower, - "Dc Bus", dcLinkVoltage, - "Load" , dcBusLoad); + ActivePower islandToGridBusPower = inverterPower + islandLoadPower; + + // return TextBlock + // .AlignCenterVertical + // ( + // gridBox , Flow.Horizontal(s.GridMeter.Ac.Power.Active), + // gridBusColumn, Flow.Horizontal(islandToGridBusPower), + // islandTopology + // ); + + var gridTopology = TextBlock + .AlignCenterVertical + ( + gridBox, + Flow.Horizontal(s.GridMeter.Ac.Power.Active), + gridBusColumn + ); + + return TextBlock.AlignCenterVertical + ( + gridTopology, + Flow.Horizontal(islandToGridBusPower), + islandTopology + ); + } + + private static TextBlock CreateIslandTopology(StatusRecord s, ActivePower islandLoadPower, ActivePower inverterPower) + { + var dcBatteryPower = s.DcDc.Dc.Battery.Power; + var dcdcPower = s.DcDc.Dc.Link.Power; + + var batteries = CreateBatteryColumn(s); + var dcBusColumn = CreateDcBusColumn(s); + var islandBusColumn = CreateIslandBusColumn(s, islandLoadPower); + var inverterBox = CreateInverterBox(s); + var dcDcBox = CreateDcDcBox(s); + + return TextBlock + .AlignCenterVertical + ( + islandBusColumn, Flow.Horizontal(inverterPower), + inverterBox , Flow.Horizontal(inverterPower), + dcBusColumn , Flow.Horizontal(dcdcPower), + dcDcBox , Flow.Horizontal(dcBatteryPower), + batteries + ); + } + + private static TextBlock CreateGridBox(StatusRecord statusRecord) + { + return statusRecord + .GridMeter! + .Ac + .PhasePowersActive() + .TitleBox("Grid"); + } + + private static TextBlock CreateDcDcBox(StatusRecord s) + { + var dc48Voltage = s.DcDc.Dc.Battery.Voltage.ToDisplayString(); + + return TextBlock + .AlignLeft(dc48Voltage) + .TitleBox("DC/DC"); + } + + private static TextBlock CreateInverterBox(StatusRecord s) + { var inverterAcPhases = s .AcDc .Devices .Select(d => d.Status.Ac.Power) - .ToArray(s.AcDc.Devices.Count) - .AsReadOnlyList(); - - var inverterBox = TextBlock.AlignLeft(inverterAcPhases).TitleBox("AC/DC"); - - var dc48Voltage = s.DcDc.Dc.Battery.Voltage.ToDisplayString(); - var dcDcBox = TextBlock.AlignLeft(dc48Voltage) .TitleBox("DC/DC"); + .ToReadOnlyList(); + return TextBlock + .AlignLeft(inverterAcPhases) + .TitleBox("AC/DC"); + } + + private static TextBlock CreateIslandBusColumn(StatusRecord s, ActivePower islandLoadPower) + { + var islandBusPv = 0.W(); // TODO + + return ColumnBox + ( + "Pv", islandBusPv, + "Island Bus", s.AcDc.Ac.PhasePowersActive(), + "Load", islandLoadPower + ); + } + + private static TextBlock CreateDcBusColumn(StatusRecord s) + { + var dcBusLoad = 0.W(); // TODO + var pvOnDcPower = s.PvOnDc.Dc!.Power; // TODO ! + var dcLinkVoltage = s.DcDc.Dc.Link.Voltage.ToDisplayString(); + + return ColumnBox + ( + "Pv" , pvOnDcPower, + "Dc Bus", dcLinkVoltage, + "Load" , dcBusLoad + ); + } + + private static TextBlock CreateBatteryColumn(StatusRecord s) + { var bat = s.Battery; var batteryAvgBox = CreateAveragedBatteryBox(bat); var batteryBoxes = bat .Devices .Select(CreateIndividualBattery) - .ToArray(bat.Devices.Count) - .AsReadOnlyList(); - - var individualBatteries = batteryBoxes.Any() + .ToReadOnlyList(); + + var individualBatteries = batteryBoxes.Any() ? TextBlock.AlignLeft(batteryBoxes) : TextBlock.Empty; - - var batteries = TextBlock - .AlignCenterVertical - ( - batteryAvgBox //, - //individualBatteries // TODO - ); - - var islandTopology = TextBlock - .AlignCenterVertical - ( - islandBusColumn, Flow.Horizontal(inverterPower), - inverterBox , Flow.Horizontal(inverterPower), - dcBusColumn , Flow.Horizontal(dcdcPower), - dcDcBox , Flow.Horizontal(dcBatteryPower), - batteries - ); - - if (s.GridMeter is null) - return islandTopology; - - var gridMeterAc = s.GridMeter.Ac; - var gridBox = gridMeterAc.PhasePowersActive().TitleBox("Grid"); - var gridToGridBus = Flow.Horizontal(gridMeterAc.Power.Active); - var gridBusColumn = GridBusColumn(s); - var gridBusToIslandBus = Flow.Horizontal(islandToGridBusPower); return TextBlock .AlignCenterVertical ( - gridBox, - gridToGridBus, - gridBusColumn, - gridBusToIslandBus, - islandTopology + batteryAvgBox //, + //individualBatteries // TODO ); } diff --git a/csharp/Lib/Utils/TextBlock.cs b/csharp/Lib/Utils/TextBlock.cs index 383925a61..15d26e63f 100644 --- a/csharp/Lib/Utils/TextBlock.cs +++ b/csharp/Lib/Utils/TextBlock.cs @@ -10,11 +10,11 @@ public class TextBlock public static TextBlock Empty { get; } = new TextBlock(); - public static TextBlock AlignLeft(IReadOnlyList things) + public static TextBlock AlignLeft(IEnumerable things) { var lines = things .SelectMany(GetLines) - .Where(l => !String.IsNullOrEmpty(l)) + .Unless(String.IsNullOrEmpty) .ToList(); if (!lines.Any()) @@ -33,7 +33,7 @@ public class TextBlock { var lines = things .SelectMany(GetLines) - .Where(l => !String.IsNullOrEmpty(l)) + .Unless(String.IsNullOrEmpty) .ToList(); if (!lines.Any()) @@ -66,7 +66,7 @@ public class TextBlock return new TextBlock(alignedLines); } - + public static TextBlock AlignTop(IReadOnlyList things) { var columns = things