Fixed bug in status update in Backend, update controller to support remote configuration for SodistoreHome installations

This commit is contained in:
Noe 2025-09-25 15:07:28 +02:00
parent 4420f7373b
commit 3795287124
6 changed files with 26 additions and 27 deletions

View File

@ -8,10 +8,21 @@ public class Configuration
public DateTime CalibrationChargeDate { get; set; } public DateTime CalibrationChargeDate { get; set; }
public CalibrationChargeType CalibrationDischargeState { get; set; } public CalibrationChargeType CalibrationDischargeState { get; set; }
public DateTime CalibrationDischargeDate { get; set; } public DateTime CalibrationDischargeDate { get; set; }
//For sodistoreHome installations
public Double MaximumDischargingCurrent { get; set; }
public Double MaximumChargingCurrent { get; set; }
public Double OperatingPriority { get; set; }
public Double BatteriesCount { get; set; }
public String GetConfigurationString() public String GetConfigurationString()
{ {
return $"MinimumSoC: {MinimumSoC}, GridSetPoint: {GridSetPoint}, CalibrationChargeState: {CalibrationChargeState}, CalibrationChargeDate: {CalibrationChargeDate}, " + return $"MinimumSoC: {MinimumSoC}, GridSetPoint: {GridSetPoint}, CalibrationChargeState: {CalibrationChargeState}, CalibrationChargeDate: {CalibrationChargeDate}, " +
$"CalibrationDischargeState: {CalibrationDischargeState}, CalibrationDischargeDate: {CalibrationDischargeDate}"; $"CalibrationDischargeState: {CalibrationDischargeState}, CalibrationDischargeDate: {CalibrationDischargeDate}" +
$"MaximumDischargingCurrent: {MaximumDischargingCurrent}, MaximumChargingCurrent: {MaximumChargingCurrent}, OperatingPriority: {OperatingPriority}" +
$"BatteriesCount: {BatteriesCount}";
} }
} }

View File

@ -381,25 +381,6 @@ public static class ExoCmd
public static async Task<Boolean> SendConfig(this Installation installation, Configuration config) public static async Task<Boolean> SendConfig(this Installation installation, Configuration config)
{ {
// This looks hacky but here we grab the vpn-Ip of the installation by its installation Name (e.g. Salimax0001)
// From the vpn server (here salidomo, but we use the vpn home ip for future-proofing)
// using var client = new HttpClient();
// var webRequest = client.GetAsync("10.2.0.1/vpnstatus.txt");
// var text = webRequest.ToString();
// var lines = text!.Split(new [] { Environment.NewLine }, StringSplitOptions.None);
// var vpnIp = lines.First(l => l.Contains(installation.InstallationName)).Split(",")[1];
//
// // Writing the config to a file and then sending that file with rsync sounds inefficient
// // We should find a better solution...
// // TODO The VPN server should do this not the backend!!!
// await File.WriteAllTextAsync("./config.json", config);
// var result = await Cli.Wrap("rsync")
// .WithArguments("./config.json")
// .AppendArgument($@"root@{vpnIp}:/salimax")
// .ExecuteAsync();
// return result.ExitCode == 200;
var maxRetransmissions = 4; var maxRetransmissions = 4;
UdpClient udpClient = new UdpClient(); UdpClient udpClient = new UdpClient();
udpClient.Client.ReceiveTimeout = 2000; udpClient.Client.ReceiveTimeout = 2000;
@ -415,8 +396,8 @@ public static class ExoCmd
Console.WriteLine(config.GetConfigurationString()); Console.WriteLine(config.GetConfigurationString());
//Console.WriteLine($"Sent UDP message to {installation.VpnIp}:{port}: {config}"); Console.WriteLine($"Sent UDP message to {installation.VpnIp}:{port}: {config}");
Console.WriteLine($"Sent UDP message to {installation.VpnIp}:{port}"+" GridSetPoint is "+config.GridSetPoint +" and MinimumSoC is "+config.MinimumSoC); //Console.WriteLine($"Sent UDP message to {installation.VpnIp}:{port}"+" GridSetPoint is "+config.GridSetPoint +" and MinimumSoC is "+config.MinimumSoC);
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(installation.VpnIp), port); IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(installation.VpnIp), port);

