using InnovEnergy.Lib.Units; namespace InnovEnergy.Lib.Devices.BatteryDeligreen; public class BatteryDeligreenRecords { //public required DcBus Dc { get; init; } public required Current Current { get; init; } public required Voltage Voltage { get; init; } public required Percent Soc { get; init; } public required Double Soh { get; init; } public required Percent CurrentMinSoc { get; init; } public required Temperature TemperatureCell1 { get; init; } public required Double Power { get; init; } public required Voltage LowestCellVoltage { get; init; } public required Voltage HighestCellVoltage { get; init; } public required Boolean MonomerHighVoltageAlarm { get; init; } public required Boolean MonomerLowVoltageAlarm { get; init; } public required Boolean ChargeSwitchState { get; init; } public required Boolean DischargeSwitchState { get; init; } public required Int32 AvailableDischBatteries { get; init; } public required Int32 AvailableChBatteries { get; init; } public required Boolean Eoc { get; init; } // End of Charge public required Boolean Eod { get; init; } // End of Discharge // public required Temperature TemperatureCell2 { get; init; } // public required Temperature TemperatureCell3 { get; init; } // public required Temperature TemperatureCell4 { get; init; } // to continue other temperature public required IReadOnlyList Devices { get; init; } public static BatteryDeligreenRecords? FromBatteries(IReadOnlyList? records) { if (records is null || records.Count == 0) { Console.WriteLine("FromBatteries: either record is null or empty"); return null; } return new BatteryDeligreenRecords { Devices = records, Soc = records.Average(r => r.BatteryDeligreenDataRecord.Soc.Value), Soh = records.Average(r => r.BatteryDeligreenDataRecord.Soh), CurrentMinSoc = records.Min(r => r.BatteryDeligreenDataRecord.Soc.Value), TemperatureCell1 = records.Average(b => b.BatteryDeligreenDataRecord.TemperaturesList.CellTemperature1), Current = records.Sum(r =>r.BatteryDeligreenDataRecord.BusCurrent), Voltage = records.Average(r =>r.BatteryDeligreenDataRecord.BusVoltage), Power = records.Sum(r => r.BatteryDeligreenDataRecord.Power), LowestCellVoltage = records.Min(r => r.BatteryDeligreenDataRecord.CellVoltage.Min()), HighestCellVoltage = records.Max(r => r.BatteryDeligreenDataRecord.CellVoltage.Max()), MonomerHighVoltageAlarm = records.Any(r => r.BatteryDeligreenAlarmRecord.AlarmEvent2.MonomerHighVoltageAlarm), MonomerLowVoltageAlarm = records.Any(r => r.BatteryDeligreenAlarmRecord.AlarmEvent2.MonomerLowVoltageAlarm), ChargeSwitchState = records.All(r => r.BatteryDeligreenAlarmRecord.OnOffState.ChargeSwitchState), DischargeSwitchState = records.All(r => r.BatteryDeligreenAlarmRecord.OnOffState.DischargeSwitchState), AvailableDischBatteries = records.Select(r => r.BatteryDeligreenAlarmRecord.OnOffState.DischargeSwitchState ? 1 : 0).Sum(), AvailableChBatteries = records.Select(r => r.BatteryDeligreenAlarmRecord.OnOffState.ChargeSwitchState ? 1 : 0).Sum(), Eoc = records.All(r => r.BatteryDeligreenAlarmRecord.AlarmEvent2.MonomerOvervoltageProtection), Eod = records.All(r => r.BatteryDeligreenAlarmRecord.AlarmEvent2.MonomerUnderVoltageProtection), }; } }