Shart generation after csv files uploaded.

This commit is contained in:
douwe
2026-03-28 12:47:03 +01:00
parent 113b7c3234
commit 9f1fbcdd5a
4 changed files with 67 additions and 21 deletions

View File

@@ -7,7 +7,9 @@ namespace BattSim.Models
public DateOnly Date { get; set; } public DateOnly Date { get; set; }
public double DayConsumption { get; set; } public double DayConsumption { get; set; }
public double NightConsumption { get; set; } public double NightConsumption { get; set; }
public double TotalConsumption => DayConsumption + NightConsumption;
public double DayProduction { get; set; } public double DayProduction { get; set; }
public double NightProduction { get; set; } public double NightProduction { get; set; }
public double TotalProduction => DayProduction + NightProduction;
} }
} }

View File

@@ -1,4 +1,6 @@
@page "/" @page "/"
@using Radzen
@using Radzen.Blazor
@using BattSim.Models @using BattSim.Models
@using BattSim.Services @using BattSim.Services
@@ -6,21 +8,43 @@
<h1>BattSim</h1> <h1>BattSim</h1>
<h2>Input Data</h2>
<p>Upload your fluvius daily csv file here.</p> <p>Upload your fluvius daily csv file here.</p>
<InputFile OnChange="LoadCsvFile" accept=".csv"/> <InputFile OnChange="LoadCsvFile" accept=".csv"/>
@if (_isLoading){ <p>Loading...</p> } @if (_isLoadingFile){ <p>Loading...</p> }
@if (EnergyData.Length != 0){
<RadzenChart>
<RadzenAreaSeries Smooth=true Data="@EnergyData" CategoryProperty="Date" Title="Consumption" ValueProperty="TotalConsumption">
<RadzenChartTooltipOptions Visible="true" />
</RadzenAreaSeries>
<RadzenAreaSeries Smooth=true Data="@EnergyData" CategoryProperty="Date" Title="Production" ValueProperty="TotalProduction">
<RadzenChartTooltipOptions Visible="true" />
</RadzenAreaSeries>
<RadzenCategoryAxis Formatter="@FormatObject" Padding="20" LabelAutoRotation="-45">
<RadzenAxisTitle Text="Time" />
</RadzenCategoryAxis>
<RadzenValueAxis Formatter="@FormatObject">
<RadzenGridLines Visible="true" />
<RadzenAxisTitle Text="Energy" />
</RadzenValueAxis>
</RadzenChart>
}
<h2>Simulate Battery</h2>
<p>Set the battery capacity</p>
<InputNumber @bind-value="BatteryCapacity"/>
<Button @onclick="SimulateBattery">Simulate</Button>
<h2>Calculate Cost</h2>
@code { @code {
EnergyData[] EnergyData = []; EnergyData[] EnergyData = [];
(int, BatteryDayResult[])[] SimulationData = []; bool _isLoadingFile = false;
bool _isLoading = false;
private async Task LoadCsvFile(InputFileChangeEventArgs e) private async Task LoadCsvFile(InputFileChangeEventArgs e)
{ {
_isLoading = true;
StateHasChanged();
var file = e.File; var file = e.File;
if (file.ContentType != "text/csv") if (file.ContentType != "text/csv")
{ {
@@ -30,21 +54,42 @@
try try
{ {
var loadingTask = DataLoader.LoadAndProcessData(file); Console.WriteLine("Reading csv file...");
var energyData = await loadingTask; _isLoadingFile = true;
EnergyData = energyData.ToArray();
_isLoading = false;
StateHasChanged(); StateHasChanged();
foreach (var data in EnergyData) var loadingTask = DataLoader.LoadAndProcessData(file);
{ var energyData = await loadingTask;
Console.WriteLine(data.Date.ToString()); EnergyData = energyData.ToArray();
}
_isLoadingFile = false;
StateHasChanged();
Console.WriteLine("Done reading csv file!");
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine($"Error loading file: {ex.Message}"); Console.WriteLine($"Error loading file: {ex.Message}");
} }
} }
bool _showProduction = true;
bool _showConsumption = true;
private void OnSeriesClick(){}
private string FormatObject(object value) {
if(value is double d) return $"{value:0.##} kWh";
if(value is DateOnly date) return (date.Day == 1) ? date.ToString("MM/yyyy") : string.Empty;
else return string.Empty;
}
double BatteryCapacity = 0.0;
BatteryDayResult[] SimulationData = [];
private async Task SimulateBattery(){
Console.WriteLine("Simulating...");
SimulationData = BatterySimulator.SimulateBattery(EnergyData, BatteryCapacity).ToArray();
Console.WriteLine("Done simulating!");
}
} }

View File

@@ -3,9 +3,9 @@ using BattSim.Models;
namespace BattSim.Services namespace BattSim.Services
{ {
public class BatterySimulator public static class BatterySimulator
{ {
public static List<BatteryDayResult> SimulateBattery(List<EnergyData> data, double batteryCapacity) public static List<BatteryDayResult> SimulateBattery(EnergyData[] data, double batteryCapacity)
{ {
var results = new List<BatteryDayResult>(); var results = new List<BatteryDayResult>();
double remainingEnergy = 0; double remainingEnergy = 0;

View File

@@ -13,10 +13,8 @@
<link href="manifest.webmanifest" rel="manifest" /> <link href="manifest.webmanifest" rel="manifest" />
<link rel="apple-touch-icon" sizes="512x512" href="icon-512.png" /> <link rel="apple-touch-icon" sizes="512x512" href="icon-512.png" />
<link rel="apple-touch-icon" sizes="192x192" href="icon-192.png" /> <link rel="apple-touch-icon" sizes="192x192" href="icon-192.png" />
<script type="importmap"></script>
<link rel="stylesheet" href="_content/Radzen.Blazor/css/default.css"> <link rel="stylesheet" href="_content/Radzen.Blazor/css/default.css">
<script src="_content/Radzen.Blazor/Radzen.Blazor.js"></script> <script type="importmap"></script>
</head> </head>
<body> <body>
@@ -35,6 +33,7 @@
</div> </div>
<script src="_framework/blazor.webassembly#[.{fingerprint}].js"></script> <script src="_framework/blazor.webassembly#[.{fingerprint}].js"></script>
<script>navigator.serviceWorker.register('service-worker.js', { updateViaCache: 'none' });</script> <script>navigator.serviceWorker.register('service-worker.js', { updateViaCache: 'none' });</script>
<script src="_content/Radzen.Blazor/Radzen.Blazor.js"></script>
</body> </body>
</html> </html>