Improved chart visual

This commit is contained in:
douwe
2026-04-24 10:51:48 +02:00
parent ac7c5e6013
commit 0d7bc18293
5 changed files with 55 additions and 114 deletions

View File

@@ -6,14 +6,14 @@ namespace BattSim.Services
{
public static class BatterySimulator
{
public static SimulatedBatteryEnergyData[] SimulateBattery(EnergyData[] energyData, double batteryCapacity, double efficiency)
public static EnergyData[] SimulateBattery(EnergyData[] energyData, double batteryCapacity, double efficiency)
{
var results = new List<SimulatedBatteryEnergyData>();
var results = new List<EnergyData>();
double batteryCharge = 0;
foreach (var e in energyData)
{
var simulatedBatteryEnergyData = new SimulatedBatteryEnergyData(e);
var simulatedBatteryEnergyData = new EnergyData(e);
// Simulate charging the battery based on production
double excessProduction = batteryCharge + e.Production - batteryCapacity;
batteryCharge = double.Min(batteryCharge + e.Production, batteryCapacity);
@@ -33,30 +33,5 @@ namespace BattSim.Services
return results.ToArray();
}
public static SimulatedBatteryEnergyData[] GenerateDailyData(SimulatedBatteryEnergyData[] simulationData)
{
var simulationDataCopy = (SimulatedBatteryEnergyData[]) simulationData.Clone();
var dailySimulationData = new ConcurrentDictionary<DateOnly, SimulatedBatteryEnergyData>();
Parallel.ForEach(simulationDataCopy, simulationPoint =>
{
var date = DateOnly.FromDateTime(simulationPoint.Time);
// Use AddOrUpdate to avoid double lookup
dailySimulationData.AddOrUpdate(
date,
new SimulatedBatteryEnergyData(simulationPoint), // If key doesn't exist, add this value
(_, existing) =>
{
// If key exists, aggregate the values
existing.Consumption += simulationPoint.Consumption;
existing.Production += simulationPoint.Production;
existing.BatteryCharge = double.Max(existing.BatteryCharge, simulationPoint.BatteryCharge);
return existing;
}
);
});
return dailySimulationData.Values.ToArray();
}
}
}

30
Services/DataFilter.cs Normal file
View File

@@ -0,0 +1,30 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using BattSim.Models;
namespace BattSim.Services
{
public static class DataFilter
{
public enum FilterOption { ALL, YEAR, MONTH, WEEK, DAY }
public static EnergyData[] FilterData(EnergyData[] data, FilterOption filterOption)
{
var dailyData = data
.GroupBy(d=>d.Time.Date)
.Select(group=> new EnergyData{
Consumption = group.Sum(d => d.Consumption),
Production = group.Sum(d => d.Production),
BatteryCharge = group.Max(d => d.BatteryCharge),
Time = group.First().Time
}).ToArray();
return filterOption switch {
FilterOption.DAY => data[(data.Length > 96?data.Length - 96:0)..], // 24 hours * 4 quarters per hour
FilterOption.WEEK => data[(data.Length > 672?data.Length - 672:0)..], // 7 days * 24 hours * 4 quarters per hour
FilterOption.MONTH => dailyData[(dailyData.Length > 30?dailyData.Length - 30:0)..],
FilterOption.YEAR => dailyData[(dailyData.Length > 365?dailyData.Length - 365:0)..],
_ => dailyData
};
}
}
}