diff --git a/src/Server/Endpoints/GetStatus/Endpoint.cs b/src/Server/Endpoints/GetStatus/Endpoint.cs index 7ded584..47cfdfa 100644 --- a/src/Server/Endpoints/GetStatus/Endpoint.cs +++ b/src/Server/Endpoints/GetStatus/Endpoint.cs @@ -31,6 +31,7 @@ public class Endpoint : EndpointWithoutRequest { while (!c.IsCancellationRequested && !AppLife.ApplicationStopping.IsCancellationRequested) { + /* if (Env.IsDevelopment()) { var status = new InverterStatus @@ -51,6 +52,7 @@ public class Endpoint : EndpointWithoutRequest yield return status; } else + */ yield return Inverter.Status; await Task.Delay(2000, c); diff --git a/src/Server/InverterMon.Server.csproj b/src/Server/InverterMon.Server.csproj index 3fac994..ef97060 100644 --- a/src/Server/InverterMon.Server.csproj +++ b/src/Server/InverterMon.Server.csproj @@ -27,8 +27,13 @@ true + + + + + @@ -42,6 +47,11 @@ + + PreserveNewest + + + \ No newline at end of file diff --git a/src/Server/InverterService/FelicityInverter.cs b/src/Server/InverterService/FelicityInverter.cs index b755fae..a6c1ead 100644 --- a/src/Server/InverterService/FelicityInverter.cs +++ b/src/Server/InverterService/FelicityInverter.cs @@ -2,10 +2,13 @@ using System.Diagnostics.CodeAnalysis; using System.IO.Ports; using InverterMon.Shared.Models; +using System.Diagnostics; +using Microsoft.Extensions.Logging; + namespace InverterMon.Server.InverterService; -sealed class SettingsData +sealed class SettingsData { public double BatteryCutOffVoltage { get; init; } public double BatteryCvChargingVoltage { get; init; } @@ -22,6 +25,11 @@ sealed class SettingsData SuppressMessage("ReSharper", "MemberCanBeMadeStatic.Global")] public sealed class FelicitySolarInverter { + private readonly ILogger _logger; + public FelicitySolarInverter(ILogger logger) + { + _logger = logger; + } public InverterStatus Status { get; } = new(); const byte SlaveAddress = 0x01; @@ -159,6 +167,9 @@ public sealed class FelicitySolarInverter // [Slave Address][Function Code 0x03][Start Address Hi][Start Address Lo][Quantity Hi][Quantity Lo][CRC Lo][CRC Hi] byte[] frame; + using ILoggerFactory factory = LoggerFactory.Create(builder => builder.AddConsole()); + ILogger logger = factory.CreateLogger("Felicity"); + logger.LogInformation("ReadRegisters Logging"); var statusRequest = startAddress == StatusStartAddress && numberOfPoints == StatusRegisterCount; @@ -181,6 +192,16 @@ public sealed class FelicitySolarInverter _cachedStatusFrame = frame; } + // debug + string str = ""; + for (int i = 0; i < 8; i++) + { + str += frame[i].ToString("X") + " "; + } + Debug.WriteLine("Request frame: " + str); + logger.LogInformation("Request frame: {str}", str); + // end of debug + var response = SendModbusRequest(frame); if (response.Length == 0) @@ -192,6 +213,16 @@ public sealed class FelicitySolarInverter int byteCount = response[2]; var expectedDataBytes = numberOfPoints * 2; + // debug + str = ""; + for (int i = 0; i < response.Length; i++) + { + str += response[i].ToString("X") + " "; + } + Debug.WriteLine("Response frame: " + str); + logger.LogInformation("Response frame: {str}", str); + // end of debug + if (byteCount != expectedDataBytes) throw new InvalidDataException("Unexpected byte count in response!"); @@ -199,6 +230,16 @@ public sealed class FelicitySolarInverter for (var i = 0; i < numberOfPoints; i++) registers[i] = (short)((response[3 + i * 2] << 8) | response[3 + i * 2 + 1]); + // debug + str = ""; + for (int i = 0; i < numberOfPoints; i++) + { + str += registers[i].ToString("X") + " "; + } + Debug.WriteLine("Registers: " + str); + logger.LogInformation("Registers: {str}", str); + // end of debug + return registers; } diff --git a/src/Server/Program.cs b/src/Server/Program.cs index 50a79d5..bc994b2 100644 --- a/src/Server/Program.cs +++ b/src/Server/Program.cs @@ -6,6 +6,7 @@ using InverterMon.Server.BatteryService; using InverterMon.Server.InverterService; using InverterMon.Server.Persistence; using InverterMon.Server.Persistence.Settings; +using NLog.Extensions.Logging; //avoid parsing issues with non-english cultures var cultureInfo = new CultureInfo("en-US"); @@ -14,16 +15,23 @@ CultureInfo.DefaultThreadCurrentUICulture = cultureInfo; var bld = WebApplication.CreateBuilder(); -_ = int.TryParse(bld.Configuration["LaunchSettings:WebPort"] ?? "80", out var port); +_ = int.TryParse(bld.Configuration["LaunchSettings:WebPort"] ?? "9000", out var port); bld.WebHost.ConfigureKestrel(o => o.Listen(IPAddress.Any, port)); bld.Services .AddSingleton() .AddSingleton() .AddSingleton() - .AddSingleton(); + .AddSingleton() + .AddLogging(config => + { + config.ClearProviders(); // Optional: Remove default providers + config.AddConsole(); + config.AddDebug(); + config.AddNLog(); + }); -if (!bld.Environment.IsDevelopment()) +//if (!bld.Environment.IsDevelopment()) { bld.Services .AddHostedService(); @@ -46,4 +54,5 @@ app.UseRouting() c.Endpoints.RoutePrefix = "api"; c.Binding.ReflectionCache.AddFromInverterMonServer(); }); + app.Run(); \ No newline at end of file diff --git a/src/Server/appsettings.json b/src/Server/appsettings.json index d035681..473dd73 100644 --- a/src/Server/appsettings.json +++ b/src/Server/appsettings.json @@ -6,7 +6,14 @@ }, "Logging": { "LogLevel": { - "Default": "Information" + "Default": "Debug", + "Microsoft": "Error" + } + }, + "EventLog": { + "LogLevel": { + "Default": "Warning", + "Microsoft": "Warning" } } } \ No newline at end of file diff --git a/src/Server/nlog.config b/src/Server/nlog.config new file mode 100644 index 0000000..895bb32 --- /dev/null +++ b/src/Server/nlog.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win-x64.zip b/win-x64.zip new file mode 100644 index 0000000..db9f784 Binary files /dev/null and b/win-x64.zip differ