Blazor webassembly with radzen setup

This commit is contained in:
DouweRavers
2026-03-27 13:51:58 +01:00
commit 617fdf10e0
21 changed files with 874 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
using System.Collections.Generic;
using BatteryCostAnalysis.Models;
namespace BatteryCostAnalysis.Services
{
public class BatterySimulator
{
public static List<BatteryDayResult> SimulateBattery(List<EnergyData> data, double batteryCapacity)
{
var results = new List<BatteryDayResult>();
double remainingEnergy = 0;
foreach (var day in data)
{
// Charge battery from production
var totalProduction = day.DayProduction + day.NightProduction;
var chargedEnergy = System.Math.Min(totalProduction, batteryCapacity);
var excessProduction = totalProduction - chargedEnergy;
// Use battery for consumption
var totalConsumption = day.DayConsumption + day.NightConsumption;
var usedEnergy = System.Math.Min(chargedEnergy + remainingEnergy, totalConsumption);
var remainingAfterUse = chargedEnergy + remainingEnergy - usedEnergy;
// Calculate reduced values
var reducedConsumption = System.Math.Min(usedEnergy, totalConsumption);
var reducedProduction = totalProduction - chargedEnergy;
results.Add(new BatteryDayResult
{
Date = day.Date,
ChargedEnergy = chargedEnergy,
UsedEnergy = usedEnergy,
RemainingEnergy = remainingAfterUse,
ReducedConsumption = reducedConsumption,
ReducedProduction = reducedProduction
});
remainingEnergy = remainingAfterUse;
}
return results;
}
}
}

54
Services/DataLoader.cs Normal file
View File

@@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using BatteryCostAnalysis.Models;
namespace BatteryCostAnalysis.Services
{
public class DataLoader
{
public static List<EnergyData> LoadAndProcessData(string filePath)
{
var energyData = new List<EnergyData>();
var lines = File.ReadAllLines(filePath).Skip(1); // Skip header
foreach (var line in lines)
{
var parts = line.Split(';');
if (parts.Length < 9) continue;
var date = DateTime.Parse(parts[0], new CultureInfo("nl-BE"));
var register = parts[7].Trim();
var volumeStr = parts[8].Trim();
var volume = string.IsNullOrEmpty(volumeStr) ? 0 : double.Parse(volumeStr.Replace(",", "."), CultureInfo.InvariantCulture);
var existing = energyData.FirstOrDefault(e => e.Date == date);
if (existing == null)
{
existing = new EnergyData { Date = date };
energyData.Add(existing);
}
switch (register)
{
case "Afname Dag":
existing.DayConsumption = volume;
break;
case "Afname Nacht":
existing.NightConsumption = volume;
break;
case "Injectie Dag":
existing.DayProduction = volume;
break;
case "Injectie Nacht":
existing.NightProduction = volume;
break;
}
}
return energyData;
}
}
}

View File

@@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using BatteryCostAnalysis.Models;
namespace BatteryCostAnalysis.Services
{
public class ReportGenerator
{
public static void GenerateReport(List<EnergyData> originalData, Dictionary<int, List<BatteryDayResult>> scenarios)
{
using (var writer = new StreamWriter("../../../BatteryAnalysisReport.md"))
{
writer.WriteLine("# Battery Cost Analysis Report\n");
// Original data summary
writer.WriteLine("## Original Data Summary");
var totalConsumption = originalData.Sum(d => d.DayConsumption + d.NightConsumption);
var totalProduction = originalData.Sum(d => d.DayProduction + d.NightProduction);
writer.WriteLine($"Total Consumption: {totalConsumption:F2} kWh");
writer.WriteLine($"Total Production: {totalProduction:F2} kWh\n");
// Generate graph data
writer.WriteLine("### Energy Consumption and Production\n");
writer.WriteLine("```");
writer.WriteLine("Date,Total Production,Total Consumption");
foreach (var day in originalData)
{
var prod = day.DayProduction + day.NightProduction;
var cons = day.DayConsumption + day.NightConsumption;
writer.WriteLine($"{day.Date:yyyy-MM-dd},{prod:F2},{cons:F2}");
}
writer.WriteLine("```\n");
writer.WriteLine("![Energy Graph](energy_graph.png)");
writer.WriteLine("(Graph showing total production in green and total consumption in red)\n");
// Scenario analysis
foreach (var scenario in scenarios)
{
var batteryCount = scenario.Key;
var results = scenario.Value;
writer.WriteLine($"## Scenario with {batteryCount} Battery{(batteryCount > 1 ? "ies" : "")}");
writer.WriteLine($"Battery Capacity: {batteryCount * 2.6} kWh\n");
var totalReducedConsumption = results.Sum(r => r.ReducedConsumption);
var totalReducedProduction = results.Sum(r => r.ReducedProduction);
var savings = totalReducedConsumption * 0.30; // Assuming €0.30 per kWh
writer.WriteLine($"Total Reduced Consumption: {totalReducedConsumption:F2} kWh");
writer.WriteLine($"Total Reduced Production: {totalReducedProduction:F2} kWh");
writer.WriteLine($"Estimated Annual Savings: €{savings:F2}\n");
// Generate scenario graph data
writer.WriteLine($"### Battery Performance for {batteryCount} Battery{(batteryCount > 1 ? "ies" : "")}\n");
writer.WriteLine("```");
writer.WriteLine("Date,Charged Energy,Used Energy,Remaining Energy");
foreach (var result in results)
{
writer.WriteLine($"{result.Date:yyyy-MM-dd},{result.ChargedEnergy:F2},{result.UsedEnergy:F2},{result.RemainingEnergy:F2}");
}
writer.WriteLine("```\n");
writer.WriteLine($"![Battery Performance Graph](battery_{batteryCount}_graph.png)");
writer.WriteLine("(Graph showing charged energy in blue, used energy in orange, and remaining energy in gray)\n");
// Detailed daily results
writer.WriteLine("### Daily Results");
writer.WriteLine("| Date | Charged (kWh) | Used (kWh) | Remaining (kWh) |");
writer.WriteLine("|------|---------------|------------|-----------------|");
foreach (var result in results.Take(10)) // Show first 10 days
{
writer.WriteLine($"| {result.Date:yyyy-MM-dd} | {result.ChargedEnergy:F2} | {result.UsedEnergy:F2} | {result.RemainingEnergy:F2} |");
}
writer.WriteLine("\n---\n");
}
}
Console.WriteLine("Report generated: BatteryAnalysisReport.md");
}
}
}