View File

@ -89,7 +89,7 @@ public static class Program
private static OpenApiInfo OpenApiInfo { get; } = new OpenApiInfo private static OpenApiInfo OpenApiInfo { get; } = new OpenApiInfo
{ {
Title = "Innesco Backend API", Title = "Inesco Backend API",
Version = "v1" Version = "v1"
}; };

View File

@ -148,6 +148,8 @@ public static class RabbitMqManager
Int32 prevStatus; Int32 prevStatus;
//This installation id does not exist in our in-memory data structure, add it. //This installation id does not exist in our in-memory data structure, add it.
if (!WebsocketManager.InstallationConnections.ContainsKey(installationId)) if (!WebsocketManager.InstallationConnections.ContainsKey(installationId))
{ {
@ -167,6 +169,11 @@ public static class RabbitMqManager
WebsocketManager.InstallationConnections[installationId].Timestamp = DateTime.Now; WebsocketManager.InstallationConnections[installationId].Timestamp = DateTime.Now;
} }
if (installationId == 795)
{
Console.WriteLine("RECEIVED A HEARTBIT FROM prototype, time is "+ WebsocketManager.InstallationConnections[installationId].Timestamp);
}
installation.Status = receivedStatusMessage.Status; installation.Status = receivedStatusMessage.Status;
installation.Apply(Db.Update); installation.Apply(Db.Update);

View File

@ -22,12 +22,12 @@ public static class WebsocketManager
Console.WriteLine("Monitoring installation table..."); Console.WriteLine("Monitoring installation table...");
foreach (var installationConnection in InstallationConnections) foreach (var installationConnection in InstallationConnections)
{ {
Console.WriteLine("installationConnection ID is " + installationConnection.Key + "latest timestamp is" +installationConnection.Value.Timestamp + "product is "+ installationConnection.Value.Product Console.WriteLine("installationConnection ID is " + installationConnection.Key + ", latest timestamp is" +installationConnection.Value.Timestamp + ", product is "+ installationConnection.Value.Product
+ "and time diff is "+ (DateTime.Now - installationConnection.Value.Timestamp)); + ", and time diff is "+ (DateTime.Now - installationConnection.Value.Timestamp));
if ((installationConnection.Value.Product == (int)ProductType.Salimax && (DateTime.Now - installationConnection.Value.Timestamp) > TimeSpan.FromMinutes(2)) || if ((installationConnection.Value.Product == (int)ProductType.Salimax && (DateTime.Now - installationConnection.Value.Timestamp) > TimeSpan.FromMinutes(2)) ||
(installationConnection.Value.Product == (int)ProductType.Salidomo && (DateTime.Now - installationConnection.Value.Timestamp) > TimeSpan.FromMinutes(60)) || (installationConnection.Value.Product == (int)ProductType.Salidomo && (DateTime.Now - installationConnection.Value.Timestamp) > TimeSpan.FromMinutes(60)) ||
(installationConnection.Value.Product == (int)ProductType.SodioHome && (DateTime.Now - installationConnection.Value.Timestamp) > TimeSpan.FromMinutes(2)) || (installationConnection.Value.Product == (int)ProductType.SodioHome && (DateTime.Now - installationConnection.Value.Timestamp) > TimeSpan.FromMinutes(4)) ||
(installationConnection.Value.Product == (int)ProductType.SodiStoreMax && (DateTime.Now - installationConnection.Value.Timestamp) > TimeSpan.FromMinutes(2)) (installationConnection.Value.Product == (int)ProductType.SodiStoreMax && (DateTime.Now - installationConnection.Value.Timestamp) > TimeSpan.FromMinutes(2))
) )
{ {