using InnovEnergy.Lib.Devices.Battery48TL; using InnovEnergy.Lib.StatusApi; using InnovEnergy.Lib.Units; using InnovEnergy.Lib.Units.Composite; using static InnovEnergy.Lib.Devices.Battery48TL.TemperatureState; namespace InnovEnergy.App.SaliMax.Controller; public static class AvgBatteriesStatus { public static CombinedStatus? Combine(this IReadOnlyList stati) { var combined = stati.Count == 0 ? null : new Battery48TLStatus { Soc = stati.Min(b => b.Soc), Temperature = stati.Average(b => b.Temperature), Dc = new DcBus { Voltage = stati.Average(b => b.Dc.Voltage), Current = stati.Sum(b => b.Dc.Current), }, Alarms = stati.SelectMany(b => b.Alarms).Distinct().ToList(), Warnings = stati.SelectMany(b => b.Warnings).Distinct().ToList(), MaxChargingPower = stati.Sum(b => b.MaxChargingPower), MaxDischargingPower = stati.Sum(b => b.MaxDischargingPower), Heating = stati.Any(b => b.Heating), AmberLed = LedState.Off, // not used for combined battery BlueLed = LedState.Off, RedLed = LedState.Off, GreenLed = LedState.Off, CellsVoltage = stati.Average(b => b.CellsVoltage), ConnectedToDc = stati.Any(b => b.ConnectedToDc), TemperatureState = stati.Any(b => b.TemperatureState == OperatingTemperature) // TODO: revisit when we have the overheated state ? OperatingTemperature : Cold, TotalCurrent = stati.Average(b => b.TotalCurrent), EocReached = stati.All(b => b.EocReached), }; return new CombinedStatus { Combined = combined!, Children = stati }; } }