# --- Configuration ---
BATTERY = {
"capacity": 4.6,
"charge_w": 2500,
"discharge_w": 800,
"eff": 0.87
}
# Prijzen in € per kWh
COMMODITY_OFFTAKE = 0.154
COMMODITY_INJECTION = 0.0373
VAR_NET_COSTS = 0.055 # Netkosten per kWh
LEVIES = 0.052 # Energy tax + Federal/Flemish bijdragen
CAPACITY_RATE_YR = 55.0 # € per kW peak per year (approx Fluvius)
csv_data = "Verbruikshistoriek_elektriciteit_20240126_20260127_kwartiertotalen.csv"
def simulate_with_savings(csv_data):
df = pd.read_csv(csv_data, sep=';', decimal=',')
df = df.iloc[70272:]
df['timestamp'] = pd.to_datetime(df['Van (datum)'] + ' ' + df['Van (tijdstip)'], dayfirst=True)
# Pivot data
pivot_df = df.pivot_table(index=['timestamp'],
columns='Register', values='Volume').fillna(0).reset_index()
pivot_df['Import'] = pivot_df.filter(like='Afname').sum(axis=1)
pivot_df['Export'] = pivot_df.filter(like='Injectie').sum(axis=1)
soc = 0.0
results = []
# Per-interval limits
max_chg_kwh = (BATTERY["charge_w"] / 1000) * 0.25
max_dis_kwh = (BATTERY["discharge_w"] / 1000) * 0.25
for _, row in pivot_df.iterrows():
imp, exp = row['Import'], row['Export']
chg, dis = 0.0, 0.0
# Logica
if exp > 0:
# batterij laden om injectie te beperkten
chg = min(exp, max_chg_kwh, (BATTERY["capacity"] - soc) / BATTERY["eff"])
soc += chg * BATTERY["eff"]
elif imp > 0:
# batterij ontladen om injectie te beperkten
dis = min(imp, max_dis_kwh, soc * BATTERY["eff"])
soc -= (dis / BATTERY["eff"])
results.append({
'Time': row['timestamp'],
'SOC': soc,
'Original_Peak_kW': imp * 4, # kWh in 15m to kW
'New_Peak_kW': (imp - dis) * 4,
'Old_Import': imp,
'New_Import': imp - dis,
'Old_Export': exp,
'New_Export': exp - chg
})
res_df = pd.DataFrame(results)
# --- Financial Totals ---
# Costs without battery
cost_old = (res_df['Old_Import'].sum() * (COMMODITY_OFFTAKE + VAR_NET_COSTS + LEVIES)) - \
(res_df['Old_Export'].sum() * COMMODITY_INJECTION)
# Costs with battery
cost_new = (res_df['New_Import'].sum() * (COMMODITY_OFFTAKE + VAR_NET_COSTS + LEVIES)) - \
(res_df['New_Export'].sum() * COMMODITY_INJECTION)
# Peak Savings (Capacity Tariff)
peak_reduction = res_df['Original_Peak_kW'].max() - res_df['New_Peak_kW'].max()
peak_savings = (peak_reduction * CAPACITY_RATE_YR) / 365 # Pro-rated for 1 day
total_savings = (cost_old - cost_new) + peak_savings
print(f"--- Simulation Summary ---")
print(f"Total Savings: €{total_savings:.2f}")
print(f"Grid Offtake Reduced by: {res_df['Old_Import'].sum() - res_df['New_Import'].sum():.2f} kWh, from {res_df['Old_Import'].sum():.2f} to {res_df['New_Import'].sum():.2f} ")
print(f"Grid Injection Reduced by: {res_df['Old_Export'].sum() - res_df['New_Export'].sum():.2f} kWh, from {res_df['Old_Export'].sum():.2f} to {res_df['New_Export'].sum():.2f} ")
return res_df