Added quarter based simulation with efficiency and capacity parameters.

This commit is contained in:
2026-04-14 22:20:01 +02:00
parent 3a0647aff2
commit 47d835d336
6 changed files with 147 additions and 80 deletions

View File

@@ -4,32 +4,29 @@
@using BattSim.Models
@using BattSim.Services
<PageTitle>BattSim</PageTitle>
<PageTitle>Energie Simulator</PageTitle>
<h1>BattSim</h1>
<h1>Energie Simulator</h1>
<h2>Input Data</h2>
<h2>Je Fluvius Energie Data</h2>
<div>
<p>Upload your Fluvius quarterly csv file here. The longer the timeframe the longer it takes to process.</p>
<p>Ga naar de website van Fluvius en download je historische elektriciteitsverbruiksgegevens met kwartier nauwkeurigheid. Voor een optimale simulatie is het raadzaam om een volledig jaar te downloaden. Dit geeft je inzicht in seizoensgebonden patronen en helpt om realistische uitkomsten te genereren.</p>
<InputFile OnChange="OnFileUploaded" accept=".csv"/>
@if (_isLoadingFile)
{
<p>Loading...</p>
}
@if (_isLoadingFile) { <p>Data aan het inladen...</p> }
else
{
@if (FluviusDataRaw.Count != 0)
@if (FluviusDataRaw.Length != 0)
{
<p>@(FluviusDataRaw.Count) entries read.</p>
<p>@(FluviusDataRaw.Length) kwartieren ingeladen.</p>
}
@if (FluviusDataDaily.Count != 0)
@if (FluviusDataDaily.Length != 0)
{
<RadzenChart>
<RadzenAreaSeries Smooth=true Data="@FluviusDataDaily.Values" CategoryProperty="Time" Title="Consumption" ValueProperty="Consumption">
<RadzenAreaSeries Smooth=true Data="@FluviusDataDaily" CategoryProperty="Time" Title="Consumption" ValueProperty="Consumption">
<RadzenChartTooltipOptions Visible="true"/>
</RadzenAreaSeries>
<RadzenAreaSeries Smooth=true Data="@FluviusDataDaily.Values" CategoryProperty="Time" Title="Production" ValueProperty="Production">
<RadzenAreaSeries Smooth=true Data="@FluviusDataDaily" CategoryProperty="Time" Title="Production" ValueProperty="Production">
<RadzenChartTooltipOptions Visible="true"/>
</RadzenAreaSeries>
<RadzenCategoryAxis Formatter="@FormatObject" Padding="20" LabelAutoRotation="-45">
@@ -46,8 +43,8 @@
</div>
@code{
Dictionary<DateTime, EnergyData> FluviusDataRaw = [];
Dictionary<DateOnly, EnergyData> FluviusDataDaily = [];
EnergyData[] FluviusDataRaw = [];
EnergyData[] FluviusDataDaily = [];
bool _isLoadingFile = false;
private async Task OnFileUploaded(InputFileChangeEventArgs e)
@@ -79,41 +76,75 @@
private void OnSeriesClick(){}
private string FormatObject(object value) {
if(value is double d) return $"{d:0.##} kWh";
if(value is DateTime date) return date.ToString("dd/MM/yyyy");
if(value is DateTime time) return time.ToString("dd/MM/yyyy");
if(value is DateOnly date) return date.ToString("dd/MM/yyyy");
return string.Empty;
}
}
<h2>Simulate Battery</h2>
<h2>Batterij Simulatie</h2>
<div>
<p>Generate adjusted energy data simulating the effect of a battery with properties as configured here:</p>
<p>
Met je Fluvius-kwartierdata simuleren we een batterij die elk kwartier de energie die normaal op het elektriciteitsnet wordt teruggeleverd, opvangt en de stroom die normaal uit het net wordt gehaald vervangt—mits de batterij nog voldoende capaciteit heeft.
Op deze manier kun je verschillende batterijcapaciteiten testen om te zien welke installatie het beste past bij jouw verbruiksprofiel en besparingsdoelen. Daarnaast kun je onderzoeken hoe verschillende batterijtypes, met uiteenlopende efficiëntieniveaus, de uitkomsten beïnvloeden. Onder efficiëntie verstaan we hier het aandeel van de opgeslagen energie dat uiteindelijk ook daadwerkelijk weer kan worden gebruikt.
</p>
<ul>
<li>
<p>Capacity: <InputNumber @bind-value="BatteryCapacity"/> kWh</p>
<p>Batterijcapaciteit: <InputNumber @bind-value="BatteryCapacity"/> kWh</p>
</li>
<li>
<p>Discharge Rate: <InputNumber @bind-value="DischargeRate"/> kW</p>
</li>
<li>
<p>Charge Rate: <InputNumber @bind-value="ChargeRate"/> kW</p>
</li>
<li>
<p>Round-trip Efficiency: <InputNumber @bind-value="Efficiency"/> %</p>
<p>Round-trip Efficiëntie: <InputNumber @bind-value="Efficiency"/> %</p>
</li>
</ul>
<Button @onclick="SimulateBattery">Simulate</Button>
@if (_isSimulating) { <p>Simulating...</p> }
else
{
@if (SimulationDataDaily.Length != 0)
{
<RadzenChart>
<RadzenAreaSeries Smooth=true Data="@SimulationDataDaily" CategoryProperty="Time" Title="Consumption" ValueProperty="Consumption">
<RadzenChartTooltipOptions Visible="true"/>
</RadzenAreaSeries>
<RadzenAreaSeries Smooth=true Data="@SimulationDataDaily" CategoryProperty="Time" Title="Production" ValueProperty="Production">
<RadzenChartTooltipOptions Visible="true"/>
</RadzenAreaSeries>
<RadzenAreaSeries Smooth=true Data="@SimulationDataDaily" CategoryProperty="Time" Title="SimulatedConsumption" ValueProperty="SimulatedConsumption">
<RadzenChartTooltipOptions Visible="true"/>
</RadzenAreaSeries>
<RadzenAreaSeries Smooth=true Data="@SimulationDataDaily" CategoryProperty="Time" Title="SimulatedProduction" ValueProperty="SimulatedProduction">
<RadzenChartTooltipOptions Visible="true"/>
</RadzenAreaSeries>
<RadzenAreaSeries Smooth=true Data="@SimulationDataDaily" CategoryProperty="Time" Title="BatteryCharge" ValueProperty="BatteryCharge">
<RadzenChartTooltipOptions Visible="true"/>
</RadzenAreaSeries>
<RadzenCategoryAxis Formatter="@FormatObject" Padding="20" LabelAutoRotation="-45">
<RadzenGridLines Visible="true"/>
<RadzenAxisTitle Text="Time"/>
</RadzenCategoryAxis>
<RadzenValueAxis Formatter="@FormatObject">
<RadzenGridLines Visible="true"/>
<RadzenAxisTitle Text="Energy"/>
</RadzenValueAxis>
</RadzenChart>
}
}
</div>
@code {
double BatteryCapacity = 7.5;
double DischargeRate = 3;
double ChargeRate = 3;
double Efficiency = 90;
BatteryDayResult[] SimulationData = [];
bool _isSimulating = false;
private async Task SimulateBattery(){
SimulatedBatteryEnergyData[] SimulationData = [];
SimulatedBatteryEnergyData[] SimulationDataDaily = [];
private void SimulateBattery(){
Console.WriteLine("Simulating...");
// SimulationData = BatterySimulator.SimulateBattery(EnergyData, BatteryCapacity).ToArray();
_isSimulating = true;
SimulationData = BatterySimulator.SimulateBattery(FluviusDataRaw, BatteryCapacity, Efficiency/100);
SimulationDataDaily = BatterySimulator.GenerateDailyData(SimulationData);
_isSimulating = false;
Console.WriteLine("Done simulating!");
}
}