update the reading and the writing to multiple inverter

This commit is contained in:
atef 2025-08-06 16:04:52 +02:00
parent 38f32b8bf7
commit 9691e3aa80
2 changed files with 48 additions and 42 deletions

View File

@ -5,6 +5,6 @@ namespace InnovEnergy.App.GrowattCommunication.ESS;
public record StatusRecord public record StatusRecord
{ {
public required WitGrowattDevicesRecord AcDcGrowatt { get; set; } public required WITGrowatRecord AcDcGrowatt { get; set; }
public required Config Config { get; set; } public required Config Config { get; set; }
} }

View File

@ -77,13 +77,13 @@ public static class Program
Console.WriteLine("Starting Growatt Communication"); Console.WriteLine("Starting Growatt Communication");
var growattDeviceT415K = new WITGrowatDevice(_growattChannel, SlaveId); var growattDeviceT415K = new WITGrowatDevice(_growattChannel, SlaveId);
var growattDevices = new WITGrowattDevices(new List<WITGrowatDevice> { growattDeviceT415K }); // var growattDevices = new WITGrowattDevices(new List<WITGrowatDevice> { growattDeviceT415K });
StatusRecord ReadStatus() StatusRecord ReadStatus()
{ {
var config = Config.Load(); var config = Config.Load();
var growattRecord = growattDevices.Read(); var growattRecord = growattDeviceT415K.Read();
return new StatusRecord return new StatusRecord
{ {
@ -114,7 +114,8 @@ public static class Program
await DataLogging(statusrecord, timestamp); // save a csv file locally await DataLogging(statusrecord, timestamp); // save a csv file locally
await SaveModbusTcpFile(statusrecord); // save the json file for modbuscTCP await SaveModbusTcpFile(statusrecord); // save the json file for modbuscTCP
/* statusrecord.AcDcGrowatt.RemotePowerControl.WriteLine(" = RemotePowerControl");
statusrecord.AcDcGrowatt.EnableCommand.WriteLine(" = EnableCommand"); statusrecord.AcDcGrowatt.EnableCommand.WriteLine(" = EnableCommand");
statusrecord.AcDcGrowatt.ControlPermession.WriteLine(" ControlPermession"); statusrecord.AcDcGrowatt.ControlPermession.WriteLine(" ControlPermession");
statusrecord.AcDcGrowatt.GridMeterPower.WriteLine(" GridMeterPower"); statusrecord.AcDcGrowatt.GridMeterPower.WriteLine(" GridMeterPower");
@ -131,23 +132,28 @@ public static class Program
statusrecord.AcDcGrowatt.BatteryMaxDischargePower.WriteLine(" BatteryMaxDischargePower "); //30409 we set power here statusrecord.AcDcGrowatt.BatteryMaxDischargePower.WriteLine(" BatteryMaxDischargePower "); //30409 we set power here
statusrecord.AcDcGrowatt.SystemOperatingMode.WriteLine(" = SystemOperatingMode"); statusrecord.AcDcGrowatt.SystemOperatingMode.WriteLine(" = SystemOperatingMode");
statusrecord.AcDcGrowatt.BatteryOperatingMode.WriteLine(" BatteryOperatingMode"); statusrecord.AcDcGrowatt.BatteryOperatingMode.WriteLine(" = BatteryOperatingMode");
statusrecord.AcDcGrowatt.OperatingPriority.WriteLine(" OperatingPriority"); // 30408 this the duration statusrecord.AcDcGrowatt.OperatingPriority.WriteLine(" = OperatingPriority"); // 30408 this the duration
statusrecord.AcDcGrowatt.FaultMainCode.WriteLine(" = FaultMainCode"); // 30408 this the duration
statusrecord.AcDcGrowatt.FaultSubCode.WriteLine(" = FaultSubCode"); // 30408 this the duration
statusrecord.AcDcGrowatt.WarningMainCode.WriteLine(" = WarningMainCode"); // 30408 this the duration
statusrecord.AcDcGrowatt.WarningSubCode.WriteLine(" = WarningSubCode"); // 30408 this the duration
var stopTime = DateTime.Now; var stopTime = DateTime.Now;
Console.WriteLine(stopTime.ToString("HH:mm:ss.fff")); Console.WriteLine(stopTime.ToString("HH:mm:ss.fff"));
Console.WriteLine("***************************** Finish Battery Data *********************************************");*/ Console.WriteLine("***************************** Finish Battery Data *********************************************");
statusrecord.AcDcGrowatt.Devices[0].EnableCommand = true; statusrecord.AcDcGrowatt.ChargeCutoffSoc = 100;
statusrecord.AcDcGrowatt.Devices[0].ControlPermession = true; statusrecord.AcDcGrowatt.DischargeCutoffSoc = 20;
EssModeControl(statusrecord,EssMode.LoadPriority);
statusrecord.ApplyDefaultSettings(); statusrecord.ApplyDefaultSettings();
statusrecord.Config.Save(); // save the config file statusrecord.Config.Save(); // save the config file
Console.WriteLine( " ************************************ We are writing ************************************"); Console.WriteLine( " ************************************ We are writing ************************************");
growattDevices.Write(statusrecord.AcDcGrowatt); growattDeviceT415K.Write(statusrecord.AcDcGrowatt);
// Wait for 2 seconds before the next reading // Wait for 2 seconds before the next reading
// await Task.Delay(1000); // Delay in milliseconds (1000ms = 1 seconds) // await Task.Delay(1000); // Delay in milliseconds (1000ms = 1 seconds)
@ -174,30 +180,30 @@ public static class Program
} }
private static String GetSodiHomeStateAlarm(StatusRecord statusrecord, EssMode mode) private static String EssModeControl(StatusRecord statusrecord, EssMode mode)
{ {
switch (mode) switch (mode)
{ {
case EssMode.Off: case EssMode.Off:
return "no mode"; return "no mode";
case EssMode.GridPriority: case EssMode.GridPriority:
statusrecord.AcDcGrowatt.Devices[0].RemotePowerControl = true; statusrecord.AcDcGrowatt.RemotePowerControl = true;
statusrecord.AcDcGrowatt.Devices[0].RemotePowerControlChargeDuration = 0; // 30408 this the duration statusrecord.AcDcGrowatt.RemotePowerControlChargeDuration = 0; // 30408 this the duration
//statusrecord.AcDcGrowatt.ActivePowerPercent = 50; // 30408 this the duration //statusrecord.AcDcGrowatt.ActivePowerPercent = 50; // 30408 this the duration
//statusrecord.AcDcGrowatt.ActivePowerPercentDerating = 50; // 30408 this the duration //statusrecord.AcDcGrowatt.ActivePowerPercentDerating = 50; // 30408 this the duration
statusrecord.AcDcGrowatt.Devices[0].RemoteChargDischargePower = - 100; //30409 we set power here // for grid priority from 0 to -100 statusrecord.AcDcGrowatt.RemoteChargDischargePower = - 100; //30409 we set power here // for grid priority from 0 to -100
statusrecord.AcDcGrowatt.Devices[0].ActualChargeDischargePowerControlValue.WriteLine(" register 30474");; // this to check what was set statusrecord.AcDcGrowatt.ActualChargeDischargePowerControlValue.WriteLine(" register 30474");; // this to check what was set
return "Grid priority mode active"; return "Grid priority mode active";
case EssMode.BatteryPriority: case EssMode.BatteryPriority:
statusrecord.AcDcGrowatt.Devices[0].RemotePowerControl = true; statusrecord.AcDcGrowatt.RemotePowerControl = true;
statusrecord.AcDcGrowatt.Devices[0].RemotePowerControlChargeDuration = 0; // 30408 this the duration statusrecord.AcDcGrowatt.RemotePowerControlChargeDuration = 0; // 30408 this the duration
statusrecord.AcDcGrowatt.Devices[0].RemoteChargDischargePower = 100; //30409 we set power here // for grid priority from 0 to 100 statusrecord.AcDcGrowatt.RemoteChargDischargePower = 100; //30409 we set power here // for grid priority from 0 to 100
statusrecord.AcDcGrowatt.Devices[0].ActualChargeDischargePowerControlValue.WriteLine(" register 30474");; // this to check what was set statusrecord.AcDcGrowatt.ActualChargeDischargePowerControlValue.WriteLine(" register 30474");; // this to check what was set
return "Battery priority mode active"; return "Battery priority mode active";
case EssMode.LoadPriority: case EssMode.LoadPriority:
statusrecord.AcDcGrowatt.Devices[0].RemotePowerControl = false; statusrecord.AcDcGrowatt.RemotePowerControl = false;
return "Load priority mode active"; return "Load priority mode active";
default: default:
throw new ArgumentOutOfRangeException(nameof(mode), mode, null); throw new ArgumentOutOfRangeException(nameof(mode), mode, null);
@ -211,27 +217,27 @@ public static class Program
var alarmList = new List<AlarmOrWarning>(); var alarmList = new List<AlarmOrWarning>();
var warningList = new List<AlarmOrWarning>(); var warningList = new List<AlarmOrWarning>();
if (record.AcDcGrowatt.Devices[0].SystemOperatingMode == GrowattSystemStatus.Fault) if (record.AcDcGrowatt.SystemOperatingMode == GrowattSystemStatus.Fault)
{ {
if (record.AcDcGrowatt.Devices[0].FaultMainCode != 0) if (record.AcDcGrowatt.FaultMainCode != 0)
{ {
alarmList.Add(new AlarmOrWarning alarmList.Add(new AlarmOrWarning
{ {
Date = DateTime.Now.ToString("yyyy-MM-dd"), Date = DateTime.Now.ToString("yyyy-MM-dd"),
Time = DateTime.Now.ToString("HH:mm:ss"), Time = DateTime.Now.ToString("HH:mm:ss"),
CreatedBy = "Growatt Inverter", CreatedBy = "Growatt Inverter",
Description = record.AcDcGrowatt.Devices[0].WarningMainCode.ToString(), // to add the sub code Description = record.AcDcGrowatt.WarningMainCode.ToString(), // to add the sub code
}); });
} }
if (record.AcDcGrowatt.Devices[0].FaultSubCode != 0) if (record.AcDcGrowatt.WarningMainCode != 0)
{ {
warningList.Add(new AlarmOrWarning warningList.Add(new AlarmOrWarning
{ {
Date = DateTime.Now.ToString("yyyy-MM-dd"), Date = DateTime.Now.ToString("yyyy-MM-dd"),
Time = DateTime.Now.ToString("HH:mm:ss"), Time = DateTime.Now.ToString("HH:mm:ss"),
CreatedBy = "Growatt inverter", CreatedBy = "Growatt inverter",
Description = record.AcDcGrowatt.Devices[0].FaultMainCode.ToString(), //to add the sub code Description = record.AcDcGrowatt.FaultMainCode.ToString(), //to add the sub code
}); });
} }
} }
@ -300,14 +306,14 @@ public static class Program
if (st is null) if (st is null)
return; return;
st.AcDcGrowatt.Devices[0].EmsCommunicationFailureTime = 20; // 20 sec st.AcDcGrowatt.EmsCommunicationFailureTime = 20; // 20 sec
st.AcDcGrowatt.Devices[0].EnableEmsCommunicationFailureTime = true; st.AcDcGrowatt.EnableEmsCommunicationFailureTime = false;
st.AcDcGrowatt.Devices[0].EnableCommand = true; st.AcDcGrowatt.EnableCommand = false;
st.AcDcGrowatt.Devices[0].ControlPermession = true; st.AcDcGrowatt.ControlPermession = false;
st.AcDcGrowatt.Devices[0].BatteryChargeCutoffVoltage = 100; //st.Config.BatteryChargeCutoffVoltage; st.AcDcGrowatt.BatteryChargeCutoffVoltage = 100; //st.Config.BatteryChargeCutoffVoltage;
st.AcDcGrowatt.Devices[0].BatteryDischargeCutoffVoltage = 20; //st.Config.BatteryDischargeCutoffVoltage; st.AcDcGrowatt.BatteryDischargeCutoffVoltage = 20; //st.Config.BatteryDischargeCutoffVoltage;
st.AcDcGrowatt.Devices[0].BatteryMaxChargeCurrent = 150; //st.Config.BatteryChargeCutoffVoltage; st.AcDcGrowatt.BatteryMaxChargeCurrent = 150; //st.Config.BatteryChargeCutoffVoltage;
st.AcDcGrowatt.Devices[0].BatteryMaxdischargeCurrent = 150; //st.Config.BatteryChargeCutoffVoltage; st.AcDcGrowatt.BatteryMaxdischargeCurrent = 150; //st.Config.BatteryChargeCutoffVoltage;
} }
@ -350,16 +356,16 @@ public static class Program
{ {
var modbusData = new Dictionary<String, UInt16>(); var modbusData = new Dictionary<String, UInt16>();
Console.WriteLine(new DateTimeOffset(status.AcDcGrowatt.Devices[0].SystemDateTime).ToUnixTimeSeconds() + " This Growatt time"); Console.WriteLine(new DateTimeOffset(status.AcDcGrowatt.SystemDateTime).ToUnixTimeSeconds() + " This Growatt time");
// SYSTEM DATA // SYSTEM DATA
var result1 = ConvertToModbusRegisters((status.AcDcGrowatt.Devices[0].VppProtocolVerNumber * 10), "UInt16", 30001); var result1 = ConvertToModbusRegisters((status.AcDcGrowatt.VppProtocolVerNumber * 10), "UInt16", 30001);
var result2 = ConvertToModbusRegisters(status.AcDcGrowatt.Devices[0].SystemDateTime.ToUnixTime(), "UInt32", 30002); var result2 = ConvertToModbusRegisters(status.AcDcGrowatt.SystemDateTime.ToUnixTime(), "UInt32", 30002);
var result3 = ConvertToModbusRegisters(status.AcDcGrowatt.Devices[0].SystemOperatingMode, "Int16", 30004); var result3 = ConvertToModbusRegisters(status.AcDcGrowatt.SystemOperatingMode, "Int16", 30004);
// BATTERY SUMMARY (assuming single battery [0]) // BATTERY SUMMARY (assuming single battery [0])
var battery = status.AcDcGrowatt.Devices[0].BatteriesRecords!.Batteries[0]; var battery = status.AcDcGrowatt.BatteriesRecords!.Batteries[0];
var result4 = ConvertToModbusRegisters((status.AcDcGrowatt.Devices[0].BatteriesRecords!.Batteries.Count ), "UInt16", 31000); var result4 = ConvertToModbusRegisters((status.AcDcGrowatt.BatteriesRecords!.Batteries.Count ), "UInt16", 31000);
var result5 = ConvertToModbusRegisters((battery.Power.Value * 10), "Int32", 31001); var result5 = ConvertToModbusRegisters((battery.Power.Value * 10), "Int32", 31001);
var result6 = ConvertToModbusRegisters((battery.DailyChargeEnergy.Value * 10), "UInt32", 31003); var result6 = ConvertToModbusRegisters((battery.DailyChargeEnergy.Value * 10), "UInt32", 31003);
var result7 = ConvertToModbusRegisters((battery.AccumulatedChargeEnergy.Value * 10), "UInt32", 31005); var result7 = ConvertToModbusRegisters((battery.AccumulatedChargeEnergy.Value * 10), "UInt32", 31005);
@ -371,7 +377,7 @@ public static class Program
var result12 = ConvertToModbusRegisters((battery.Voltage.Value * 10), "Int16", 31015); var result12 = ConvertToModbusRegisters((battery.Voltage.Value * 10), "Int16", 31015);
var result13 = ConvertToModbusRegisters((battery.Current.Value * 10), "Int32", 31016); var result13 = ConvertToModbusRegisters((battery.Current.Value * 10), "Int32", 31016);
var result14 = ConvertToModbusRegisters((battery.Soc.Value * 100), "UInt16", 31018); var result14 = ConvertToModbusRegisters((battery.Soc.Value * 100), "UInt16", 31018);
var result15 = ConvertToModbusRegisters((status.AcDcGrowatt.Devices[0].BatteriesRecords!.AverageSoh * 100), "UInt16", 31019); var result15 = ConvertToModbusRegisters((status.AcDcGrowatt.BatteriesRecords!.AverageSoh * 100), "UInt16", 31019);
var result16 = ConvertToModbusRegisters((battery.BatteryAmbientTemperature.Value * 100), "UInt16", 31021); var result16 = ConvertToModbusRegisters((battery.BatteryAmbientTemperature.Value * 100), "UInt16", 31021);