diff --git a/csharp/App/Backend/Program.cs b/csharp/App/Backend/Program.cs index 3b7979293..3373101be 100644 --- a/csharp/App/Backend/Program.cs +++ b/csharp/App/Backend/Program.cs @@ -7,9 +7,6 @@ namespace InnovEnergy.App.Backend; public static class Program { - - - public static void Main(String[] args) { //Db.CreateFakeRelations(); diff --git a/csharp/App/Backend/db.sqlite b/csharp/App/Backend/db.sqlite index 7e80aca63..08f80b97b 100644 Binary files a/csharp/App/Backend/db.sqlite and b/csharp/App/Backend/db.sqlite differ diff --git a/csharp/App/SaliMax/run (SalimnaxProto Meiringen).sh b/csharp/App/SaliMax/run (SalimnaxProto Meiringen).sh index 7c2defe21..b9c4614cb 100755 --- a/csharp/App/SaliMax/run (SalimnaxProto Meiringen).sh +++ b/csharp/App/SaliMax/run (SalimnaxProto Meiringen).sh @@ -9,8 +9,9 @@ set -e echo -e "\n============================ Build ============================\n" -dotnet publish \ +dotnet publish \ ./SaliMax.csproj \ + -p:PublishTrimmed=false \ -c Release \ -r linux-x64 diff --git a/csharp/App/SaliMax/src/Ess/Controller.cs b/csharp/App/SaliMax/src/Ess/Controller.cs index 063e80b10..64fe03b05 100644 --- a/csharp/App/SaliMax/src/Ess/Controller.cs +++ b/csharp/App/SaliMax/src/Ess/Controller.cs @@ -28,13 +28,19 @@ public static class Controller var mode = s.SelectControlMode(); mode.WriteLine(); - + if (mode is EssMode.Off or EssMode.NoGridMeter) - return new EssControl(mode, EssLimit.NoLimit, PowerCorrection: 0, PowerSetpoint: 0); + return EssControl.Default; var essDelta = s.ComputePowerDelta(mode); - var unlimitedControl = new EssControl(mode, EssLimit.NoLimit, essDelta, 0); + var unlimitedControl = new EssControl + { + Mode = mode, + LimitedBy = EssLimit.NoLimit, + PowerCorrection = essDelta, + PowerSetpoint = 0 + }; var limitedControl = unlimitedControl .LimitChargePower(s) diff --git a/csharp/App/SaliMax/src/Ess/EssControl.cs b/csharp/App/SaliMax/src/Ess/EssControl.cs index 6d362b5c5..4886974f1 100644 --- a/csharp/App/SaliMax/src/Ess/EssControl.cs +++ b/csharp/App/SaliMax/src/Ess/EssControl.cs @@ -3,13 +3,21 @@ using InnovEnergy.Lib.Units.Power; namespace InnovEnergy.App.SaliMax.Ess; public record EssControl -( - EssMode Mode, - EssLimit LimitedBy, - ActivePower PowerCorrection, - ActivePower PowerSetpoint -) { + public required EssMode Mode { get; init; } + public required EssLimit LimitedBy { get; init; } + public required ActivePower PowerCorrection { get; init; } + public required ActivePower PowerSetpoint { get; init; } + + public static EssControl Default { get; } = new() + { + Mode = EssMode.Off, + LimitedBy = EssLimit.NoLimit, + PowerCorrection = 0, + PowerSetpoint = 0 + }; + + public EssControl LimitChargePower(Double controlDelta, EssLimit reason) { var overload = PowerCorrection - controlDelta; diff --git a/csharp/App/SaliMax/src/Ess/StatusRecord.cs b/csharp/App/SaliMax/src/Ess/StatusRecord.cs index 7a2b2a447..53c50303d 100644 --- a/csharp/App/SaliMax/src/Ess/StatusRecord.cs +++ b/csharp/App/SaliMax/src/Ess/StatusRecord.cs @@ -12,20 +12,20 @@ namespace InnovEnergy.App.SaliMax.Ess; public record StatusRecord { - public AcDcDevicesRecord AcDc { get; init; } = null!; - public DcDcDevicesRecord DcDc { get; init; } = null!; - public Battery48TlRecords Battery { get; init; } = null!; - public EmuMeterRegisters? GridMeter { get; init; } - public EmuMeterRegisters? LoadOnAcIsland { get; init; } - public AcPowerDevice? LoadOnAcGrid { get; init; } = null!; - public AcPowerDevice? PvOnAcGrid { get; init; } = null!; - public AcPowerDevice? PvOnAcIsland { get; init; } = null!; - public AcPowerDevice? AcGridToAcIsland { get; init; } = null!; - public DcPowerDevice? LoadOnDc { get; init; } = null!; - public RelaysRecord? Relays { get; init; } - public AmptStatus PvOnDc { get; init; } = null!; - public Config Config { get; init; } = null!; - public EssControl EssControl { get; set; } = null!; - public StateMachine StateMachine { get; } = new StateMachine(); + public required AcDcDevicesRecord AcDc { get; init; } + public required DcDcDevicesRecord DcDc { get; init; } + public required Battery48TlRecords Battery { get; init; } + public required EmuMeterRegisters? GridMeter { get; init; } + public required EmuMeterRegisters? LoadOnAcIsland { get; init; } + public required AcPowerDevice? LoadOnAcGrid { get; init; } + public required AcPowerDevice? PvOnAcGrid { get; init; } + public required AcPowerDevice? PvOnAcIsland { get; init; } + public required AcPowerDevice? AcGridToAcIsland { get; init; } + public required DcPowerDevice? LoadOnDc { get; init; } + public required RelaysRecord? Relays { get; init; } + public required AmptStatus PvOnDc { get; init; } + public required Config Config { get; init; } + public required EssControl EssControl { get; set; } // TODO: init only + public required StateMachine StateMachine { get; init; } } diff --git a/csharp/App/SaliMax/src/Flow.cs b/csharp/App/SaliMax/src/Flow.cs index ddebc25fb..8b74b48c5 100644 --- a/csharp/App/SaliMax/src/Flow.cs +++ b/csharp/App/SaliMax/src/Flow.cs @@ -14,7 +14,7 @@ public static class Flow public static TextBlock Horizontal(Unit amount, Int32 width = 10) { - var label = amount.ToStringRounded(); + var label = amount.ToDisplayString(); var arrowChar = amount.Value < 0 ? LeftArrowChar : RightArrowChar; var arrow = Enumerable.Repeat(arrowChar, width).Join(); @@ -26,7 +26,7 @@ public static class Flow [SuppressMessage("ReSharper", "CoVariantArrayConversion")] public static TextBlock Vertical(Unit amount, Int32 height = 4) { - var label = amount.ToStringRounded(); + var label = amount.ToDisplayString(); var arrowChar = amount.Value < 0 ? UpArrowChar : DownArrowChar; var halfArrow = Enumerable.Repeat(arrowChar, height/2); diff --git a/csharp/App/SaliMax/src/Program.cs b/csharp/App/SaliMax/src/Program.cs index 368af1747..0f35bac07 100644 --- a/csharp/App/SaliMax/src/Program.cs +++ b/csharp/App/SaliMax/src/Program.cs @@ -148,7 +148,9 @@ internal static class Program LoadOnAcIsland = loadOnAcIsland, LoadOnDc = loadOnDc, - Config = Config.Load() // load from disk every iteration, so config can be changed while running + StateMachine = StateMachine.Default, + EssControl = EssControl.Default, + Config = Config.Load() // load from disk every iteration, so config can be changed while running }; } @@ -228,17 +230,17 @@ internal static class Program var islandToGridBusPower = inverterPower + islandLoadPower; var gridLoadPower = s.LoadOnAcGrid is null ? 0: s.LoadOnAcGrid.Power.Active; - var gridPowerByPhase = TextBlock.AlignLeft(s.GridMeter.Ac.L1.Power.Active.ToStringRounded(), - s.GridMeter.Ac.L2.Power.Active.ToStringRounded(), - s.GridMeter.Ac.L3.Power.Active.ToStringRounded()); + var gridPowerByPhase = TextBlock.AlignLeft(s.GridMeter.Ac.L1.Power.Active.ToDisplayString(), + s.GridMeter.Ac.L2.Power.Active.ToDisplayString(), + s.GridMeter.Ac.L3.Power.Active.ToDisplayString()); - var gridVoltageByPhase = TextBlock.AlignLeft(s.GridMeter.Ac.L1.Voltage.ToStringRounded(), - s.GridMeter.Ac.L2.Voltage.ToStringRounded(), - s.GridMeter.Ac.L3.Voltage.ToStringRounded()); + var gridVoltageByPhase = TextBlock.AlignLeft(s.GridMeter.Ac.L1.Voltage.ToDisplayString(), + s.GridMeter.Ac.L2.Voltage.ToDisplayString(), + s.GridMeter.Ac.L3.Voltage.ToDisplayString()); - var inverterPowerByPhase = TextBlock.AlignLeft(s.AcDc.Ac.L1.Power.Active.ToStringRounded(), - s.AcDc.Ac.L2.Power.Active.ToStringRounded(), - s.AcDc.Ac.L3.Power.Active.ToStringRounded()); + var inverterPowerByPhase = TextBlock.AlignLeft(s.AcDc.Ac.L1.Power.Active.ToDisplayString(), + s.AcDc.Ac.L2.Power.Active.ToDisplayString(), + s.AcDc.Ac.L3.Power.Active.ToDisplayString()); // ReSharper disable once CoVariantArrayConversion var inverterPowerByAcDc = TextBlock.AlignLeft(s.AcDc.Devices @@ -246,7 +248,7 @@ internal static class Program .ToArray()); var dcLinkVoltage = TextBlock.CenterHorizontal("", - s.DcDc.Dc.Link.Voltage.ToStringRounded(), + s.DcDc.Dc.Link.Voltage.ToDisplayString(), ""); //var inverterPowerByPhase = new ActivePower[(Int32)s.AcDc.Ac.L1.Power.Active, (Int32)s.AcDc.Ac.L2.Power.Active, (Int32)s.AcDc.Ac.L3.Power.Active]; @@ -273,7 +275,7 @@ internal static class Program var gridBox = TextBlock.AlignLeft(gridPowerByPhase).TitleBox("Grid"); var inverterBox = TextBlock.AlignLeft(inverterPowerByAcDc).TitleBox("Inverter"); var dcDcBox = TextBlock.AlignLeft(dc48Voltage).TitleBox("DC/DC"); - var batteryBox = TextBlock.AlignLeft(batteryVoltage.ToStringRounded(), batterySoc.ToStringRounded(), batteryCurrent.ToStringRounded(), batteryTemp.ToStringRounded()).TitleBox("Battery"); + var batteryBox = TextBlock.AlignLeft(batteryVoltage.ToDisplayString(), batterySoc.ToDisplayString(), batteryCurrent.ToDisplayString(), batteryTemp.ToDisplayString()).TitleBox("Battery"); diff --git a/csharp/App/SaliMax/src/S3Config.cs b/csharp/App/SaliMax/src/S3Config.cs index 2e04acd81..c0d2cd388 100644 --- a/csharp/App/SaliMax/src/S3Config.cs +++ b/csharp/App/SaliMax/src/S3Config.cs @@ -9,12 +9,12 @@ namespace InnovEnergy.App.SaliMax; public record S3Config { - public String Bucket { get; init; } = ""; - public String Region { get; init; } = ""; - public String Provider { get; init; } = ""; - public String Key { get; init; } = ""; - public String Secret { get; init; } = ""; - public String ContentType { get; init; } = ""; + public required String Bucket { get; init; } + public required String Region { get; init; } + public required String Provider { get; init; } + public required String Key { get; init; } + public required String Secret { get; init; } + public required String ContentType { get; init; } public String Host => $"{Bucket}.{Region}.{Provider}"; public String Url => $"https://{Host}"; diff --git a/csharp/App/SaliMax/src/System/StateMachine.cs b/csharp/App/SaliMax/src/System/StateMachine.cs index 75abc1ae8..a22afb483 100644 --- a/csharp/App/SaliMax/src/System/StateMachine.cs +++ b/csharp/App/SaliMax/src/System/StateMachine.cs @@ -1,7 +1,9 @@ namespace InnovEnergy.App.SaliMax.System; -public class StateMachine +public record StateMachine { - public String Message { get; set; } = "Panic: Unknown State!"; - public Int32 State { get; set; } = 100; + public required String Message { get; set; } // TODO: init only + public required Int32 State { get; set; } // TODO: init only + + public static StateMachine Default { get; } = new StateMachine { State = 100, Message = "Unknown State" }; } \ No newline at end of file diff --git a/csharp/InnovEnergy.props b/csharp/InnovEnergy.props index ad3d9ebef..cc50081b0 100644 --- a/csharp/InnovEnergy.props +++ b/csharp/InnovEnergy.props @@ -6,13 +6,15 @@ preview true enable - net6.0 + net7.0 true false - $([System.Text.RegularExpressions.Regex]::Match($(MSBuildProjectExtensionsPath), "[/\\]csharp[/\\].*[/\\]obj").ToString().Replace("/",".").Replace("\\",".").Replace(".csharp", $(Company)).Replace(".obj", "")) + Please.reload.the.project.Rider.is.stupid $(Company) Team - - - + + $(Company).$(MSBuildProjectDirectory.Replace($(SolutionDir), "").Replace("/",".").Replace("\",".")) + + + \ No newline at end of file diff --git a/csharp/Lib/Channels/Stages/Channel.cs b/csharp/Lib/Channels/Stages/Channel.cs index 6bed3881b..b595ba2ad 100644 --- a/csharp/Lib/Channels/Stages/Channel.cs +++ b/csharp/Lib/Channels/Stages/Channel.cs @@ -4,8 +4,8 @@ namespace InnovEnergy.Lib.Channels.Stages; public class Channel { - public AsyncAction Write { get; init; } = _ => throw new NotImplementedException(nameof(Write)); - public Async Read { get; init; } = () => throw new NotImplementedException(nameof(Read)); + public required AsyncAction Write { get; init; } + public required Async Read { get; init; } public Channel Map(Stage stage) { diff --git a/csharp/Lib/Channels/Stages/ConnectedChannel.cs b/csharp/Lib/Channels/Stages/ConnectedChannel.cs index 36298420e..568720eca 100644 --- a/csharp/Lib/Channels/Stages/ConnectedChannel.cs +++ b/csharp/Lib/Channels/Stages/ConnectedChannel.cs @@ -4,9 +4,9 @@ namespace InnovEnergy.Lib.Channels.Stages; public class ConnectedChannel : Channel, IAsyncDisposable { - public Func IsOpen { get; init; } = () => throw new NotImplementedException(nameof(IsOpen)); - public AsyncAction Open { get; init; } = () => throw new NotImplementedException(nameof(Open)); - public AsyncAction Close { get; init; } = () => throw new NotImplementedException(nameof(Close)); + public required Func IsOpen { get; init; } + public required AsyncAction Open { get; init; } + public required AsyncAction Close { get; init; } public async ValueTask DisposeAsync() => await Close(); } diff --git a/csharp/Lib/Devices/AMPT/AmptCommunicationUnitStatus.cs b/csharp/Lib/Devices/AMPT/AmptCommunicationUnitStatus.cs index e9a95ea44..7031d9e77 100644 --- a/csharp/Lib/Devices/AMPT/AmptCommunicationUnitStatus.cs +++ b/csharp/Lib/Devices/AMPT/AmptCommunicationUnitStatus.cs @@ -1,16 +1,18 @@ namespace InnovEnergy.Lib.Devices.AMPT; + +// not used ATM public class AmptCommunicationUnitStatus { - public UInt32 Sid { get; init; } // A well-known value 0x53756e53, uniquely identifies this as a SunSpec Modbus Map - public UInt16 IdSunSpec { get; init; } // A well-known value 1, uniquely identifies this as a SunSpec Common Model + public required UInt32 Sid { get; init; } // A well-known value 0x53756e53, uniquely identifies this as a SunSpec Modbus Map + public required UInt16 IdSunSpec { get; init; } // A well-known value 1, uniquely identifies this as a SunSpec Common Model - public String Manufacturer { get; init; } = "undefined"; // A well-known value registered with SunSpec for compliance: "Ampt" - public String Model { get; init; } = "undefined"; // Manufacturer specific value "Communication Unit" - public String Version { get; init; } = "undefined"; // Software Version - public String SerialNumber { get; init; } = "undefined"; // Manufacturer specific value - public Int16 DeviceAddress { get; init; } // Modbus Device ID - public UInt16 IdVendor { get; init; } // Ampt SunSpec Vendor Code 64050 + public required String Manufacturer { get; init; } // A well-known value registered with SunSpec for compliance: "Ampt" + public required String Model { get; init; } // Manufacturer specific value "Communication Unit" + public required String Version { get; init; } // Software Version + public required String SerialNumber { get; init; } // Manufacturer specific value + public required Int16 DeviceAddress { get; init; } // Modbus Device ID + public required UInt16 IdVendor { get; init; } // Ampt SunSpec Vendor Code 64050 - public IReadOnlyList Devices { get; init; } = Array.Empty(); + public required IReadOnlyList Devices { get; init; } } \ No newline at end of file diff --git a/csharp/Lib/Protocols/DBus/Daemon/MatchRule.cs b/csharp/Lib/Protocols/DBus/Daemon/MatchRule.cs index fb317807b..b42f8b03b 100644 --- a/csharp/Lib/Protocols/DBus/Daemon/MatchRule.cs +++ b/csharp/Lib/Protocols/DBus/Daemon/MatchRule.cs @@ -21,13 +21,13 @@ public interface IMatchRule public record MatchRule : IMatchRule { - public MessageType? Type { get; init; } = default; - public String? Interface { get; init; } = default; - public String? Member { get; init; } = default; - public ObjectPath? Path { get; init; } = default; - public ObjectPath? PathNamespace { get; init; } = default; - public String? Sender { get; init; } = default; - public String? Destination { get; init; } = default; + public MessageType? Type { get; init; } + public String? Interface { get; init; } + public String? Member { get; init; } + public ObjectPath? Path { get; init; } + public ObjectPath? PathNamespace { get; init; } + public String? Sender { get; init; } + public String? Destination { get; init; } public Boolean Eavesdrop { get; init; } = false; public override String ToString() => this.Rule(); diff --git a/csharp/Lib/Units/Composite/Ac1Bus.cs b/csharp/Lib/Units/Composite/Ac1Bus.cs index abdc15110..deff1105b 100644 --- a/csharp/Lib/Units/Composite/Ac1Bus.cs +++ b/csharp/Lib/Units/Composite/Ac1Bus.cs @@ -5,10 +5,10 @@ public sealed class Ac1Bus private Ac1Bus() {} - public Voltage Voltage { get; private init; } = null!; - public Current Current { get; private init; } = null!; - public AcPower Power { get; private init; } = null!; - public Frequency Frequency { get; private init; } = null!; + public required Voltage Voltage { get; init; } + public required Current Current { get; init; } + public required AcPower Power { get; init; } + public required Frequency Frequency { get; init; } public static Ac1Bus FromVoltageCurrentFrequencyPhi(Double voltageRms, Double currentRms, diff --git a/csharp/Lib/Units/Composite/Ac3Bus.cs b/csharp/Lib/Units/Composite/Ac3Bus.cs index 884fcc690..03d20825d 100644 --- a/csharp/Lib/Units/Composite/Ac3Bus.cs +++ b/csharp/Lib/Units/Composite/Ac3Bus.cs @@ -6,11 +6,11 @@ public sealed class Ac3Bus { private Ac3Bus() {} - public AcPhase L1 { get; private init; } = null!; - public AcPhase L2 { get; private init; } = null!; - public AcPhase L3 { get; private init; } = null!; - public AcPower Power { get; private init; } = null!; - public Frequency Frequency { get; private init; } = null!; + public required AcPhase L1 { get; init; } + public required AcPhase L2 { get; init; } + public required AcPhase L3 { get; init; } + public required AcPower Power { get; init; } + public required Frequency Frequency { get; init; } public static Ac3Bus FromPhasesAndFrequency(AcPhase l1, AcPhase l2, diff --git a/csharp/Lib/Units/Composite/AcPhase.cs b/csharp/Lib/Units/Composite/AcPhase.cs index acacd1343..4dcb6bca9 100644 --- a/csharp/Lib/Units/Composite/AcPhase.cs +++ b/csharp/Lib/Units/Composite/AcPhase.cs @@ -7,9 +7,9 @@ public sealed class AcPhase { private AcPhase(){} - public Voltage Voltage { get; private init; } = null!; - public Current Current { get; private init; } = null!; - public AcPower Power { get; private init; } = null!; + public required Voltage Voltage { get; init; } + public required Current Current { get; init; } + public required AcPower Power { get; init; } public static AcPhase FromVoltageCurrentPhi(Voltage voltageRms, Current currentRms, diff --git a/csharp/Lib/Units/Composite/AcPower.cs b/csharp/Lib/Units/Composite/AcPower.cs index e9de3a735..e525233fd 100644 --- a/csharp/Lib/Units/Composite/AcPower.cs +++ b/csharp/Lib/Units/Composite/AcPower.cs @@ -8,11 +8,11 @@ public sealed class AcPower { private AcPower(){} - public ApparentPower Apparent { get; private init; } = null!; - public ActivePower Active { get; private init; } = null!; - public ReactivePower Reactive { get; private init; } = null!; - public Angle Phi { get; private init; } = null!; - public Double CosPhi { get; private init; } + public required ApparentPower Apparent { get; init; } + public required ActivePower Active { get; init; } + public required ReactivePower Reactive { get; init; } + public required Angle Phi { get; init; } + public required Double CosPhi { get; init; } public static AcPower FromActiveReactiveApparent(ActivePower activePower, ReactivePower reactivePower, ApparentPower apparentPower) { diff --git a/csharp/Lib/Units/Composite/DcBus.cs b/csharp/Lib/Units/Composite/DcBus.cs index c75de28ed..28653ea3d 100644 --- a/csharp/Lib/Units/Composite/DcBus.cs +++ b/csharp/Lib/Units/Composite/DcBus.cs @@ -6,9 +6,9 @@ public sealed class DcBus { private DcBus() {} - public Voltage Voltage { get; private init; } = null!; - public Current Current { get; private init; } = null!; - public ActivePower Power { get; private init; } = null!; + public required Voltage Voltage { get; init; } + public required Current Current { get; init; } + public required ActivePower Power { get; init; } public static DcBus FromVoltageCurrent(Voltage voltage, Current current) => new() { diff --git a/csharp/Lib/Units/Energy.cs b/csharp/Lib/Units/Energy.cs index 0d5412244..fe62a1a55 100644 --- a/csharp/Lib/Units/Energy.cs +++ b/csharp/Lib/Units/Energy.cs @@ -2,7 +2,7 @@ namespace InnovEnergy.Lib.Units; public sealed class Energy : Unit { - public override String Symbol => "kWh"; + public override String Symbol => "Wh"; public Energy(Double value) : base(value) { diff --git a/csharp/Lib/Units/Power/ActivePower.cs b/csharp/Lib/Units/Power/ActivePower.cs index 92a82b431..f451d4f79 100644 --- a/csharp/Lib/Units/Power/ActivePower.cs +++ b/csharp/Lib/Units/Power/ActivePower.cs @@ -12,7 +12,6 @@ public sealed class ActivePower : AcPower public static implicit operator ActivePower(Double d) => new ActivePower(d); public static implicit operator Double(ActivePower d) => d.Value; - public static ActivePower operator -(ActivePower d) => -d.Value; } diff --git a/csharp/Lib/Units/Unit.cs b/csharp/Lib/Units/Unit.cs index e007f7f66..5e5997191 100644 --- a/csharp/Lib/Units/Unit.cs +++ b/csharp/Lib/Units/Unit.cs @@ -8,5 +8,35 @@ public abstract class Unit public Double Value { get; } public override String ToString() => $"{Value} {Symbol}"; - public String ToStringRounded() => $"{Math.Round(Value,3)} {Symbol}"; -} \ No newline at end of file + + public String ToDisplayString() + { + if (Value == 0) + return $"0 {Symbol}"; + + var a = Math.Abs(Value); + var s = Math.Sign(Value); + + var i = 8; + + while (a >= 10000) + { + a /= 1000; + i++; + } + while (a < 10) + { + a *= 1000; + i--; + } + + var r = a < 100 + ? Math.Floor(a * 10) / 10 + : Math.Floor(a); + + return $"{r * s} {Prefix[i]}{Symbol}"; + } + + private static readonly IReadOnlyList Prefix = new[] { "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Y" }; +} + diff --git a/csharp/Lib/Units/Units.cs b/csharp/Lib/Units/Units.cs index 8d07d3bb6..161b52a0e 100644 --- a/csharp/Lib/Units/Units.cs +++ b/csharp/Lib/Units/Units.cs @@ -1,5 +1,4 @@ using System.Collections; -using System.Reflection; using InnovEnergy.Lib.Units.Power; using InnovEnergy.Lib.Utils; using static System.Reflection.BindingFlags; @@ -20,7 +19,8 @@ public static class Units public static Frequency Hz (this Double value) => value; public static Angle Rad (this Double value) => value; public static Temperature Celsius(this Double value) => value; - public static Energy KWh (this Double value) => value; + public static Energy KWh (this Double value) => value * 1000; + public static Energy Wh (this Double value) => value; public static String ToCsv(this Object thing) { @@ -88,87 +88,3 @@ public static class Units } } -public static class Prefixes -{ - private static readonly IReadOnlyList Big = new[] - { - "", - "k", - "M", - "G", - "T", - "P", - "E", - "Y", - }; - - private static readonly IReadOnlyList Small = new[] - { - "", - "m", - "µ", - "n", - "p", - "f", - "a", - "z", - "y", - }; - - public static String TestGetPrefix(Double v, String unit) - { - if (v == 0) - return ""; - - var log10 = Math.Log10(v / 10); - var l = (Int32)Math.Floor(log10 / 3); - var lookUp = l > 0 ? Big : Small; - var i = Math.Abs(l); - - return $"{v / Math.Pow(10.0, l * 3.0)} {lookUp[i]}{unit}"; - } - - - public static String TestGetPrefix(Decimal v, String unit) - { - if (v == 0m) - return ""; - - var d = (Double)v; - var log10 = Math.Log10(d / 10); - var l = (Int32)Math.Floor(log10 / 3); - var lookUp = l > 0 ? Big : Small; - var i = Math.Abs(l); - - return $"{d / Math.Pow(10.0, l * 3.0)} {lookUp[i]}{unit}"; - } - - public static String TestGetPrefix2(Decimal v, String unit) - { - if (v == 0m) - return ""; - - var a = Math.Abs(v); - var s = Math.Sign(v); - - var i = 0; - - while (a >= 10000m) - { - a /= 1000; - i++; - } - while (a < 10m) - { - a *= 1000; - i--; - } - - var lookUp = i >= 0 ? Big : Small; - - var r = Decimal.Floor(a * 10m) / 10m; - - return $"{r*s} {lookUp[Math.Abs(i)]}{unit}"; - } - -} diff --git a/csharp/Lib/WebServer/Default.cs b/csharp/Lib/WebServer/Default.cs index af8c7d638..98c210f8f 100644 --- a/csharp/Lib/WebServer/Default.cs +++ b/csharp/Lib/WebServer/Default.cs @@ -5,8 +5,8 @@ namespace InnovEnergy.Lib.WebServer; public static class Default { - public static IPEndPoint EndPoint { get; } = new IPEndPoint(0, 0); - public static Url Url { get; } = new Url(""); + public static IPEndPoint EndPoint { get; } = new IPEndPoint(0, 0); + public static Url Url { get; } = new Url(""); public static HttpResponse HttpNotFound { get; } = new HttpResponse { StatusCode = 404 }; public static HttpResponse HttpForbidden { get; } = new HttpResponse { StatusCode = 403 }; diff --git a/typescript/Frontend/package-lock.json b/typescript/Frontend/package-lock.json index d89f522fe..d36bf3040 100644 --- a/typescript/Frontend/package-lock.json +++ b/typescript/Frontend/package-lock.json @@ -42,7 +42,6 @@ "react-plotly.js": "^2.6.0", "react-router-dom": "^6.8.0", "react-scripts": "5.0.1", - "react-window": "^1.8.9", "reactflow": "^11.5.6", "rxjs": "^7.8.0", "sass": "^1.58.3", @@ -17199,11 +17198,6 @@ "node": ">= 4.0.0" } }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -20585,22 +20579,6 @@ "react-dom": ">=16.13" } }, - "node_modules/react-window": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", - "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" - }, - "engines": { - "node": ">8.0.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/reactflow": { "version": "11.5.6", "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.5.6.tgz", @@ -38023,11 +38001,6 @@ "fs-monkey": "^1.0.3" } }, - "memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -40347,15 +40320,6 @@ "debounce": "^1.2.1" } }, - "react-window": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", - "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", - "requires": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" - } - }, "reactflow": { "version": "11.5.6", "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.5.6.tgz", diff --git a/typescript/Frontend/package.json b/typescript/Frontend/package.json index defbad19b..900de2c7a 100644 --- a/typescript/Frontend/package.json +++ b/typescript/Frontend/package.json @@ -37,7 +37,6 @@ "react-plotly.js": "^2.6.0", "react-router-dom": "^6.8.0", "react-scripts": "5.0.1", - "react-window": "^1.8.9", "reactflow": "^11.5.6", "rxjs": "^7.8.0", "sass": "^1.58.3", diff --git a/typescript/Frontend/src/components/Context/LogContextProvider.tsx b/typescript/Frontend/src/components/Context/LogContextProvider.tsx index 349ed883a..6b09c5672 100644 --- a/typescript/Frontend/src/components/Context/LogContextProvider.tsx +++ b/typescript/Frontend/src/components/Context/LogContextProvider.tsx @@ -1,33 +1,48 @@ -import { createContext, ReactNode, SetStateAction, useState } from "react"; -import { TreeElement, ToggleElement } from "../Installations/Log/CheckboxTree"; +import { createContext, ReactNode, useState } from "react"; +import { TreeElement } from "../Installations/Log/CheckboxTree"; import React from "react"; interface LogContextProviderProps { toggles: TreeElement[] | null; setToggles: (value: TreeElement[]) => void; - checkedToggles: ToggleElement | null; - setCheckedToggles: React.Dispatch>; + checkedToggles: string[]; + setChecked: (newValue: string) => void; + removeChecked: (value: string) => void; } export const LogContext = createContext({ toggles: [], setToggles: () => {}, - checkedToggles: {}, - setCheckedToggles: () => {}, + checkedToggles: [], + setChecked: () => {}, + removeChecked: () => {}, }); const LogContextProvider = ({ children }: { children: ReactNode }) => { const [toggles, setToggles] = useState(null); - const [checkedToggles, setCheckedToggles] = useState( - null - ); + const [checkedToggles, setCheckedToggles] = useState([]); + + const setChecked = (newValue: string) => { + if (checkedToggles.length === 5) { + const removedChecked = checkedToggles.slice(1); + setCheckedToggles([...removedChecked, newValue]); + } else { + setCheckedToggles([...checkedToggles, newValue]); + } + }; + + const removeChecked = (value: string) => { + setCheckedToggles(checkedToggles.filter((toggle) => toggle !== value)); + }; + return ( {children} diff --git a/typescript/Frontend/src/components/Installations/Log/CheckboxTree.tsx b/typescript/Frontend/src/components/Installations/Log/CheckboxTree.tsx index 81fe3b22d..06a43c33c 100644 --- a/typescript/Frontend/src/components/Installations/Log/CheckboxTree.tsx +++ b/typescript/Frontend/src/components/Installations/Log/CheckboxTree.tsx @@ -21,7 +21,8 @@ export interface TreeElement { } const CheckboxTree = () => { - const { toggles, setCheckedToggles, checkedToggles } = useContext(LogContext); + const { toggles, setChecked, checkedToggles, removeChecked } = + useContext(LogContext); const routeMatch = useRouteMatch([ routes.installations + routes.list + routes.log + ":id", ]); @@ -30,29 +31,17 @@ const CheckboxTree = () => { return element.children.length > 0 ? renderTree(element.children) : null; }; - const handleCheckChildren = (children: TreeElement[], checked?: boolean) => { - if (children.length > 0) { - children.forEach((child) => { - setCheckedToggles((prevState) => { - return { - ...prevState, - [child.id]: !checked, - }; - }); - if (child.children.length > 0) { - handleCheckChildren(child.children, checked); - } - }); - } - }; - const handleClick = ( event: React.MouseEvent, element: TreeElement, - checked?: boolean + checked?: string ) => { - event.stopPropagation(); - handleCheckChildren([element], checked); + if (checked) { + removeChecked(element.id); + } else { + event.stopPropagation(); + setChecked(element.id); + } }; const handleExpandClick = ( @@ -63,7 +52,7 @@ const CheckboxTree = () => { const renderTree = (data: TreeElement[]): ReactNode => { return data.map((element) => { - const checked = checkedToggles?.[element.id]; + const checked = checkedToggles.find((toggle) => element.id === toggle); const splitName = element.name.split("/"); return ( { onClick={handleExpandClick} label={ <> - handleClick(e, element, checked)} - /> + {element.children.length === 0 && ( + handleClick(e, element, checked)} + /> + )} {splitName[splitName.length - 1]} } diff --git a/typescript/Frontend/src/components/Installations/Log/ScalarGraph.tsx b/typescript/Frontend/src/components/Installations/Log/ScalarGraph.tsx index 156227f3e..334688921 100644 --- a/typescript/Frontend/src/components/Installations/Log/ScalarGraph.tsx +++ b/typescript/Frontend/src/components/Installations/Log/ScalarGraph.tsx @@ -3,7 +3,6 @@ import { DataRecord, RecordSeries } from "../../../dataCache/data"; import { GraphData, createTimes, - flattenToggles, getTreeElements, isNumeric, parseCsv, @@ -11,14 +10,13 @@ import { transformToBarGraphData, } from "../../../util/graph.util"; import { TimeRange, TimeSpan, UnixTime } from "../../../dataCache/time"; -import { memo, useContext, useEffect, useMemo, useState } from "react"; +import { useCallback, useContext, useEffect, useMemo, useState } from "react"; import { BehaviorSubject, startWith, throttleTime, withLatestFrom } from "rxjs"; import { S3Access } from "../../../dataCache/S3/S3Access"; import DataCache, { FetchResult } from "../../../dataCache/dataCache"; import { LogContext } from "../../Context/LogContextProvider"; import { isDefined } from "../../../dataCache/utils/maybe"; -import { Data, Layout } from "plotly.js"; -import { VariableSizeList as List, areEqual } from "react-window"; +import { Data, Layout, PlotRelayoutEvent } from "plotly.js"; import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs"; import { FormattedMessage } from "react-intl"; import DateRangePicker from "./DateRangePicker"; @@ -27,462 +25,6 @@ import { Alert } from "@mui/material"; const NUMBER_OF_NODES = 100; -export const testData = `/AcDc/SystemControl/Alarms;; -/AcDc/SystemControl/CommunicationTimeout;00:00:10; -/AcDc/SystemControl/SystemConfig;AcDcAndDcDc; -/AcDc/SystemControl/ResetAlarmsAndWarnings;False; -/AcDc/SystemControl/TargetSlave;0; -/AcDc/SystemControl/UseSlaveIdForAddressing;False; -/AcDc/SystemControl/ReferenceFrame;Producer; -/AcDc/SystemControl/SlaveErrorHandling;Relaxed; -/AcDc/SystemControl/SubSlaveErrorHandling;Strict; -/AcDc/SystemControl/PowerSetPointActivation;Immediate; -/AcDc/SystemControl/PowerSetPointTrigger;Wait; -/AcDc/SystemControl/DeviceState;Operation; -/AcDc/SystemControl/NumberOfConnectedSlaves;2; -/AcDc/SystemControl/NumberOfConnectedSubSlaves;0; -/AcDc/SystemControl/Warnings;; -/AcDc/Devices/1/Status/Ac/L1/Voltage;0;V -/AcDc/Devices/1/Status/Ac/L1/Current;0;A -/AcDc/Devices/1/Status/Ac/L1/Power/Apparent;0;VA -/AcDc/Devices/1/Status/Ac/L1/Power/Active;0;W -/AcDc/Devices/1/Status/Ac/L1/Power/Reactive;0;var -/AcDc/Devices/1/Status/Ac/L1/Power/Phi;0;rad -/AcDc/Devices/1/Status/Ac/L1/Power/CosPhi;1; -/AcDc/Devices/1/Status/Ac/L2/Voltage;0;V -/AcDc/Devices/1/Status/Ac/L2/Current;0;A -/AcDc/Devices/1/Status/Ac/L2/Power/Apparent;0;VA -/AcDc/Devices/1/Status/Ac/L2/Power/Active;0;W -/AcDc/Devices/1/Status/Ac/L2/Power/Reactive;0;var -/AcDc/Devices/1/Status/Ac/L2/Power/Phi;0;rad -/AcDc/Devices/1/Status/Ac/L2/Power/CosPhi;1; -/AcDc/Devices/1/Status/Ac/L3/Voltage;0;V -/AcDc/Devices/1/Status/Ac/L3/Current;0;A -/AcDc/Devices/1/Status/Ac/L3/Power/Apparent;0;VA -/AcDc/Devices/1/Status/Ac/L3/Power/Active;0;W -/AcDc/Devices/1/Status/Ac/L3/Power/Reactive;0;var -/AcDc/Devices/1/Status/Ac/L3/Power/Phi;0;rad -/AcDc/Devices/1/Status/Ac/L3/Power/CosPhi;1; -/AcDc/Devices/1/Status/Ac/Power/Apparent;0;VA -/AcDc/Devices/1/Status/Ac/Power/Active;0;W -/AcDc/Devices/1/Status/Ac/Power/Reactive;0;var -/AcDc/Devices/1/Status/Ac/Power/Phi;0;rad -/AcDc/Devices/1/Status/Ac/Power/CosPhi;1; -/AcDc/Devices/1/Status/Ac/Frequency;0;Hz -/AcDc/Devices/1/Status/Dc/Voltage;0;V -/AcDc/Devices/1/Status/Dc/Current;0;A -/AcDc/Devices/1/Status/Dc/Power;0;W -/AcDc/Devices/1/Status/PowerLimitedBy;Nothing; -/AcDc/Devices/1/Status/InverterState/Current;Idle; -/AcDc/Devices/1/Status/InverterState/OnLastAlarm;Idle; -/AcDc/Devices/1/Status/ActiveGridType;GridTied400V50Hz; -/AcDc/Devices/1/Status/Voltage/Intern/DcUpperHalf;0;V -/AcDc/Devices/1/Status/Voltage/Intern/DcLowerHalf;0;V -/AcDc/Devices/1/Status/Voltage/Intern/NToPe;0;V -/AcDc/Devices/1/Status/Voltage/Extern/DcUpperHalf;0;V -/AcDc/Devices/1/Status/Voltage/Extern/DcLowerHalf;0;V -/AcDc/Devices/1/Status/Voltage/Extern/NToPe;0;V -/AcDc/Devices/1/Status/Temperature/InletAir;0;°C -/AcDc/Devices/1/Status/Temperature/IgbtL1;0;°C -/AcDc/Devices/1/Status/Temperature/IgbtL2;0;°C -/AcDc/Devices/1/Status/Temperature/IgbtL3;0;°C -/AcDc/Devices/1/Status/Temperature/IgbtBalancer;0;°C -/AcDc/Devices/1/Status/OverloadCapacity/L1;0;% -/AcDc/Devices/1/Status/OverloadCapacity/L2;0;% -/AcDc/Devices/1/Status/OverloadCapacity/L3;0;% -/AcDc/Devices/1/Status/Nominal/AcFrequency;50;Hz -/AcDc/Devices/1/Status/Nominal/AcVoltage;400;V -/AcDc/Devices/1/Status/Nominal/Power;25000;W -/AcDc/Devices/1/Status/Alarms;; -/AcDc/Devices/1/Status/Warnings;; -/AcDc/Devices/1/Control/Ac/PhaseControl;Symmetric; -/AcDc/Devices/1/Control/Ac/GridType;GridTied400V50Hz; -/AcDc/Devices/1/Control/Ac/IslandMode/FrequencyOffset;0;Hz -/AcDc/Devices/1/Control/Ac/IslandMode/VoltageAdjustmentFactor;100;% -/AcDc/Devices/1/Control/Dc/ReferenceVoltage;750;V -/AcDc/Devices/1/Control/Dc/MinVoltage;730;V -/AcDc/Devices/1/Control/Dc/MaxVoltage;770;V -/AcDc/Devices/1/Control/Dc/PrechargeConfig;PrechargeDcWithSystemCtl; -/AcDc/Devices/1/Control/PowerStageEnable;True; -/AcDc/Devices/1/Control/ResetAlarmsAndWarnings;False; -/AcDc/Devices/2/Status/Ac/L1/Voltage;0;V -/AcDc/Devices/2/Status/Ac/L1/Current;0;A -/AcDc/Devices/2/Status/Ac/L1/Power/Apparent;0;VA -/AcDc/Devices/2/Status/Ac/L1/Power/Active;0;W -/AcDc/Devices/2/Status/Ac/L1/Power/Reactive;0;var -/AcDc/Devices/2/Status/Ac/L1/Power/Phi;0;rad -/AcDc/Devices/2/Status/Ac/L1/Power/CosPhi;1; -/AcDc/Devices/2/Status/Ac/L2/Voltage;0;V -/AcDc/Devices/2/Status/Ac/L2/Current;0;A -/AcDc/Devices/2/Status/Ac/L2/Power/Apparent;0;VA -/AcDc/Devices/2/Status/Ac/L2/Power/Active;0;W -/AcDc/Devices/2/Status/Ac/L2/Power/Reactive;0;var -/AcDc/Devices/2/Status/Ac/L2/Power/Phi;0;rad -/AcDc/Devices/2/Status/Ac/L2/Power/CosPhi;1; -/AcDc/Devices/2/Status/Ac/L3/Voltage;0;V -/AcDc/Devices/2/Status/Ac/L3/Current;0;A -/AcDc/Devices/2/Status/Ac/L3/Power/Apparent;0;VA -/AcDc/Devices/2/Status/Ac/L3/Power/Active;0;W -/AcDc/Devices/2/Status/Ac/L3/Power/Reactive;0;var -/AcDc/Devices/2/Status/Ac/L3/Power/Phi;0;rad -/AcDc/Devices/2/Status/Ac/L3/Power/CosPhi;1; -/AcDc/Devices/2/Status/Ac/Power/Apparent;0;VA -/AcDc/Devices/2/Status/Ac/Power/Active;0;W -/AcDc/Devices/2/Status/Ac/Power/Reactive;0;var -/AcDc/Devices/2/Status/Ac/Power/Phi;0;rad -/AcDc/Devices/2/Status/Ac/Power/CosPhi;1; -/AcDc/Devices/2/Status/Ac/Frequency;0;Hz -/AcDc/Devices/2/Status/Dc/Voltage;0;V -/AcDc/Devices/2/Status/Dc/Current;0;A -/AcDc/Devices/2/Status/Dc/Power;0;W -/AcDc/Devices/2/Status/PowerLimitedBy;Nothing; -/AcDc/Devices/2/Status/InverterState/Current;Idle; -/AcDc/Devices/2/Status/InverterState/OnLastAlarm;Idle; -/AcDc/Devices/2/Status/ActiveGridType;GridTied400V50Hz; -/AcDc/Devices/2/Status/Voltage/Intern/DcUpperHalf;0;V -/AcDc/Devices/2/Status/Voltage/Intern/DcLowerHalf;0;V -/AcDc/Devices/2/Status/Voltage/Intern/NToPe;0;V -/AcDc/Devices/2/Status/Voltage/Extern/DcUpperHalf;0;V -/AcDc/Devices/2/Status/Voltage/Extern/DcLowerHalf;0;V -/AcDc/Devices/2/Status/Voltage/Extern/NToPe;0;V -/AcDc/Devices/2/Status/Temperature/InletAir;0;°C -/AcDc/Devices/2/Status/Temperature/IgbtL1;0;°C -/AcDc/Devices/2/Status/Temperature/IgbtL2;0;°C -/AcDc/Devices/2/Status/Temperature/IgbtL3;0;°C -/AcDc/Devices/2/Status/Temperature/IgbtBalancer;0;°C -/AcDc/Devices/2/Status/OverloadCapacity/L1;0;% -/AcDc/Devices/2/Status/OverloadCapacity/L2;0;% -/AcDc/Devices/2/Status/OverloadCapacity/L3;0;% -/AcDc/Devices/2/Status/Nominal/AcFrequency;50;Hz -/AcDc/Devices/2/Status/Nominal/AcVoltage;400;V -/AcDc/Devices/2/Status/Nominal/Power;25000;W -/AcDc/Devices/2/Status/Alarms;; -/AcDc/Devices/2/Status/Warnings;; -/AcDc/Devices/2/Control/Ac/PhaseControl;Symmetric; -/AcDc/Devices/2/Control/Ac/GridType;GridTied400V50Hz; -/AcDc/Devices/2/Control/Ac/IslandMode/FrequencyOffset;0;Hz -/AcDc/Devices/2/Control/Ac/IslandMode/VoltageAdjustmentFactor;100;% -/AcDc/Devices/2/Control/Dc/ReferenceVoltage;750;V -/AcDc/Devices/2/Control/Dc/MinVoltage;730;V -/AcDc/Devices/2/Control/Dc/MaxVoltage;770;V -/AcDc/Devices/2/Control/Dc/PrechargeConfig;PrechargeDcWithSystemCtl; -/AcDc/Devices/2/Control/PowerStageEnable;True; -/AcDc/Devices/2/Control/ResetAlarmsAndWarnings;False; -/AcDc/Alarms;; -/AcDc/Warnings;; -/AcDc/Ac/L1/Voltage;0;V -/AcDc/Ac/L1/Current;0;A -/AcDc/Ac/L1/Power/Apparent;0;VA -/AcDc/Ac/L1/Power/Active;0;W -/AcDc/Ac/L1/Power/Reactive;0;var -/AcDc/Ac/L1/Power/Phi;0;rad -/AcDc/Ac/L1/Power/CosPhi;1; -/AcDc/Ac/L2/Voltage;0;V -/AcDc/Ac/L2/Current;0;A -/AcDc/Ac/L2/Power/Apparent;0;VA -/AcDc/Ac/L2/Power/Active;0;W -/AcDc/Ac/L2/Power/Reactive;0;var -/AcDc/Ac/L2/Power/Phi;0;rad -/AcDc/Ac/L2/Power/CosPhi;1; -/AcDc/Ac/L3/Voltage;0;V -/AcDc/Ac/L3/Current;0;A -/AcDc/Ac/L3/Power/Apparent;0;VA -/AcDc/Ac/L3/Power/Active;0;W -/AcDc/Ac/L3/Power/Reactive;0;var -/AcDc/Ac/L3/Power/Phi;0;rad -/AcDc/Ac/L3/Power/CosPhi;1; -/AcDc/Ac/Power/Apparent;0;VA -/AcDc/Ac/Power/Active;0;W -/AcDc/Ac/Power/Reactive;0;var -/AcDc/Ac/Power/Phi;0;rad -/AcDc/Ac/Power/CosPhi;1; -/AcDc/Ac/Frequency;0;Hz -/AcDc/Dc/Voltage;0;V -/AcDc/Dc/Current;0;A -/AcDc/Dc/Power;0;W -/DcDc/Dc/Link/Voltage;0;V -/DcDc/Dc/Link/Current;0;A -/DcDc/Dc/Link/Power;0;W -/DcDc/Dc/Battery/Voltage;0;V -/DcDc/Dc/Battery/Current;0;A -/DcDc/Dc/Battery/Power;0;W -/DcDc/SystemControl/Alarms;; -/DcDc/SystemControl/CommunicationTimeout;00:00:10; -/DcDc/SystemControl/SystemConfig;DcDcOnly; -/DcDc/SystemControl/ResetAlarmsAndWarnings;False; -/DcDc/SystemControl/TargetSlave;0; -/DcDc/SystemControl/UseSlaveIdForAddressing;False; -/DcDc/SystemControl/ReferenceFrame;Producer; -/DcDc/SystemControl/SlaveErrorHandling;Relaxed; -/DcDc/SystemControl/SubSlaveErrorHandling;Strict; -/DcDc/SystemControl/PowerSetPointActivation;Immediate; -/DcDc/SystemControl/PowerSetPointTrigger;Wait; -/DcDc/SystemControl/DeviceState;Operation; -/DcDc/SystemControl/NumberOfConnectedSlaves;2; -/DcDc/SystemControl/NumberOfConnectedSubSlaves;0; -/DcDc/SystemControl/Warnings;; -/DcDc/Devices/1/Status/Dc/Link/Voltage;0;V -/DcDc/Devices/1/Status/Dc/Link/Current;0;A -/DcDc/Devices/1/Status/Dc/Link/Power;0;W -/DcDc/Devices/1/Status/Dc/Battery/Voltage;0;V -/DcDc/Devices/1/Status/Dc/Battery/Current;0;A -/DcDc/Devices/1/Status/Dc/Battery/Power;0;W -/DcDc/Devices/1/Status/OverloadCapacity;0;% -/DcDc/Devices/1/Status/Temperature/InletAir;0;°C -/DcDc/Devices/1/Status/Temperature/HighVoltageModule;0;°C -/DcDc/Devices/1/Status/Temperature/LowVoltageModule;0;°C -/DcDc/Devices/1/Status/PowerLimitedBy;; -/DcDc/Devices/1/Status/Alarms;; -/DcDc/Devices/1/Status/Warnings;; -/DcDc/Devices/1/Control/Vcc/EndPointCurrent;50;A -/DcDc/Devices/1/Control/Vcc/EndPointVoltage;50;V -/DcDc/Devices/1/Control/Vcc/StartPointCurrent;5;A -/DcDc/Devices/1/Control/VoltageLimits/MinBatteryVoltageAlarm;0;V -/DcDc/Devices/1/Control/VoltageLimits/MaxBatteryVoltageAlarm;60;V -/DcDc/Devices/1/Control/VoltageLimits/MinBatteryVoltage;42;V -/DcDc/Devices/1/Control/VoltageLimits/MaxBatteryVoltage;57;V -/DcDc/Devices/1/Control/DroopControl/ReferenceVoltage;750;V -/DcDc/Devices/1/Control/DroopControl/LowerVoltage;55;V -/DcDc/Devices/1/Control/DroopControl/UpperVoltage;55;V -/DcDc/Devices/1/Control/DroopControl/VoltageDeadband;0;V -/DcDc/Devices/1/Control/CurrentControl/CurrentSetpoint;0;A -/DcDc/Devices/1/Control/CurrentControl/MaxCurrentChangePerMs;100;A -/DcDc/Devices/1/Control/MaxDcPower;5;W -/DcDc/Devices/1/Control/ControlMode;VoltageDroop; -/DcDc/Devices/1/Control/ResetAlarmsAndWarnings;False; -/DcDc/Devices/1/Control/PowerStageEnable;True; -/DcDc/Devices/2/Status/Dc/Link/Voltage;0;V -/DcDc/Devices/2/Status/Dc/Link/Current;0;A -/DcDc/Devices/2/Status/Dc/Link/Power;0;W -/DcDc/Devices/2/Status/Dc/Battery/Voltage;0;V -/DcDc/Devices/2/Status/Dc/Battery/Current;0;A -/DcDc/Devices/2/Status/Dc/Battery/Power;0;W -/DcDc/Devices/2/Status/OverloadCapacity;0;% -/DcDc/Devices/2/Status/Temperature/InletAir;0;°C -/DcDc/Devices/2/Status/Temperature/HighVoltageModule;0;°C -/DcDc/Devices/2/Status/Temperature/LowVoltageModule;0;°C -/DcDc/Devices/2/Status/PowerLimitedBy;; -/DcDc/Devices/2/Status/Alarms;; -/DcDc/Devices/2/Status/Warnings;; -/DcDc/Devices/2/Control/Vcc/EndPointCurrent;50;A -/DcDc/Devices/2/Control/Vcc/EndPointVoltage;50;V -/DcDc/Devices/2/Control/Vcc/StartPointCurrent;5;A -/DcDc/Devices/2/Control/VoltageLimits/MinBatteryVoltageAlarm;0;V -/DcDc/Devices/2/Control/VoltageLimits/MaxBatteryVoltageAlarm;60;V -/DcDc/Devices/2/Control/VoltageLimits/MinBatteryVoltage;42;V -/DcDc/Devices/2/Control/VoltageLimits/MaxBatteryVoltage;57;V -/DcDc/Devices/2/Control/DroopControl/ReferenceVoltage;750;V -/DcDc/Devices/2/Control/DroopControl/LowerVoltage;55;V -/DcDc/Devices/2/Control/DroopControl/UpperVoltage;55;V -/DcDc/Devices/2/Control/DroopControl/VoltageDeadband;0;V -/DcDc/Devices/2/Control/CurrentControl/CurrentSetpoint;0;A -/DcDc/Devices/2/Control/CurrentControl/MaxCurrentChangePerMs;100;A -/DcDc/Devices/2/Control/MaxDcPower;5;W -/DcDc/Devices/2/Control/ControlMode;VoltageDroop; -/DcDc/Devices/2/Control/ResetAlarmsAndWarnings;False; -/DcDc/Devices/2/Control/PowerStageEnable;True; -/DcDc/Alarms;; -/DcDc/Warnings;; -/Battery/Dc/Voltage;51.898;V -/Battery/Dc/Current;0.21000000000000002;A -/Battery/Dc/Power;10.898580000000003;W -/Battery/Eoc;True; -/Battery/Warnings;; -/Battery/Alarms;; -/Battery/Soc;99.9;% -/Battery/Devices/1/Dc/Voltage;51.69;V -/Battery/Devices/1/Dc/Current;0.05;A -/Battery/Devices/1/Dc/Power;2.5845000000000002;W -/Battery/Devices/1/Leds/Blue;Off; -/Battery/Devices/1/Leds/Red;Off; -/Battery/Devices/1/Leds/Green;On; -/Battery/Devices/1/Leds/Amber;Off; -/Battery/Devices/1/Temperatures/Heating;True; -/Battery/Devices/1/Temperatures/Board;46.5;°C -/Battery/Devices/1/Temperatures/Cells/Center;249.9;°C -/Battery/Devices/1/Temperatures/Cells/Left;249.5;°C -/Battery/Devices/1/Temperatures/Cells/Right;249.5;°C -/Battery/Devices/1/Temperatures/State;Operation; -/Battery/Devices/1/ConnectedToDcBus;True; -/Battery/Devices/1/Eoc;True; -/Battery/Devices/1/Warnings;; -/Battery/Devices/1/Alarms;; -/Battery/Devices/1/Soc;100;% -/Battery/Devices/1/MaxChargePower;5418.875;W -/Battery/Devices/1/MaxDischargePower;-4668.75;W -/Battery/Devices/2/Dc/Voltage;51.49;V -/Battery/Devices/2/Dc/Current;0.02;A -/Battery/Devices/2/Dc/Power;1.0298;W -/Battery/Devices/2/Leds/Blue;Off; -/Battery/Devices/2/Leds/Red;Off; -/Battery/Devices/2/Leds/Green;On; -/Battery/Devices/2/Leds/Amber;Off; -/Battery/Devices/2/Temperatures/Heating;True; -/Battery/Devices/2/Temperatures/Board;55;°C -/Battery/Devices/2/Temperatures/Cells/Center;251.4;°C -/Battery/Devices/2/Temperatures/Cells/Left;249.8;°C -/Battery/Devices/2/Temperatures/Cells/Right;254.2;°C -/Battery/Devices/2/Temperatures/State;Operation; -/Battery/Devices/2/ConnectedToDcBus;True; -/Battery/Devices/2/Eoc;True; -/Battery/Devices/2/Warnings;; -/Battery/Devices/2/Alarms;; -/Battery/Devices/2/Soc;100;% -/Battery/Devices/2/MaxChargePower;5398.95;W -/Battery/Devices/2/MaxDischargePower;-4648.900000000001;W -/Battery/Devices/3/Dc/Voltage;52.2;V -/Battery/Devices/3/Dc/Current;0.02;A -/Battery/Devices/3/Dc/Power;1.044;W -/Battery/Devices/3/Leds/Blue;Off; -/Battery/Devices/3/Leds/Red;Off; -/Battery/Devices/3/Leds/Green;On; -/Battery/Devices/3/Leds/Amber;Off; -/Battery/Devices/3/Temperatures/Heating;True; -/Battery/Devices/3/Temperatures/Board;47.5;°C -/Battery/Devices/3/Temperatures/Cells/Center;250.5;°C -/Battery/Devices/3/Temperatures/Cells/Left;249.8;°C -/Battery/Devices/3/Temperatures/Cells/Right;251.4;°C -/Battery/Devices/3/Temperatures/State;Operation; -/Battery/Devices/3/ConnectedToDcBus;True; -/Battery/Devices/3/Eoc;True; -/Battery/Devices/3/Warnings;; -/Battery/Devices/3/Alarms;; -/Battery/Devices/3/Soc;100;% -/Battery/Devices/3/MaxChargePower;5469.95;W -/Battery/Devices/3/MaxDischargePower;-4719.900000000001;W -/Battery/Devices/4/Dc/Voltage;51.94;V -/Battery/Devices/4/Dc/Current;0.03;A -/Battery/Devices/4/Dc/Power;1.5581999999999998;W -/Battery/Devices/4/Leds/Blue;Off; -/Battery/Devices/4/Leds/Red;Off; -/Battery/Devices/4/Leds/Green;On; -/Battery/Devices/4/Leds/Amber;Off; -/Battery/Devices/4/Temperatures/Heating;True; -/Battery/Devices/4/Temperatures/Board;47;°C -/Battery/Devices/4/Temperatures/Cells/Center;250;°C -/Battery/Devices/4/Temperatures/Cells/Left;249.8;°C -/Battery/Devices/4/Temperatures/Cells/Right;252.1;°C -/Battery/Devices/4/Temperatures/State;Operation; -/Battery/Devices/4/ConnectedToDcBus;False; -/Battery/Devices/4/Eoc;True; -/Battery/Devices/4/Warnings;; -/Battery/Devices/4/Alarms;; -/Battery/Devices/4/Soc;99.9;% -/Battery/Devices/4/MaxChargePower;5443.925;W -/Battery/Devices/4/MaxDischargePower;-4693.849999999999;W -/Battery/Devices/5/Dc/Voltage;52.17;V -/Battery/Devices/5/Dc/Current;0.09;A -/Battery/Devices/5/Dc/Power;4.6953;W -/Battery/Devices/5/Leds/Blue;Off; -/Battery/Devices/5/Leds/Red;Off; -/Battery/Devices/5/Leds/Green;On; -/Battery/Devices/5/Leds/Amber;Off; -/Battery/Devices/5/Temperatures/Heating;True; -/Battery/Devices/5/Temperatures/Board;48.5;°C -/Battery/Devices/5/Temperatures/Cells/Center;250.6;°C -/Battery/Devices/5/Temperatures/Cells/Left;249.8;°C -/Battery/Devices/5/Temperatures/Cells/Right;250.8;°C -/Battery/Devices/5/Temperatures/State;Operation; -/Battery/Devices/5/ConnectedToDcBus;True; -/Battery/Devices/5/Eoc;True; -/Battery/Devices/5/Warnings;; -/Battery/Devices/5/Alarms;; -/Battery/Devices/5/Soc;100;% -/Battery/Devices/5/MaxChargePower;5466.775;W -/Battery/Devices/5/MaxDischargePower;-4716.55;W -/GridMeter/Ac/L1/Voltage;243;V -/GridMeter/Ac/L1/Current;-12.360750198364258;A -/GridMeter/Ac/L1/Power/Apparent;3009.25;VA -/GridMeter/Ac/L1/Power/Active;-2969;W -/GridMeter/Ac/L1/Power/Reactive;502;var -/GridMeter/Ac/L1/Power/Phi;2.974096306323614;rad -/GridMeter/Ac/L1/Power/CosPhi;-0.9860052513602484; -/GridMeter/Ac/L2/Voltage;243.60000610351562;V -/GridMeter/Ac/L2/Current;-12.548500061035156;A -/GridMeter/Ac/L2/Power/Apparent;3043;VA -/GridMeter/Ac/L2/Power/Active;-3033;W -/GridMeter/Ac/L2/Power/Reactive;351;var -/GridMeter/Ac/L2/Power/Phi;3.026378172298827;rad -/GridMeter/Ac/L2/Power/CosPhi;-0.9933701504473591; -/GridMeter/Ac/L3/Voltage;244.39999389648438;V -/GridMeter/Ac/L3/Current;-13.57349967956543;A -/GridMeter/Ac/L3/Power/Apparent;3317;VA -/GridMeter/Ac/L3/Power/Active;-3313;W -/GridMeter/Ac/L3/Power/Reactive;-73.25;var -/GridMeter/Ac/L3/Power/Phi;-3.1194863851016974;rad -/GridMeter/Ac/L3/Power/CosPhi;-0.9997556663972327; -/GridMeter/Ac/Power/Apparent;9347.579101697936;VA -/GridMeter/Ac/Power/Active;-9315;W -/GridMeter/Ac/Power/Reactive;779.75;var -/GridMeter/Ac/Power/Phi;3.058078286561564;rad -/GridMeter/Ac/Power/CosPhi;-0.9965147016844159; -/GridMeter/Ac/Frequency;50;Hz -/CriticalLoad/Ac/L1/Voltage;244;V -/CriticalLoad/Ac/L1/Current;0;A -/CriticalLoad/Ac/L1/Power/Apparent;0;VA -/CriticalLoad/Ac/L1/Power/Active;0;W -/CriticalLoad/Ac/L1/Power/Reactive;0;var -/CriticalLoad/Ac/L1/Power/Phi;0;rad -/CriticalLoad/Ac/L1/Power/CosPhi;1; -/CriticalLoad/Ac/L2/Voltage;243;V -/CriticalLoad/Ac/L2/Current;0;A -/CriticalLoad/Ac/L2/Power/Apparent;0;VA -/CriticalLoad/Ac/L2/Power/Active;0;W -/CriticalLoad/Ac/L2/Power/Reactive;0;var -/CriticalLoad/Ac/L2/Power/Phi;0;rad -/CriticalLoad/Ac/L2/Power/CosPhi;1; -/CriticalLoad/Ac/L3/Voltage;245.6999969482422;V -/CriticalLoad/Ac/L3/Current;0;A -/CriticalLoad/Ac/L3/Power/Apparent;0;VA -/CriticalLoad/Ac/L3/Power/Active;0;W -/CriticalLoad/Ac/L3/Power/Reactive;0;var -/CriticalLoad/Ac/L3/Power/Phi;0;rad -/CriticalLoad/Ac/L3/Power/CosPhi;1; -/CriticalLoad/Ac/Power/Apparent;0;VA -/CriticalLoad/Ac/Power/Active;0;W -/CriticalLoad/Ac/Power/Reactive;0;var -/CriticalLoad/Ac/Power/Phi;0;rad -/CriticalLoad/Ac/Power/CosPhi;1; -/CriticalLoad/Ac/Frequency;50;Hz -/Relays/K1AcInIsConnectedToGrid;True; -/Relays/K2AcInIsConnectedToAcOut;True; -/Relays/K3Inverter1IsConnectedToAcOut;True; -/Relays/K3Inverter2IsConnectedToAcOut;True; -/Relays/K3Inverter3IsConnectedToAcOut;True; -/Relays/K3Inverter4IsConnectedToAcOut;True; -/Relays/FiWarning;False; -/Relays/FiError;False; -/Relays/K2ConnectAcInToAcOut;True; -/Relays/K3InvertersAreConnectedToAcOut;True; -/Mppt/Dc/Voltage;772.454;V -/Mppt/Dc/Current;10.655000000000001;A -/Mppt/Dc/Power;8230.497370000001;W -/Mppt/Strings/1/Voltage;690.09;V -/Mppt/Strings/1/Current;3.221;A -/Mppt/Strings/1/Power;2222.7798900000003;W -/Mppt/Strings/2/Voltage;599.549;V -/Mppt/Strings/2/Current;3.23;A -/Mppt/Strings/2/Power;1936.54327;W -/Mppt/Strings/3/Voltage;695.46;V -/Mppt/Strings/3/Current;3.371;A -/Mppt/Strings/3/Power;2344.39566;W -/Mppt/Strings/4/Voltage;623.849;V -/Mppt/Strings/4/Current;2.868;A -/Mppt/Strings/4/Power;1789.198932;W -/Config/MinSoc;20; -/Config/LastEoc;0; -/Config/PConstant;0.5; -/Config/ForceChargePower;1000000; -/Config/ForceDischargePower;-1000000; -/Config/MaxInverterPower;32000; -/Config/GridSetPoint;0; -/Config/SelfDischargePower;200; -/Config/HoldSocZone;1; -/Config/ControllerPConstant;0.5; -/SystemState/Message;Panic: Unknown State!; -/SystemState/Id;100; -/LoadOnDc/Power;100;`; - const s3Access = new S3Access( "saliomameiringen", "sos-ch-dk-2", @@ -525,11 +67,9 @@ const ScalarGraph = () => { timeRange[0].toDate(), timeRange[timeRange.length - 1].toDate(), ]); - const [uiRevision, setUiRevision] = useState(Math.random()); const [plotTitles, setPlotTitles] = useState([]); - const { toggles, setToggles, setCheckedToggles, checkedToggles } = - useContext(LogContext); + const { toggles, setToggles, checkedToggles } = useContext(LogContext); const times$ = useMemo(() => new BehaviorSubject(timeRange), []); @@ -548,7 +88,6 @@ const ScalarGraph = () => { if (toggles === null && toggleValues && toggleValues.value) { const treeElements = getTreeElements(toggleValues.value); setToggles(treeElements); - setCheckedToggles(flattenToggles(treeElements)); } }); return () => subscription.unsubscribe(); @@ -597,143 +136,118 @@ const ScalarGraph = () => { ); }; - const getCacheSeries = (xaxisRange0: Date, xaxisRange1: Date) => { - const times = createTimes( - TimeRange.fromTimes( - UnixTime.fromDate(xaxisRange0), - UnixTime.fromDate(xaxisRange1) - ), - NUMBER_OF_NODES + const getCacheSeries = useCallback( + (xaxisRange0: Date, xaxisRange1: Date) => { + const times = createTimes( + TimeRange.fromTimes( + UnixTime.fromDate(xaxisRange0), + UnixTime.fromDate(xaxisRange1) + ), + NUMBER_OF_NODES + ); + cache.getSeries(times); + times$.next(times); + }, + [cache, times$] + ); + + const handleRelayout = useCallback( + (params: PlotRelayoutEvent) => { + const xaxisRange0 = params["xaxis.range[0]"]; + const xaxisRange1 = params["xaxis.range[1]"]; + if (xaxisRange0 && xaxisRange1) { + const range0 = new Date(xaxisRange0); + const range1 = new Date(xaxisRange1); + setRange([range0, range1]); + getCacheSeries(range0, range1); + } + }, + [getCacheSeries] + ); + + const renderGraphs = () => { + if (checkedToggles.length > 0) { + const coordinateTimeSeries = transformToGraphData(timeSeries); + const visibleGraphs = Object.keys(coordinateTimeSeries).filter((path) => { + console.log('checkedToggles',coordinateTimeSeries, checkedToggles) + return checkedToggles.find((toggle) => toggle === path) + } + ); + console.log('visibleGraphs', visibleGraphs) + if (visibleGraphs.length > 0) { + return ( +
+ + + + {visibleGraphs.map((path) => { + const isScalar = isNumeric(coordinateTimeSeries[path].y[0]); + const data = isScalar + ? [ + { + ...coordinateTimeSeries[path], + type: "scatter", + mode: "lines", + fill: "tozeroy", + }, + ] + : transformToBarGraphData(coordinateTimeSeries[path]); + const barGraphLayout: Partial = !isScalar + ? { + bargap: 0, + barmode: "stack", + barnorm: "percent", + } + : {}; + console.log("graphdata", coordinateTimeSeries); + return ( + + ); + })} +
+ ); + } + } + return ( + + + ); - cache.getSeries(times); - times$.next(times); }; - const Row = memo((props: any) => { - const { data, index, style } = props; - const visibleGraphs = Object.keys(data).filter((path) => { - return checkedToggles ? checkedToggles[path] : false; - }); - if (data[visibleGraphs[index]]) { - const isScalar = isNumeric(data[visibleGraphs[index]].y[0]); - const graphData = isScalar - ? [ - { - ...data[visibleGraphs[index]], - type: "scatter", - mode: "lines+markers", - fill: "tozeroy", - }, - ] - : transformToBarGraphData(data[visibleGraphs[index]]); - const barGraphLayout: Partial = !isScalar - ? { - bargap: 0, - barmode: "stack", - barnorm: "percent", - } - : {}; - return ( -
- { - console.log("event onupdate", params); - }} - onSliderChange={(params) => { - console.log("event sliderchange", params); - }} - onRestyle={(params) => { - console.log("event restyle", params); - }} - onRelayout={(params) => { - console.log("event relayout", params); - - const xaxisRange0 = params["xaxis.range[0]"]; - const xaxisRange1 = params["xaxis.range[1]"]; - console.log("relayout", xaxisRange0, xaxisRange1); - if (xaxisRange0 && xaxisRange1) { - console.log("relayout", xaxisRange0, xaxisRange1); - const range0 = new Date(xaxisRange0); - const range1 = new Date(xaxisRange1); - - setRange([range0, range1]); - setUiRevision(Math.random()); - getCacheSeries(range0, range1); - } - }} - /> -
- ); - } - return null; - }, areEqual); - - if ( - checkedToggles && - Object.keys(checkedToggles).find((toggle) => { - return checkedToggles[toggle]; - }) - ) { - const coordinateTimeSeries = transformToGraphData(timeSeries); - return ( -
- - - - checkedToggles[toggle] - ).length - 1 - } - itemSize={() => 500} - width="100%" - itemData={coordinateTimeSeries} - > - {Row} - -
- ); - } - - return ( - - - - ); + return <>{renderGraphs()}; }; export default ScalarGraph; diff --git a/typescript/Frontend/src/components/Installations/Log/TopologyBox.tsx b/typescript/Frontend/src/components/Installations/Log/TopologyBox.tsx index c73b9e3ea..3eb85a039 100644 --- a/typescript/Frontend/src/components/Installations/Log/TopologyBox.tsx +++ b/typescript/Frontend/src/components/Installations/Log/TopologyBox.tsx @@ -1,79 +1,79 @@ -import { Box } from "@mui/material"; -import { getBoxColor } from "../../../util/graph.util"; +import {Box} from "@mui/material"; +import {getBoxColor} from "../../../util/graph.util"; export type BoxData = { - label: string; - values: (string | number)[]; - unit: string; + label: string; + values: (string | number)[]; + unit: string; }; export type TopologyBoxProps = { - title?: string; - data?: BoxData; + title?: string; + data?: BoxData; }; const isInt = (value: number) => { - return value % 1 === 0; + return value % 1 === 0; }; export const BOX_SIZE = 85; const TopologyBox = (props: TopologyBoxProps) => { - const { titleColor, boxColor } = getBoxColor(props.title); - if (props.title === "Battery") console.log(props.data?.values, "data"); - return ( - -

- {props.title} -

-
- {props.data && ( - <> - {props.data.values.map((value, index) => { - return ( -

{`${ - props.data && props.data.values.length === 3 - ? "L" + (index + 1) + " " - : "" - }${ - !isInt(Number(value)) ? Number(value).toPrecision(4) : value - }${props.data?.unit}`}

- ); - })} - - )} -
-
- ); + const {titleColor, boxColor} = getBoxColor(props.title); + return ( + +

+ {props.title} +

+
+ {props.data && ( + <> + {props.data.values.map((value, index) => { + return ( +

{`${ + props.data && props.data.values.length === 3 + ? "L" + (index + 1) + " " + : "" + }${ + !isInt(Number(value)) ? Number(value).toPrecision(4) : value + }${props.data?.unit}`}

+ ); + })} + + )} +
+
+ ); }; export default TopologyBox; diff --git a/typescript/Frontend/src/components/Installations/Log/TopologyFlow.tsx b/typescript/Frontend/src/components/Installations/Log/TopologyFlow.tsx index d3def8fb3..4f3912382 100644 --- a/typescript/Frontend/src/components/Installations/Log/TopologyFlow.tsx +++ b/typescript/Frontend/src/components/Installations/Log/TopologyFlow.tsx @@ -9,7 +9,6 @@ export type TopologyFlowProps = { hidden?: boolean; }; const TopologyFlow = (props: TopologyFlowProps) => { - console.log("amount", props.amount, props.data?.values); const length = Math.abs((props.amount ?? 1) * BOX_SIZE); const values = props.data?.values; return ( diff --git a/typescript/Frontend/src/util/graph.util.tsx b/typescript/Frontend/src/util/graph.util.tsx index 1693e21c7..9df5afb52 100644 --- a/typescript/Frontend/src/util/graph.util.tsx +++ b/typescript/Frontend/src/util/graph.util.tsx @@ -1,7 +1,6 @@ import { Datum, TypedArray } from "plotly.js"; import { TreeElement, - ToggleElement, } from "../components/Installations/Log/CheckboxTree"; import { TimeRange, UnixTime } from "../dataCache/time"; import { DataPoint, DataRecord } from "../dataCache/data"; @@ -143,7 +142,6 @@ export const extractTopologyValues = ( const values = topologyPaths[topologyKey as keyof TopologyValues].map( (topologyPath) => timeSeriesValue[topologyPath] ); - console.log("values", values, topologyKey); switch (topologyKey as keyof TopologyValues) { case "gridToAcInConnection": topologyValues = [ @@ -153,7 +151,6 @@ export const extractTopologyValues = ( default: topologyValues = values.map((element) => element.value); } - console.log("topologyValues", topologyValues); return { ...acc, [topologyKey]: { @@ -198,10 +195,11 @@ export const parseCsv = (text: string): DataRecord => { .map((l) => { return l.split(";"); }); - const x = y .map((fields) => { - if (isNaN(Number(fields[1]))) { + if (fields[0] === "/AcDc/Warnings") + console.log("warnings", fields[1], isNaN(+fields[1])); + if (isNaN(Number(fields[1])) || fields[1] === "") { return { [fields[0]]: { value: fields[1], unit: fields[2] } }; } return { [fields[0]]: { value: parseFloat(fields[1]), unit: fields[2] } }; @@ -210,17 +208,6 @@ export const parseCsv = (text: string): DataRecord => { return x; }; -export const flattenToggles = (toggles: TreeElement[]): ToggleElement => { - return toggles.reduce((acc, current) => { - if (current.children.length > 0) { - acc[current.id] = false; - return { ...acc, ...flattenToggles(current.children) }; - } - acc[current.id] = false; - return acc; - }, {} as ToggleElement); -}; - export const insertTreeElements = ( children: TreeElement[] = [], [head, ...tail]: string[] @@ -291,7 +278,7 @@ export const transformToBarGraphData = (data: GraphCoordinates) => { marker: { color: stringToColor(split) }, type: "bar", name: split, - showlegend: !foundName, + showlegend: split.length > 0 ? !foundName : false, } as any; }); }