@page "/" @using Radzen @using Radzen.Blazor @using BattSim.Models @using BattSim.Services Thuisbatterij Simulator

Thuisbatterij Simulator

1
Fluvius Data

Upload je Fluvius kwartierdata om te beginnen

@if (FluviusDataRaw.Length > 0 && !StepData[0].isProcessing) {

@_uploadedFileName

}
@if (StepData[0].Completed) {
Data succesvol ingeladen en verwerkt!
} @if (_uploadError != null) {
@_uploadError
}

Tip: Download een volledig jaar aan kwartierdata voor de meest accurate resultaten.

2
Batterij Simulatie

Test verschillende batterijconfiguraties

@if (FluviusDataRaw.Length == 0) {

Upload eerst je Fluvius data (stap 1) om deze stap te kunnen uitvoeren.

} else {

Efficiëntie is het percentage van opgeslagen energie dat terug kan worden gebruikt.

@if (StepData[1].Completed) {
Simulatie voltooid! @SimulationData.Length kwartieren gesimuleerd.
} }
3
Kosten Berekenen

Vergelijk kosten met en zonder batterij

Vaste Kosten

Energiekosten

Heffingen Groene Stroom

Net- en distributiekosten

Heffingen en Toeslagen

@if (StepData[2].Completed) {

Originele kosten: €@normalCost.ToString("0.00")

Gesimuleerde kosten: €@simulatedCost.ToString("0.00")

Besparing: €@((normalCost - simulatedCost).ToString("0.00"))

@if (normalCost > 0) {

Besparingspercent: @(((normalCost - simulatedCost) / normalCost * 100).ToString("0.00"))%

}
}
@if (FilteredFluviusData.Length > 0) {

Overzicht: Energie Data & Simulatie

@if (FilteredSimulationData.Length > 0) { }
} @code { EnergyData[] FluviusDataRaw = []; EnergyData[] SimulationData = []; DataFilter.FilterOption SelectedFilterOption = DataFilter.FilterOption.ALL; EnergyData[] FilteredFluviusData = []; EnergyData[] FilteredSimulationData = []; EnergyCostCalculator calculator = new(); double normalCost = 0.0; double simulatedCost = 0.0; struct PipelineStep{ public bool Expanded; public bool Completed; public bool isProcessing; } PipelineStep[] StepData = [ new PipelineStep(), // Step 1 new PipelineStep(), // Step 2 new PipelineStep(), // Step 3 ]; string _uploadedFileName = string.Empty; string? _uploadError = null; string _timePeriod = "all"; double BatteryCapacity = 7.5; double Efficiency = 90; private string GetPipelineStepClasses(int step){ var classes = new List(); if (StepData[step].Expanded) classes.Add("expanded"); if (StepData[step].Completed) classes.Add("completed"); if (StepData[step].isProcessing) classes.Add("running"); return string.Join(" ", classes); } private string GetTimeButtonClass(string period) { var baseClass = "time-toggle-button"; if (_timePeriod == period) { return $"{baseClass} active"; } return baseClass; } private void SetTimePeriodAll() => SetTimePeriod("all"); private void SetTimePeriodYear() => SetTimePeriod("year"); private void SetTimePeriodMonth() => SetTimePeriod("month"); private void SetTimePeriodWeek() => SetTimePeriod("week"); private void SetTimePeriodDay() => SetTimePeriod("day"); private void ToggleBox(int step) { if(step == 1 && FluviusDataRaw.Length == 0) return; if(step == 2 && SimulationData.Length == 0) return; StepData[step].Expanded = !StepData[step].Expanded; StateHasChanged(); } private async Task OnFileUploaded(InputFileChangeEventArgs e) { _uploadError = null; var file = e.File; _uploadedFileName = file.Name; if (file.ContentType != "text/csv") { _uploadError = "Alleen CSV bestanden zijn toegestaan!"; StateHasChanged(); return; } try { StepData[0].isProcessing = true; StateHasChanged(); FluviusDataRaw = await FluviusDataHandler.LoadAndProcessFile(file); SetTimePeriod("all"); FilteredSimulationData = []; StepData[0].isProcessing = false; StepData[0].Completed = true; StepData[1].Completed = false; StepData[2].Completed = false; SimulationData = []; StateHasChanged(); } catch (Exception ex) { StepData[0].isProcessing = false; _uploadError = ex.Message; StateHasChanged(); } } private void SimulateBattery() { if (FluviusDataRaw.Length == 0) return; StepData[1].isProcessing = true; StateHasChanged(); try { SimulationData = BatterySimulator.SimulateBattery(FluviusDataRaw, BatteryCapacity, Efficiency/100); SetTimePeriod("all"); StepData[1].isProcessing = false; StepData[1].Completed = true; StepData[2].Completed = false; normalCost = 0; simulatedCost = 0; StateHasChanged(); } catch (Exception ex) { StepData[1].isProcessing = false; Console.WriteLine($"Error: {ex.Message}"); } } private void Calculate() { if (SimulationData.Length == 0) return; StepData[2].isProcessing = true; StateHasChanged(); try { normalCost = calculator.CalculateCostOfEnergyUsage(FluviusDataRaw); StepData[2].isProcessing = false; StepData[2].Completed = true; StateHasChanged(); } catch (Exception ex) { StepData[2].isProcessing = false; Console.WriteLine($"Error: {ex.Message}"); } } private void SetTimePeriod(string period) { _timePeriod = period; var filterOption = period switch { "all" => DataFilter.FilterOption.ALL, "year" => DataFilter.FilterOption.YEAR, "month" => DataFilter.FilterOption.MONTH, "week" => DataFilter.FilterOption.WEEK, "day" => DataFilter.FilterOption.DAY, }; // Filter data based on selected period if(FluviusDataRaw.Length > 0) FilteredFluviusData = DataFilter.FilterData(FluviusDataRaw, filterOption); if(FilteredSimulationData.Length > 0) FilteredSimulationData = DataFilter.FilterData(SimulationData, filterOption); StateHasChanged(); } private string FormatObject(object value) { if(value is double d) return $"{d:0.##} kWh"; 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; } }