diff --git a/csharp/App/Backend/db.sqlite b/csharp/App/Backend/db.sqlite
index 08f80b97b..b553a5903 100644
Binary files a/csharp/App/Backend/db.sqlite and b/csharp/App/Backend/db.sqlite differ
diff --git a/csharp/App/SaliMax/SaliMax.csproj b/csharp/App/SaliMax/SaliMax.csproj
index 8c66b470f..0360f4ae5 100644
--- a/csharp/App/SaliMax/SaliMax.csproj
+++ b/csharp/App/SaliMax/SaliMax.csproj
@@ -1,8 +1,4 @@
-
- Debug;Release;Release-Server
- AnyCPU;linux-arm
-
@@ -26,4 +22,4 @@
-
\ No newline at end of file
+
diff --git a/csharp/App/SaliMax/run (Salimax 0001).sh b/csharp/App/SaliMax/run (Salimax 0001).sh
index a138c3067..2091f5208 100755
--- a/csharp/App/SaliMax/run (Salimax 0001).sh
+++ b/csharp/App/SaliMax/run (Salimax 0001).sh
@@ -2,7 +2,7 @@
dotnet_version='net6.0'
salimax_ip= '10.2.3.104'
-username='ie-entwicklung@'
+username='ie-entwicklung'
set -e
@@ -11,7 +11,7 @@ echo -e "\n============================ Build ============================\n"
dotnet publish \
./SaliMax.csproj \
-c Release \
- -r linux-x64
+ -r linux-x64
echo -e "\n============================ Deploy ============================\n"
diff --git a/csharp/App/SaliMax/run (Salimax0003).sh b/csharp/App/SaliMax/run (Salimax0003).sh
new file mode 100644
index 000000000..ba6f5b68c
--- /dev/null
+++ b/csharp/App/SaliMax/run (Salimax0003).sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+dotnet_version='net6.0'
+salimax_ip='10.2.4.33'
+username='ie-entwicklung'
+
+set -e
+
+echo -e "\n============================ Build ============================\n"
+
+dotnet publish \
+ ./SaliMax.csproj \
+ -p:PublishTrimmed=false \
+ -c Release \
+ -r linux-x64
+
+echo -e "\n============================ Deploy ============================\n"
+
+rsync -v \
+ ./bin/Release/$dotnet_version/linux-x64/publish/* \
+ ie-entwicklung@10.2.4.33:~/salimax
+
+echo -e "\n============================ Restart Salimax sevice ============================\n"
+
+ssh -tt \
+ ie-entwicklung@10.2.4.33 \
+ sudo systemctl restart salimax.service
+
+
+echo -e "\n============================ Print service output ============================\n"
+
+ssh -tt \
+ ie-entwicklung@10.2.4.33 \
+ journalctl -f -u salimax.service
\ No newline at end of file
diff --git a/csharp/App/SaliMax/run (SalimnaxProto Meiringen).sh b/csharp/App/SaliMax/run (SalimnaxProto Meiringen).sh
index b9c4614cb..d2ed6e95d 100755
--- a/csharp/App/SaliMax/run (SalimnaxProto Meiringen).sh
+++ b/csharp/App/SaliMax/run (SalimnaxProto Meiringen).sh
@@ -1,9 +1,8 @@
#!/bin/bash
-
dotnet_version='net6.0'
-salimax_ip= '10.2.3.115'
-username='ie-entwicklung@'
+salimax_ip='10.2.3.115'
+username='ie-entwicklung'
set -e
@@ -13,23 +12,23 @@ dotnet publish \
./SaliMax.csproj \
-p:PublishTrimmed=false \
-c Release \
- -r linux-x64
+ -r linux-x64
echo -e "\n============================ Deploy ============================\n"
rsync -v \
./bin/Release/$dotnet_version/linux-x64/publish/* \
- ie-entwicklung@10.2.3.115:~/salimax
+ $username@$salimax_ip:~/salimax
echo -e "\n============================ Restart Salimax sevice ============================\n"
ssh -tt \
- ie-entwicklung@10.2.3.115 \
+ $username@$salimax_ip \
sudo systemctl restart salimax.service
echo -e "\n============================ Print service output ============================\n"
ssh -tt \
- ie-entwicklung@10.2.3.115 \
+ $username@$salimax_ip \
journalctl -f -u salimax.service
diff --git a/csharp/App/SaliMax/src/Ess/Controller.cs b/csharp/App/SaliMax/src/Ess/Controller.cs
index 64fe03b05..7d6601450 100644
--- a/csharp/App/SaliMax/src/Ess/Controller.cs
+++ b/csharp/App/SaliMax/src/Ess/Controller.cs
@@ -187,7 +187,7 @@ public static class Controller
if (statusRecord.Battery.Eoc)
{
- "Batteries have reached EOC".Log();
+ "Batteries have reached EOC".LogInfo();
config.LastEoc = UnixTime.Now;
return false;
}
diff --git a/csharp/App/SaliMax/src/Logger.cs b/csharp/App/SaliMax/src/Logger.cs
index 56414bf66..666cad058 100644
--- a/csharp/App/SaliMax/src/Logger.cs
+++ b/csharp/App/SaliMax/src/Logger.cs
@@ -10,11 +10,30 @@ public static class Logger
private const Int32 MaxLogFileCount = 1000; // TODO: move to settings
private const String LogFilePath = "LogDirectory/log.txt"; // TODO: move to settings
+ // ReSharper disable once InconsistentNaming
private static readonly ILogger _logger = new CustomLogger(LogFilePath, MaxFileSizeBytes, MaxLogFileCount);
- public static T Log(this T t) where T : notnull
+ public static T LogInfo(this T t) where T : notnull
{
- // _logger.LogInformation(t.ToString()); // TODO: check warning
+ _logger.LogInformation(t.ToString()); // TODO: check warning
+ return t;
+ }
+
+ public static T LogDebug(this T t) where T : notnull
+ {
+ _logger.LogDebug(t.ToString()); // TODO: check warning
+ return t;
+ }
+
+ public static T LogError(this T t) where T : notnull
+ {
+ _logger.LogError(t.ToString()); // TODO: check warning
+ return t;
+ }
+
+ public static T LogWarning(this T t) where T : notnull
+ {
+ _logger.LogWarning(t.ToString()); // TODO: check warning
return t;
}
}
\ No newline at end of file
diff --git a/csharp/App/SaliMax/src/Program.cs b/csharp/App/SaliMax/src/Program.cs
index 0f35bac07..0de19fc93 100644
--- a/csharp/App/SaliMax/src/Program.cs
+++ b/csharp/App/SaliMax/src/Program.cs
@@ -36,20 +36,23 @@ internal static class Program
private static readonly Byte[] BatteryNodes = { 2, 3, 4, 5, 6 };
private const String BatteryTty = "/dev/ttyUSB0";
+#if DEBUG
+ private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("localhost", 5001);
+ private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("localhost", 5002);
+ private static readonly TcpChannel GridMeterChannel = new TcpChannel("localhost", 5003);
+ private static readonly TcpChannel AcOutLoadChannel = new TcpChannel("localhost", 5004);
+ private static readonly TcpChannel AmptChannel = new TcpChannel("localhost", 5005);
+ private static readonly TcpChannel RelaysChannel = new TcpChannel("localhost", 5006);
+ private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007);
+#else
private static readonly TcpChannel RelaysChannel = new TcpChannel("10.0.1.1", 502); // "192.168.1.242";
private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("10.0.2.1", 502); // "192.168.1.2";
private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("10.0.3.1", 502); // "192.168.1.3";
private static readonly TcpChannel GridMeterChannel = new TcpChannel("10.0.4.1", 502); // "192.168.1.241";
private static readonly TcpChannel AcOutLoadChannel = new TcpChannel("10.0.4.2", 502); // "192.168.1.241";
private static readonly TcpChannel AmptChannel = new TcpChannel("10.0.5.1", 502); // "192.168.1.249";
-
- //private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("localhost", 5001);
- //private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("localhost", 5002);
- //private static readonly TcpChannel GridMeterChannel = new TcpChannel("localhost", 5003);
- //private static readonly TcpChannel AcOutLoadChannel = new TcpChannel("localhost", 5004);
- //private static readonly TcpChannel AmptChannel = new TcpChannel("localhost", 5005);
- //private static readonly TcpChannel RelaysChannel = new TcpChannel("localhost", 5006);
- //private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007);
+ private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007);
+#endif
private static readonly S3Config S3Config = new S3Config
@@ -165,7 +168,6 @@ internal static class Program
Console.WriteLine("press ctrl-C to stop");
-
while (true)
{
sd_notify(0, "WATCHDOG=1");
@@ -180,16 +182,7 @@ internal static class Program
if (record.Relays is not null)
record.Relays.ToCsv().WriteLine();
-
-
- var emuMeterRegisters = record.GridMeter;
- if (emuMeterRegisters is not null)
- {
- emuMeterRegisters.Ac.Power.Active.WriteLine("Grid Active");
- //emuMeterRegisters.Ac.Power.Reactive.WriteLine("Grid Reactive");
- }
-
-
+
record.ControlConstants();
record.ControlSystemState();
@@ -256,11 +249,11 @@ internal static class Program
// Voltage Measurement Values
//var inverterVoltage = new Voltage [(Int32)s.AcDc.Ac.L1.Voltage, (Int32)s.AcDc.Ac.L2.Voltage, (Int32)s.AcDc.Ac.L3.Voltage];
//var dcLinkVoltage = s.DcDc.Dc.Link.Voltage;
- var dc48Voltage = s.DcDc.Dc.Battery.Voltage;
- var batteryVoltage = s.Battery.Dc.Voltage;
- var batterySoc = s.Battery.Soc;
- var batteryCurrent = s.Battery.Dc.Current;
- var batteryTemp = s.Battery.Temperature;
+ var dc48Voltage = s.DcDc.Dc.Battery.Voltage.ToDisplayString();
+ var batteryVoltage = s.Battery.Dc.Voltage.ToDisplayString;
+ var batterySoc = s.Battery.Soc.ToDisplayString();
+ var batteryCurrent = s.Battery.Dc.Current.ToDisplayString();
+ var batteryTemp = s.Battery.Temperature.ToDisplayString();
var gridBusColumn = ColumnBox("Pv", "Grid Bus", "Load" , gridVoltageByPhase , gridLoadPower);
var islandBusColumn = ColumnBox("Pv", "Island Bus", "Load" , inverterPowerByPhase, islandLoadPower);
@@ -272,12 +265,25 @@ internal static class Program
var flowDcBusToDcDc = Flow.Horizontal(dcdcPower);
var flowDcDcToBattery = Flow.Horizontal(dcBatteryPower);
- 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.ToDisplayString(), batterySoc.ToDisplayString(), batteryCurrent.ToDisplayString(), batteryTemp.ToDisplayString()).TitleBox("Battery");
+ var gridBox = TextBlock.AlignLeft(gridPowerByPhase).TitleBox("Grid");
+ var inverterBox = TextBlock.AlignLeft(inverterPowerByAcDc).TitleBox("Inverter");
+ var dcDcBox = TextBlock.AlignLeft(dc48Voltage).TitleBox("DC/DC");
+ var batteryAvgBox = TextBlock.AlignLeft(batteryVoltage,
+ batterySoc,
+ batteryCurrent,
+ batteryTemp)
+ .TitleBox("Battery");
+
+ //////////////////// Batteries /////////////////////////
+ var batteryBoxes = s.Battery
+ .Devices
+ .Select(CreateIndividualBattery)
+ .ToArray(s.Battery.Devices.Count);
+
+ var individualBatteries = TextBlock.AlignLeft(batteryBoxes);
+
var totalBoxes = TextBlock.CenterVertical(gridBox,
gridBusFlow,
@@ -291,11 +297,28 @@ internal static class Program
flowDcBusToDcDc,
dcDcBox,
flowDcDcToBattery,
- batteryBox);
-
+ batteryAvgBox,
+ individualBatteries);
totalBoxes.WriteLine();
}
+ private static TextBlock CreateIndividualBattery(Battery48TlRecord battery, Int32 i)
+ {
+
+ var content = TextBlock.AlignLeft(battery.Dc.Voltage.ToDisplayString(),
+ battery.Soc.ToDisplayString(),
+ battery.Dc.Current.ToDisplayString(),
+ battery.Temperatures.Cells.Average.ToDisplayString(),
+ battery.BusCurrent.ToDisplayString(),
+ battery.HeatingCurrent.ToDisplayString());
+
+ var box = content.TitleBox($"Battery {i + 1}");
+
+ var flow = Flow.Horizontal(battery.Dc.Power);
+
+ return TextBlock.CenterVertical(flow, box);
+ }
+
private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox)
{
return ColumnBox(pvTitle, busTitle, loadTitle, dataBox, 0);
@@ -414,6 +437,5 @@ internal static class Program
Console.WriteLine(error);
}
}
-
}
diff --git a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDevice.cs b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDevice.cs
index e58e5ac26..31afb815c 100644
--- a/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDevice.cs
+++ b/csharp/App/SaliMax/src/SaliMaxRelays/RelaysDevice.cs
@@ -18,7 +18,7 @@ public class RelaysDevice
}
catch (Exception e)
{
- $"Failed to read from {nameof(RelaysDevice)}\n{e}".Log();
+ $"Failed to read from {nameof(RelaysDevice)}\n{e}".LogInfo();
// TODO: log
return null;
@@ -33,7 +33,7 @@ public class RelaysDevice
}
catch (Exception e)
{
- $"Failed to write to {nameof(RelaysDevice)}\n{e}".Log();
+ $"Failed to write to {nameof(RelaysDevice)}\n{e}".LogInfo();
}
}
}
diff --git a/csharp/App/SaliMax/src/SystemConfig/Config.cs b/csharp/App/SaliMax/src/SystemConfig/Config.cs
index 87febfdbd..ea5a82229 100644
--- a/csharp/App/SaliMax/src/SystemConfig/Config.cs
+++ b/csharp/App/SaliMax/src/SystemConfig/Config.cs
@@ -31,11 +31,11 @@ public class Config //TODO: let IE choose from config files (Json) and connect t
LastEoc = UnixTime.Epoch,
PConstant = .5,
GridSetPoint = 0,
- BatterySelfDischargePower = 200, // TODO: multiple batteries
+ BatterySelfDischargePower = 200, // TODO: multiple batteries // no need as we multiplied by the number of the batteries
HoldSocZone = 1, // TODO: find better name,
- MinDcBusVoltage = 730,
+ MinDcBusVoltage = 690,
ReferenceDcBusVoltage = 750,
- MaxDcBusVoltage = 770,
+ MaxDcBusVoltage = 810,
};
@@ -50,7 +50,7 @@ public class Config //TODO: let IE choose from config files (Json) and connect t
}
catch (Exception e)
{
- $"Failed to write config file {configFilePath}\n{e}".Log();
+ $"Failed to write config file {configFilePath}\n{e}".LogInfo();
throw;
}
}
@@ -66,7 +66,7 @@ public class Config //TODO: let IE choose from config files (Json) and connect t
}
catch (Exception e)
{
- $"Failed to read config file {configFilePath}, using default config\n{e}".Log();
+ $"Failed to read config file {configFilePath}, using default config\n{e}".LogInfo();
return Default;
}
}
diff --git a/csharp/App/SaliMax/tunnelstoSalimax0001.sh b/csharp/App/SaliMax/tunnelstoSalimax0001.sh
index 4dd7a96af..f538423bb 100755
--- a/csharp/App/SaliMax/tunnelstoSalimax0001.sh
+++ b/csharp/App/SaliMax/tunnelstoSalimax0001.sh
@@ -1,4 +1,4 @@
-j#!/bin/bash
+#!/bin/bash
host=ie-entwicklung@10.2.3.104
diff --git a/csharp/InnovEnergy.props b/csharp/InnovEnergy.props
index cc50081b0..106c6030a 100644
--- a/csharp/InnovEnergy.props
+++ b/csharp/InnovEnergy.props
@@ -6,15 +6,15 @@
preview
true
enable
- net7.0
+ net6.0
true
false
- 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/Devices/AMPT/Ampt.csproj b/csharp/Lib/Devices/AMPT/Ampt.csproj
index f2b0a1896..7fd4f243a 100644
--- a/csharp/Lib/Devices/AMPT/Ampt.csproj
+++ b/csharp/Lib/Devices/AMPT/Ampt.csproj
@@ -1,8 +1,6 @@
-
+
-
-
diff --git a/csharp/Lib/Devices/Adam6060/Adam6060.csproj b/csharp/Lib/Devices/Adam6060/Adam6060.csproj
index 9c65e0cb7..beff437be 100644
--- a/csharp/Lib/Devices/Adam6060/Adam6060.csproj
+++ b/csharp/Lib/Devices/Adam6060/Adam6060.csproj
@@ -1,8 +1,5 @@
-
- Debug;Release;Release-Server
- AnyCPU;linux-arm
-
+
diff --git a/csharp/Lib/Devices/Adam6360D/Adam6360D.csproj b/csharp/Lib/Devices/Adam6360D/Adam6360D.csproj
index 0b06d7c44..85ed73706 100644
--- a/csharp/Lib/Devices/Adam6360D/Adam6360D.csproj
+++ b/csharp/Lib/Devices/Adam6360D/Adam6360D.csproj
@@ -1,8 +1,6 @@
-
+
-
-
diff --git a/csharp/Lib/Devices/Battery48TL/Battery48TL.csproj b/csharp/Lib/Devices/Battery48TL/Battery48TL.csproj
index 6df76f3b3..6fdebbf4f 100644
--- a/csharp/Lib/Devices/Battery48TL/Battery48TL.csproj
+++ b/csharp/Lib/Devices/Battery48TL/Battery48TL.csproj
@@ -1,7 +1,7 @@
-
-
+
+
diff --git a/csharp/Lib/Devices/Battery48TL/Battery48TlRecord.Api.cs b/csharp/Lib/Devices/Battery48TL/Battery48TlRecord.Api.cs
index 40d925310..9f99e104c 100644
--- a/csharp/Lib/Devices/Battery48TL/Battery48TlRecord.Api.cs
+++ b/csharp/Lib/Devices/Battery48TL/Battery48TlRecord.Api.cs
@@ -23,6 +23,10 @@ public partial class Battery48TlRecord
public Strings Alarms => ParseAlarms() .OrderBy(w => w).ToList();
public Percent Soc => _Soc;
+
+ public Current BusCurrent => _BusCurrent;
+
+ public Current HeatingCurrent => _BusCurrent - _CellsCurrent;
public readonly struct Leds_
{
@@ -65,9 +69,9 @@ public partial class Battery48TlRecord
public readonly struct Dc_
{
- public Voltage Voltage => Self._DcVoltage;
- public Current Current => Self._DcCurrent;
- public ActivePower Power => Self._DcVoltage * Self._DcCurrent;
+ public Voltage Voltage => Self._CellsVoltage;
+ public Current Current => Self._CellsCurrent;
+ public ActivePower Power => Self._CellsVoltage * Self._CellsCurrent;
internal Dc_(Battery48TlRecord self) => Self = self;
private Battery48TlRecord Self { get; }
diff --git a/csharp/Lib/Devices/Battery48TL/Battery48TlRecord.Modbus.cs b/csharp/Lib/Devices/Battery48TL/Battery48TlRecord.Modbus.cs
index f595e95f8..e2bf89a13 100644
--- a/csharp/Lib/Devices/Battery48TL/Battery48TlRecord.Modbus.cs
+++ b/csharp/Lib/Devices/Battery48TL/Battery48TlRecord.Modbus.cs
@@ -1,7 +1,6 @@
using System.Diagnostics.CodeAnalysis;
using InnovEnergy.Lib.Devices.Battery48TL.DataTypes;
using InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes;
-using InnovEnergy.Lib.SrcGen.Attributes;
namespace InnovEnergy.Lib.Devices.Battery48TL;
#pragma warning disable CS0169, CS0649
@@ -18,8 +17,10 @@ public partial class Battery48TlRecord
[InputRegister(1009)] private UInt64 _AlarmFlags;
[InputRegister(1013)] private UInt16 _IoStates;
- [InputRegister(999, Scale = 0.01)] private Double _DcVoltage;
- [InputRegister(1000, Scale = 0.01, Offset = -10000)] private Double _DcCurrent;
+ [InputRegister(999, Scale = 0.01)] private Double _CellsVoltage;
+ [InputRegister(1001, Scale = 0.01)] private Double _BusVoltage;
+ [InputRegister(1000, Scale = 0.01, Offset = -10000)] private Double _CellsCurrent;
+ [InputRegister(1062, Scale = 0.01, Offset = -10000)] private Double _BusCurrent;
[InputRegister(1053, Scale = 0.1)] private Double _Soc;
diff --git a/csharp/Lib/Devices/EmuMeter/EmuMeter.csproj b/csharp/Lib/Devices/EmuMeter/EmuMeter.csproj
index 379b280a0..ee425fb8d 100644
--- a/csharp/Lib/Devices/EmuMeter/EmuMeter.csproj
+++ b/csharp/Lib/Devices/EmuMeter/EmuMeter.csproj
@@ -1,8 +1,6 @@
-
-
-
-
+
+
diff --git a/csharp/Lib/Units/Units.csproj b/csharp/Lib/Units/Units.csproj
index 13a09114c..f46fa951b 100644
--- a/csharp/Lib/Units/Units.csproj
+++ b/csharp/Lib/Units/Units.csproj
@@ -1,14 +1,10 @@
-
- Debug;Release;Release-Server
- AnyCPU;linux-arm
-
+
-
diff --git a/csharp/Lib/Utils/HackToBuildNet6FromNet7.cs b/csharp/Lib/Utils/HackToBuildNet6FromNet7.cs
new file mode 100644
index 000000000..9242d0f3c
--- /dev/null
+++ b/csharp/Lib/Utils/HackToBuildNet6FromNet7.cs
@@ -0,0 +1,15 @@
+// TODO remove for .Net 7
+namespace System.Runtime.CompilerServices
+{
+ public class RequiredMemberAttribute : Attribute { }
+ public class CompilerFeatureRequiredAttribute : Attribute
+ {
+ public CompilerFeatureRequiredAttribute(string name) { }
+ }
+
+}
+
+namespace System.Diagnostics.CodeAnalysis
+{
+ public class SetsRequiredMembersAttribute : Attribute { }
+}
diff --git a/csharp/Lib/Utils/TextBlock.cs b/csharp/Lib/Utils/TextBlock.cs
index dc7fcb924..f7720d224 100644
--- a/csharp/Lib/Utils/TextBlock.cs
+++ b/csharp/Lib/Utils/TextBlock.cs
@@ -112,7 +112,7 @@ public class TextBlock
return new TextBlock(alignedLines);
}
- public static TextBlock CenterHorizontal(params Object[] things)
+ public static TextBlock CenterHorizontal(IReadOnlyList