From 231069768ee6b88843056c9e4c9148fd5669fcda Mon Sep 17 00:00:00 2001 From: atef Date: Wed, 12 Nov 2025 15:59:12 +0100 Subject: [PATCH] Naming Sinexcel inverter to recordinverter --- csharp/App/SinexcelCommunication/Program.cs | 127 +++++++++++--------- 1 file changed, 72 insertions(+), 55 deletions(-) diff --git a/csharp/App/SinexcelCommunication/Program.cs b/csharp/App/SinexcelCommunication/Program.cs index 483b6a95b..3bfb7cca0 100644 --- a/csharp/App/SinexcelCommunication/Program.cs +++ b/csharp/App/SinexcelCommunication/Program.cs @@ -31,7 +31,7 @@ namespace InnovEnergy.App.SinexcelCommunication; [SuppressMessage("Trimming", "IL2026:Members annotated with \'RequiresUnreferencedCodeAttribute\' require dynamic access otherwise can break functionality when trimming application code")] internal static class Program { - private static readonly TimeSpan UpdateInterval = TimeSpan.FromSeconds(4); + private static readonly TimeSpan UpdateInterval = TimeSpan.FromSeconds(5); private const UInt16 NbrOfFileToConcatenate = 15; // add this to config file private static UInt16 _fileCounter = 0; private static Channel _sinexcelChannel; @@ -54,7 +54,7 @@ internal static class Program public static async Task Main(String[] args) { _sinexcelChannel = new SerialPortChannel(Port, BaudRate, Parity, DataBits, StopBits); - + InitializeCommunicationToMiddleware(); while (true) { try @@ -85,7 +85,7 @@ internal static class Program return new StatusRecord { - SinexcelRecord = sinexcelRecord, + InverterRecord = sinexcelRecord, Config = config // load from disk every iteration, so config can be changed while running }; } @@ -111,61 +111,22 @@ internal static class Program var startTime = DateTime.Now; Console.WriteLine("***************************** Reading Battery Data *********************************************"); - Console.WriteLine(startTime.ToString("HH:mm:ss.fff")); + Console.WriteLine(startTime.ToString("HH:mm:ss.fff ")+ "Start Reading"); // the order matter of the next three lines var statusrecord = ReadStatus(); if (statusrecord == null) return null; - - statusrecord.SinexcelRecord.GridAPhaseVoltage.WriteLine(" = Grid A PhaseVoltage"); - statusrecord.SinexcelRecord.GridBPhaseVoltage.WriteLine(" = Grid B PhaseVoltage"); - statusrecord.SinexcelRecord.GridCPhaseVoltage.WriteLine(" = Grid C PhaseVoltage"); + SendSalimaxStateAlarm(GetSodiHomeStateAlarm(statusrecord),statusrecord); - statusrecord.SinexcelRecord.GridAPhaseCurrent.WriteLine(" = Grid A PhaseCurrent"); - statusrecord.SinexcelRecord.GridBPhaseCurrent.WriteLine(" = Grid B PhaseCurrent"); - statusrecord.SinexcelRecord.GridCPhaseCurrent.WriteLine(" = Grid C PhaseCurrent"); - - - statusrecord.SinexcelRecord.GridAPhaseActivePower.WriteLine(" = A Grid Active Power"); - statusrecord.SinexcelRecord.GridBPhaseActivePower.WriteLine(" = B Grid Active Power"); - statusrecord.SinexcelRecord.GridCPhaseActivePower.WriteLine(" = C Grid Active Power"); - - statusrecord.SinexcelRecord.GridVoltageFrequency.WriteLine(" = Frequency"); - - statusrecord.SinexcelRecord.ElectricMeterCPhaseActivePower.WriteLine(" Meter Phase C Power"); - statusrecord.SinexcelRecord.ElectricMeterBPhaseActivePower.WriteLine(" Meter Phase B Power"); - statusrecord.SinexcelRecord.ElectricMeterAPhaseActivePower.WriteLine(" Meter Phase A Power"); - - statusrecord.SinexcelRecord.ElectricMeterAPhaseCurrent.WriteLine(" Meter Phase C Current "); - statusrecord.SinexcelRecord.ElectricMeterBPhaseCurrent.WriteLine(" Meter Phase B Current "); - statusrecord.SinexcelRecord.ElectricMeterBPhaseCurrent.WriteLine(" Meter Phase A Current "); - statusrecord.SinexcelRecord.WorkingMode.WriteLine(" workingmode"); - - statusrecord.SinexcelRecord.BatteryVoltage.WriteLine(" BatteryVoltage"); - statusrecord.SinexcelRecord.BatteryVoltage1.WriteLine(" BatteryVoltage1"); - statusrecord.SinexcelRecord.BatteryVoltage2.WriteLine(" BatteryVoltage2"); - - statusrecord.SinexcelRecord.BatteryPower1.WriteLine(" BatteryPower1"); - statusrecord.SinexcelRecord.BatteryPower2.WriteLine(" BatteryPower2"); - statusrecord.SinexcelRecord.TotalBatteryPower.WriteLine(" TotalBatteryPower"); - - statusrecord.SinexcelRecord.EnableBattery1.WriteLine(" EnableBattery1"); - statusrecord.SinexcelRecord.EnableBattery2.WriteLine(" EnableBattery2"); - - statusrecord.SinexcelRecord.MaxChargingCurrentBattery1.WriteLine(" MaxChargingCurrentBattery1"); - statusrecord.SinexcelRecord.MaxChargingCurrentBattery2.WriteLine(" MaxChargingCurrentBattery2"); - - statusrecord.SinexcelRecord.MaxDischargingCurrentBattery1.WriteLine(" MaxChargingCurrentBattery1"); - statusrecord.SinexcelRecord.MaxDischargingCurrentBattery2.WriteLine(" MaxChargingCurrentBattery2"); - - //EssModeControl(statusrecord); - // statusrecord.ApplyDefaultSettings(); Console.WriteLine( " ************************************ We are writing ************************************"); + var startWritingTime = DateTime.Now; + Console.WriteLine(startWritingTime.ToString("HH:mm:ss.fff ") +"start Writing"); statusrecord?.Config.Save(); // save the config file - //sinexcelDevice.Write(statusrecord?.SinexcelRecord); + //if (statusrecord?.InverterRecord != null) sinexcelDevice.Write(statusrecord.InverterRecord); + var stopTime = DateTime.Now; - Console.WriteLine(stopTime.ToString("HH:mm:ss.fff")); + Console.WriteLine(stopTime.ToString("HH:mm:ss.fff ")+ "run iteration time finish"); return statusrecord; } catch (Exception e) @@ -178,6 +139,61 @@ internal static class Program } } + private static StatusMessage GetSodiHomeStateAlarm(StatusRecord? record) + { + var s3Bucket = Config.Load().S3?.Bucket; + + var alarmList = new List(); + var warningList = new List(); +/* + if (record.SinexcelRecord.WorkingMode == GrowattSystemStatus.Fault) + { + if (record.AcDcGrowatt.FaultMainCode != 0) + { + alarmList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Growatt Inverter", + Description = record.AcDcGrowatt.WarningMainCode.ToString(), // to add the sub code + }); + } + + if (record.AcDcGrowatt.WarningMainCode != 0) + { + warningList.Add(new AlarmOrWarning + { + Date = DateTime.Now.ToString("yyyy-MM-dd"), + Time = DateTime.Now.ToString("HH:mm:ss"), + CreatedBy = "Growatt inverter", + Description = record.AcDcGrowatt.FaultMainCode.ToString(), //to add the sub code + }); + } + }*/ + + _sodiohomeAlarmState = warningList.Any() + ? SodistoreAlarmState.Orange + : SodistoreAlarmState.Green; // this will be replaced by LedState + + _sodiohomeAlarmState = alarmList.Any() + ? SodistoreAlarmState.Red + : _sodiohomeAlarmState; // this will be replaced by LedState + + var installationId = GetInstallationId(s3Bucket ?? string.Empty); + + var returnedStatus = new StatusMessage + { + InstallationId = installationId, + Product = 2, + Status = _sodiohomeAlarmState, + Type = MessageType.AlarmOrWarning, + Alarms = alarmList, + Warnings = warningList + }; + + return returnedStatus; + } + private static Int32 GetInstallationId(String s3Bucket) { var part = s3Bucket.Split('-').FirstOrDefault(); @@ -220,11 +236,10 @@ internal static class Program if (status == null) return; status.Config.MinSoc = config.MinimumSoC; - status.Config.GridSetPoint = config.GridSetPoint * 1000; // converted from kW to W - //status.Config.MaximumChargingCurrent = config.MaximumChargingCurrent; - //status.Config.MaximumDischargingCurrent = config.MaximumDischargingCurrent; - //status.Config.OperatingPriority = config.OperatingPriority; - //status.Config.BatteriesCount = config.BatteriesCount; + status.Config.MaximumChargingCurrent = config.MaximumChargingCurrent; + status.Config.MaximumDischargingCurrent = config.MaximumDischargingCurrent; + status.Config.OperatingPriority = config.OperatingPriority; + status.Config.BatteriesCount = config.BatteriesCount; } private static async Task SaveModbusTcpFile(StatusRecord status) @@ -233,7 +248,7 @@ internal static class Program // SYSTEM DATA var result1 = ConvertToModbusRegisters((status.Config.MinSoc * 10), "UInt16", 30001); // this to be updated to modbusTCP version - var result2 = ConvertToModbusRegisters(status.SinexcelRecord.GridAPhaseVoltage, "UInt32", 30002); + var result2 = ConvertToModbusRegisters(status.InverterRecord.GridAPhaseVoltage, "UInt32", 30002); // Merge all results into one dictionary var allResults = new[] @@ -254,6 +269,8 @@ internal static class Program //Console.WriteLine("JSON file written successfully."); //Console.WriteLine(json); + var stopTime = DateTime.Now; + Console.WriteLine(stopTime.ToString("HH:mm:ss.fff" )+ " Finish the loop"); return true; }