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