Blazor webassembly with radzen setup
This commit is contained in:
45
Services/BatterySimulator.cs
Normal file
45
Services/BatterySimulator.cs
Normal 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
54
Services/DataLoader.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
86
Services/ReportGenerator.cs
Normal file
86
Services/ReportGenerator.cs
Normal 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("");
|
||||
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($"");
|
||||
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");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user