diff --git a/csharp/App/VrmGrabber/Controller.cs b/csharp/App/VrmGrabber/Controller.cs
index 5465152d7..fc7829ea9 100644
--- a/csharp/App/VrmGrabber/Controller.cs
+++ b/csharp/App/VrmGrabber/Controller.cs
@@ -19,7 +19,9 @@ public record InstallationToHtmlInterface(
String Online,
String LastSeen,
Int64 NumBatteries,
- String BatteryVersion
+ String BatteryVersion,
+ String ServerIp = "10.2.0.1", //TODO MAKE ME DYNAMIC
+ String FirmwareVersion = "AF09" //Todo automatically grab newest version?
);
[Controller]
@@ -27,7 +29,7 @@ public class Controller : ControllerBase
{
//Todo automatically grab newest version?
- private const String FirmwareVersion = "VERSION";
+ private const String FirmwareVersion = "AF09";
[HttpGet]
@@ -99,7 +101,7 @@ public class Controller : ControllerBase
{{Serial}} |
{{NumBatteries}} |
{{BatteryVersion}} |
- ⬆️{{firmwareVersion}} |
+ ⬆️{{FirmwareVersion}} |
";
var installationsInDb = Db.Installations.ToList();
@@ -126,8 +128,6 @@ public class Controller : ControllerBase
var data = new
{
inst = installsForHtml,
- serverIp = "10.2.0.1", //TODO MAKE ME DYNAMIC
- firmwareVersion = FirmwareVersion
};
var result = template(data);
@@ -140,22 +140,25 @@ public class Controller : ControllerBase
}
- [HttpGet(nameof(UpdateBatteryFirmware))]
- public async Task UpdateBatteryFirmware(String installationIp, Int64 numOfBatteries)
+ [HttpGet("updatebatteryfirmware/{installationIp}/{numberOfBatteries}")]
+ public async Task UpdateBatteryFirmware(String installationIp, String numberOfBatteries)
{
//We need the DeviceName of the battery (ttyUSB?)
var pathToBattery = await Db.ExecuteBufferedAsyncCommandOnIp(installationIp, "dbus-send --system --dest=com.victronenergy.system --type=method_call --print-reply /ServiceMapping/com_victronenergy_battery_1 com.victronenergy.BusItem.GetText");
- if (pathToBattery == "Failed") return new BadRequestResult();
+ if (pathToBattery.Split('"')[1] == "Failed") return "Update failed";
SendNewBatteryFirmware(installationIp);
- for (var batteryId = 0; batteryId < numOfBatteries; batteryId++)
+ for (var batteryId = 2; batteryId <= Int64.Parse(numberOfBatteries) + 1; batteryId++)
{
- var updateCommand = await Db.ExecuteBufferedAsyncCommandOnIp(installationIp, $"/opt/innovenergy/scripts/upload-bms-firmware {pathToBattery} {batteryId} /opt/innovenergy/bms-firmware/{FirmwareVersion}.bin");
- if (updateCommand == "Failed") return new BadRequestResult();
+ var batteryTtyName = pathToBattery.Split('"')[1].Split(".").Last();
+ var localCommand = $"/opt/innovenergy/scripts/upload-bms-firmware {batteryTtyName} {batteryId} /opt/innovenergy/bms-firmware/{FirmwareVersion}.bin";
+
+ var remoteUpdateCommandResult = Db.ExecuteBufferedAsyncCommandOnIp(installationIp, localCommand);
+ // Console.WriteLine(remoteUpdateCommandResult); //Todo replace me with checking if it worked...
}
- return new AcceptedResult();
+ return "Battery update is successfully initiated! You can close this page now.";
}
private static void SendNewBatteryFirmware(String installationIp)
diff --git a/csharp/App/VrmGrabber/Database/Db.cs b/csharp/App/VrmGrabber/Database/Db.cs
index c638ecb3d..9caecb8d2 100644
--- a/csharp/App/VrmGrabber/Database/Db.cs
+++ b/csharp/App/VrmGrabber/Database/Db.cs
@@ -8,6 +8,7 @@ using CliWrap.Buffered;
using InnovEnergy.App.RemoteSupportConsole;
using InnovEnergy.Lib.Utils;
using InnovEnergy.Lib.Victron.VictronVRM;
+using Microsoft.AspNetCore.Mvc.TagHelpers.Cache;
using SQLite;
using static System.Text.Json.JsonSerializer;
using Installation = InnovEnergy.App.VrmGrabber.DataTypes.Installation;
@@ -59,7 +60,7 @@ public static partial class Db
do {
await UpdateInstallationsAndDetailsFromVrm(0);
}
- while (true) ;
+ while (false) ; //Todo change to true before
}
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")]
@@ -72,7 +73,7 @@ public static partial class Db
var installations = await user.GetInstallations();
// var returnDictionary = new Dictionary();
- foreach (var installation in installations) //TODO REMOVE TAKE
+ foreach (var installation in installations.Skip(404).Take(3)) //TODO REMOVE TAKE
{
Console.WriteLine(installation.Name);
var details = await GetInstallationDetails(installation);
@@ -109,11 +110,12 @@ public static partial class Db
if (ip is null or "Unknown" || online == "❌") return "Unknown";
var pathToBattery = await ExecuteBufferedAsyncCommandOnIp(ip, "dbus-send --system --dest=com.victronenergy.system --type=method_call --print-reply /ServiceMapping/com_victronenergy_battery_1 com.victronenergy.BusItem.GetText");
- if (pathToBattery.StartsWith("Error")) return "Unknown";
+ if (pathToBattery.Split('"')[1].StartsWith("Error")) return "Unknown";
- var command = $"dbus-send --system --dest={pathToBattery} --type=method_call --print-reply /FirmwareVersion com.victronenergy.BusItem.GetText";
- return await ExecuteBufferedAsyncCommandOnIp(ip, command);
+ var command = $"dbus-send --system --dest={pathToBattery.Split('"')[1]} --type=method_call --print-reply /FirmwareVersion com.victronenergy.BusItem.GetText";
+ var returnString = await ExecuteBufferedAsyncCommandOnIp(ip, command);
+ return returnString.Split('"')[1];
}
private static async Task NumberOfBatteries(String? ip, String? online)
@@ -121,11 +123,11 @@ public static partial class Db
if (ip is null or "Unknown" || online == "❌") return 0;
var pathToBattery = await ExecuteBufferedAsyncCommandOnIp(ip, "dbus-send --system --dest=com.victronenergy.system --type=method_call --print-reply /ServiceMapping/com_victronenergy_battery_1 com.victronenergy.BusItem.GetText");
- if (pathToBattery.StartsWith("Error")) return 0;
+ if (pathToBattery.Split('"')[1].StartsWith("Error")) return 0;
- var cmd = await ExecuteBufferedAsyncCommandOnIp(ip,$"dbus-send --system --dest={pathToBattery} --type=method_call --print-reply /NbOfBatteries com.victronenergy.BusItem.GetText" );
+ var cmd = await ExecuteBufferedAsyncCommandOnIp(ip,$"dbus-send --system --dest={pathToBattery.Split('"')[1]} --type=method_call --print-reply /NbOfBatteries com.victronenergy.BusItem.GetText" );
- return cmd == "Failed" ? 0 : Int64.Parse(cmd); //No Batteries can be found
+ return cmd.Split('"')[1] == "Failed" ? 0 : Int64.Parse(cmd.Split('"')[1]); //No Batteries can be found
}
@@ -138,7 +140,7 @@ public static partial class Db
.AppendArgument("-o StrictHostKeyChecking=accept-new")
.AppendArgument(command)
.WithValidation(CommandResultValidation.None).ExecuteBufferedAsync();
- return cmd.ExitCode == 0 ? cmd.StandardOutput.Split('"')[1] : cmd.StandardError;
+ return cmd.ExitCode == 0 ? cmd.StandardOutput : cmd.StandardError;
}
private static String?[] Ip(InstallationDetails details)
diff --git a/csharp/App/VrmGrabber/Program.cs b/csharp/App/VrmGrabber/Program.cs
index 6c711041f..60a685763 100644
--- a/csharp/App/VrmGrabber/Program.cs
+++ b/csharp/App/VrmGrabber/Program.cs
@@ -13,7 +13,6 @@ public static class Program
builder.Services.AddControllers();
builder.Services.AddSwaggerGen(c =>
{
- c.SwaggerDoc("v1", OpenApiInfo);
c.UseAllOfToExtendReferenceSchemas();
c.SupportNonNullableReferenceTypes();
});
diff --git a/csharp/App/VrmGrabber/db.sqlite b/csharp/App/VrmGrabber/db.sqlite
index 0b57a99aa..78ada0c56 100644
Binary files a/csharp/App/VrmGrabber/db.sqlite and b/csharp/App/VrmGrabber/db.sqlite differ
diff --git a/firmware/opt/innovenergy/scripts/upload-bms-firmware b/firmware/opt/innovenergy/scripts/upload-bms-firmware
index 70975deea..e341d7f64 100755
--- a/firmware/opt/innovenergy/scripts/upload-bms-firmware
+++ b/firmware/opt/innovenergy/scripts/upload-bms-firmware
@@ -84,6 +84,7 @@ def init_modbus(tty):
def failed(response):
# type: (ModbusResponse) -> bool
+ # Todo 'ModbusIOException' object has no attribute 'function_code'
return response.function_code > 0x80