Improve genetic optimizer seeding

This commit is contained in:
Andreas
2026-07-16 09:56:50 +02:00
parent d4056af0f6
commit b0b437f1d7
8 changed files with 1152 additions and 793 deletions
+5
View File
@@ -62,6 +62,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
ETS forecasts. A median fallback is used when the available history is too short for ETS. ETS forecasts. A median fallback is used when the available history is too short for ETS.
### Changed ### Changed
- Seed genetic optimization runs with ten exact warm-start copies, twenty locally mutated
warm-start neighbours, and diverse domain-informed battery, direct-marketing, EV, and flexible
appliance schedules to improve early convergence without discarding the previous solution.
- `max_home_appliances` is now purely an upper bound. No demo appliance is created when - `max_home_appliances` is now purely an upper bound. No demo appliance is created when
no `home_appliances` are configured, and the number is no longer used as an on/off switch. no `home_appliances` are configured, and the number is no longer used as an on/off switch.
@@ -73,6 +76,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
are deprecated in favour of `appliance_starts` and `result.home_appliance_energy_wh`. are deprecated in favour of `appliance_starts` and `result.home_appliance_energy_wh`.
### Fixed ### Fixed
- Re-simulate genetic candidates after removing EV charging genes from slots that begin at full
SoC, keeping the repaired genome and its assigned fitness consistent.
- FeedInTariffEnergyCharts no longer aborts the whole prediction/optimization when the - FeedInTariffEnergyCharts no longer aborts the whole prediction/optimization when the
Energy-Charts API is briefly unreachable: transient timeouts/connection errors are Energy-Charts API is briefly unreachable: transient timeouts/connection errors are
retried (with a (connect, read) timeout of (5, 60) s), and if a fetch still fails while retried (with a (connect, read) timeout of (5, 60) s), and if a fetch still fails while
+269 -36
View File
@@ -536,6 +536,10 @@ class GeneticSimulation(PydanticBaseModel):
class GeneticOptimization(OptimizationBase): class GeneticOptimization(OptimizationBase):
"""GENETIC algorithm to solve energy optimization.""" """GENETIC algorithm to solve energy optimization."""
WARM_START_COPIES = 10
WARM_START_MUTATIONS = 20
EDUCATED_GUESS_EXPORT_QUANTILES = (0.60, 0.75, 0.90)
# Slot-math helpers — single source of truth for the optimization grid. # Slot-math helpers — single source of truth for the optimization grid.
# At the default optimization interval of 3600 s, slot_duration_h is 1.0 and # At the default optimization interval of 3600 s, slot_duration_h is 1.0 and
# total_slots equals prediction.hours, so the established hourly behaviour is # total_slots equals prediction.hours, so the established hourly behaviour is
@@ -1110,6 +1114,250 @@ class GeneticOptimization(OptimizationBase):
return discharge_hours_bin, eautocharge_hours_index, appliance_gene_values return discharge_hours_bin, eautocharge_hours_index, appliance_gene_values
def _repair_ev_charge_at_full_soc(
self,
individual: list[int],
simulation_result: dict[str, Any],
) -> bool:
"""Remove EV charging genes in slots that begin at full SoC.
The repair is deliberately separated from fitness calculation. Callers
must re-simulate after a change so the individual's genome, simulation
state and assigned fitness always describe the same schedule.
"""
if not self.optimize_ev or not self.ev_possible_charge_values:
return False
zero_charge_index = min(
range(len(self.ev_possible_charge_values)),
key=lambda index: abs(self.ev_possible_charge_values[index]),
)
if abs(self.ev_possible_charge_values[zero_charge_index]) > 1e-12:
return False
_, ev_charge_indices, _ = self.split_individual(individual)
if ev_charge_indices is None:
return False
ev_soc = np.asarray(simulation_result.get("EAuto_SoC_pro_Stunde", []), dtype=float)
start_slot = self._start_day_slot()
result_slots = min(ev_soc.size, self.total_slots - start_slot)
if result_slots <= 0:
return False
changed = False
for offset in range(result_slots):
slot = start_slot + offset
charge_index = int(ev_charge_indices[slot])
if (
ev_soc[offset] >= 100.0 - 1e-9
and self.ev_possible_charge_values[charge_index] > 0.0
):
ev_charge_indices[slot] = zero_charge_index
changed = True
if changed:
battery_genes, _, appliance_genes = self.split_individual(individual)
individual[:] = self.merge_individual(
battery_genes,
ev_charge_indices,
appliance_genes,
)
return changed
def _heuristic_ev_schedule(self, *, prefer_pv: bool) -> list[int]:
"""Build a low-cost EV schedule that reaches the configured minimum SoC."""
if not self.optimize_ev or not self.ev_possible_charge_values:
return []
zero_index = min(
range(len(self.ev_possible_charge_values)),
key=lambda index: abs(self.ev_possible_charge_values[index]),
)
schedule = [zero_index] * self.total_slots
ev = self.simulation.ev
if ev is None:
return schedule
required_stored_wh = max(
ev.min_soc_wh
- ev.capacity_wh * ev.initial_soc_percentage / 100.0,
0.0,
)
if required_stored_wh <= 0.0:
return schedule
start_slot = self._start_day_slot()
end_slot = max(start_slot, self.total_slots - self.fixed_eauto_hours)
prices = np.asarray(self.simulation.elect_price_hourly, dtype=float)
feed_in = np.asarray(self.simulation.elect_revenue_per_hour_arr, dtype=float)
pv = np.asarray(self.simulation.pv_prediction_wh, dtype=float)
load = np.asarray(self.simulation.load_energy_array, dtype=float)
def marginal_cost(slot: int) -> tuple[float, float]:
surplus = pv[slot] - load[slot]
if prefer_pv and surplus > 0.0:
return (float(feed_in[slot]), -float(surplus))
return (float(prices[slot]), -float(surplus))
candidates = sorted(range(start_slot, end_slot), key=marginal_cost)
positive_rates = sorted(
(
(rate, index)
for index, rate in enumerate(self.ev_possible_charge_values)
if rate > 0.0
),
key=lambda item: item[0],
)
if not positive_rates:
return schedule
max_stored_wh = (
ev.max_charge_power_w
* self.slot_duration_h
* ev.charging_efficiency
)
remaining_wh = required_stored_wh
for slot in candidates:
required_rate = remaining_wh / max(max_stored_wh, 1e-9)
rate, rate_index = next(
(item for item in positive_rates if item[0] >= required_rate),
positive_rates[-1],
)
schedule[slot] = rate_index
remaining_wh -= max_stored_wh * rate
if remaining_wh <= 1e-9:
break
return schedule
def _heuristic_appliance_genes(self) -> list[int]:
"""Choose low-opportunity-cost starts for flexible appliances."""
if self.appliance_layout.n_genes == 0:
return []
prices = np.asarray(self.simulation.elect_price_hourly, dtype=float)
feed_in = np.asarray(self.simulation.elect_revenue_per_hour_arr, dtype=float)
pv = np.asarray(self.simulation.pv_prediction_wh, dtype=float)
load = np.asarray(self.simulation.load_energy_array, dtype=float)
genes: list[int] = []
for gene in self.appliance_layout.genes:
def opportunity_cost(position: int) -> float:
slot = gene.allowed_start_slots[position]
return float(feed_in[slot] if pv[slot] > load[slot] else prices[slot])
genes.append(min(range(len(gene.allowed_start_slots)), key=opportunity_cost))
return genes
def _educated_guess_individuals(self) -> list[list[int]]:
"""Create diverse domain-informed candidates for the initial population."""
slots = self.total_slots
start_slot = self._start_day_slot()
len_bat = len(self.bat_possible_charge_values)
idle_state = 0
discharge_state = len_bat
ac_charge_state = 3 * len_bat - 1
dc_allowed_state = 3 * len_bat + 1
export_state = 3 * len_bat + (2 if self.optimize_dc_charge else 0)
prices = np.asarray(self.simulation.elect_price_hourly, dtype=float)
feed_in = np.asarray(self.simulation.elect_revenue_per_hour_arr, dtype=float)
pv = np.asarray(self.simulation.pv_prediction_wh, dtype=float)
load = np.asarray(self.simulation.load_energy_array, dtype=float)
future = slice(start_slot, slots)
future_prices = prices[future]
future_feed_in = feed_in[future]
high_import_price = float(np.quantile(future_prices, 0.70))
low_import_price = float(np.quantile(future_prices, 0.25))
ev_price = self._heuristic_ev_schedule(prefer_pv=False)
ev_pv = self._heuristic_ev_schedule(prefer_pv=True)
appliance_genes = self._heuristic_appliance_genes()
def compose(battery_genes: list[int], ev_genes: list[int]) -> list[int]:
individual = list(battery_genes)
if self.optimize_ev:
individual.extend(ev_genes)
individual.extend(appliance_genes)
return individual
guesses: list[list[int]] = []
# Baseline and self-consumption candidates are useful even without
# direct marketing and anchor the population with feasible schedules.
guesses.append(compose([idle_state] * slots, ev_price))
self_consumption = [idle_state] * slots
for slot in range(start_slot, slots):
if self.optimize_dc_charge and pv[slot] > load[slot]:
self_consumption[slot] = dc_allowed_state
elif prices[slot] >= high_import_price and load[slot] > pv[slot]:
self_consumption[slot] = discharge_state
guesses.append(compose(self_consumption, ev_pv))
# Direct marketing candidates export only in the relatively expensive
# feed-in slots. At low tariffs PV is preferentially stored instead.
if self.optimize_battery_grid_export and future_feed_in.size:
feed_spread = float(np.ptp(future_feed_in))
for quantile in self.EDUCATED_GUESS_EXPORT_QUANTILES:
export_threshold = float(np.quantile(future_feed_in, quantile))
direct_marketing = [idle_state] * slots
for slot in range(start_slot, slots):
high_feed_in = (
feed_spread > 1e-12
and feed_in[slot] > 0.0
and feed_in[slot] >= export_threshold
)
if high_feed_in:
direct_marketing[slot] = export_state
elif self.optimize_dc_charge and pv[slot] > load[slot]:
direct_marketing[slot] = dc_allowed_state
elif prices[slot] >= high_import_price and load[slot] > pv[slot]:
direct_marketing[slot] = discharge_state
guesses.append(compose(direct_marketing, ev_pv))
inverter = self.simulation.inverter
if inverter is not None and (
inverter.max_ac_charge_power_w is None or inverter.max_ac_charge_power_w > 0
):
price_arbitrage = [idle_state] * slots
for slot in range(start_slot, slots):
if prices[slot] <= low_import_price:
price_arbitrage[slot] = ac_charge_state
elif prices[slot] >= high_import_price:
price_arbitrage[slot] = discharge_state
guesses.append(compose(price_arbitrage, ev_price))
unique: dict[tuple[int, ...], list[int]] = {}
for guess in guesses:
unique.setdefault(tuple(guess), guess)
return list(unique.values())
def _mutated_warm_start_neighbors(
self,
start_solution: list[float],
count: int,
) -> list[list[int]]:
"""Create unique local variants while preserving already elapsed slots."""
original = [int(value) for value in start_solution]
start_slot = self._start_day_slot()
seen = {tuple(original)}
neighbors: list[list[int]] = []
for _ in range(max(count * 10, 1)):
neighbor = creator.Individual(original)
self.mutate(neighbor)
neighbor[:start_slot] = original[:start_slot]
if self.optimize_ev:
ev_start = self.total_slots
neighbor[ev_start : ev_start + start_slot] = original[
ev_start : ev_start + start_slot
]
key = tuple(int(value) for value in neighbor)
if key in seen:
continue
seen.add(key)
neighbors.append(list(key))
if len(neighbors) >= count:
break
return neighbors
def setup_deap_environment(self, opti_param: dict[str, Any], start_hour: int) -> None: def setup_deap_environment(self, opti_param: dict[str, Any], start_hour: int) -> None:
"""Set up the DEAP environment with fitness and individual creation rules.""" """Set up the DEAP environment with fitness and individual creation rules."""
self.opti_param = opti_param self.opti_param = opti_param
@@ -1267,46 +1515,14 @@ class GeneticOptimization(OptimizationBase):
""" """
try: try:
simulation_result = self.evaluate_inner(individual) simulation_result = self.evaluate_inner(individual)
except Exception as e: if self._repair_ev_charge_at_full_soc(individual, simulation_result):
simulation_result = self.evaluate_inner(individual)
except Exception:
# Return bad fitness score ("FitnessMin") in case of an exception # Return bad fitness score ("FitnessMin") in case of an exception
return (100000.0,) return (100000.0,)
gesamtbilanz = simulation_result["Gesamtbilanz_Euro"] * (-1.0 if worst_case else 1.0) gesamtbilanz = simulation_result["Gesamtbilanz_Euro"] * (-1.0 if worst_case else 1.0)
# EV 100% & charge not allowed
if self.optimize_ev:
discharge_hours_bin, eautocharge_hours_index, appliance_gene_values = (
self.split_individual(individual)
)
eauto_soc_per_hour = np.array(
simulation_result.get("EAuto_SoC_pro_Stunde", [])
) # Beispielkey
if eauto_soc_per_hour is None or eautocharge_hours_index is None:
raise ValueError("eauto_soc_per_hour or eautocharge_hours_index is None")
min_length = min(eauto_soc_per_hour.size, eautocharge_hours_index.size)
eauto_soc_per_hour_tail = eauto_soc_per_hour[-min_length:]
eautocharge_hours_index_tail = eautocharge_hours_index[-min_length:]
# Mask
invalid_charge_mask = (eauto_soc_per_hour_tail == 100) & (
eautocharge_hours_index_tail > 0
)
if np.any(invalid_charge_mask):
invalid_indices = np.where(invalid_charge_mask)[0]
if len(invalid_indices) > 1:
eautocharge_hours_index_tail[invalid_indices] = 0
eautocharge_hours_index[-min_length:] = eautocharge_hours_index_tail.tolist()
adjusted_individual = self.merge_individual(
discharge_hours_bin, eautocharge_hours_index, appliance_gene_values
)
individual[:] = adjusted_individual
# New check: Activate discharge when battery SoC is 0 # New check: Activate discharge when battery SoC is 0
# battery_soc_per_hour = np.array( # battery_soc_per_hour = np.array(
# o.get("akku_soc_pro_stunde", []) # o.get("akku_soc_pro_stunde", [])
@@ -1531,8 +1747,25 @@ class GeneticOptimization(OptimizationBase):
"appliance layout." "appliance layout."
) )
else: else:
for _ in range(10): for _ in range(self.WARM_START_COPIES):
population.insert(0, creator.Individual(start_solution)) population.insert(0, creator.Individual(start_solution))
warm_neighbors = self._mutated_warm_start_neighbors(
start_solution,
self.WARM_START_MUTATIONS,
)
population.extend(creator.Individual(neighbor) for neighbor in warm_neighbors)
logger.info(
"Seeded population with {} exact and {} mutated warm-start solutions.",
self.WARM_START_COPIES,
len(warm_neighbors),
)
educated_guesses = self._educated_guess_individuals()
population.extend(creator.Individual(guess) for guess in educated_guesses)
logger.info(
"Seeded population with {} educated-guess solutions.",
len(educated_guesses),
)
# Run the evolutionary algorithm # Run the evolutionary algorithm
pop, log = algorithms.eaMuPlusLambda( pop, log = algorithms.eaMuPlusLambda(
+113
View File
@@ -0,0 +1,113 @@
from types import SimpleNamespace
from unittest.mock import patch
import numpy as np
import pytest
from deap import creator
from akkudoktoreos.config.config import ConfigEOS
from akkudoktoreos.core.coreabc import get_ems
from akkudoktoreos.optimization.genetic.genetic import GeneticOptimization
from akkudoktoreos.utils.datetimeutil import to_datetime
def _configure_hourly_grid(config_eos: ConfigEOS, *, start_hour: int = 0) -> None:
config_eos.merge_settings_from_dict(
{
"prediction": {"hours": 48},
"optimization": {"horizon_hours": 48, "interval": 3600},
}
)
get_ems(init=True).set_start_datetime(to_datetime().set(hour=start_hour, minute=0))
def test_ev_repair_is_resimulated_before_fitness_assignment(config_eos: ConfigEOS):
_configure_hourly_grid(config_eos)
opt = GeneticOptimization(fixed_seed=42)
opt.optimize_ev = True
opt.ev_possible_charge_values = [0.0, 1.0]
opt.setup_deap_environment({"home_appliance": 0}, start_hour=0)
individual = creator.Individual([0] * opt.total_slots + [1] * opt.total_slots)
first_result = {
"Gesamtbilanz_Euro": 10.0,
"Gesamt_Verluste": 0.0,
"EAuto_SoC_pro_Stunde": np.full(opt.total_slots, 100.0),
}
repaired_result = {
"Gesamtbilanz_Euro": 1.0,
"Gesamt_Verluste": 0.0,
"EAuto_SoC_pro_Stunde": np.full(opt.total_slots, 100.0),
}
parameters = SimpleNamespace(
ems=SimpleNamespace(preis_euro_pro_wh_akku=0.0),
eauto=None,
)
with patch.object(opt, "evaluate_inner", side_effect=[first_result, repaired_result]) as evaluate:
fitness = opt.evaluate(individual, parameters, start_hour=0, worst_case=False) # type: ignore[arg-type]
assert evaluate.call_count == 2
assert fitness == pytest.approx((1.0,))
assert individual[opt.total_slots :] == [0] * opt.total_slots
def test_mutated_warm_start_neighbors_keep_elapsed_slots(config_eos: ConfigEOS):
_configure_hourly_grid(config_eos, start_hour=10)
opt = GeneticOptimization(fixed_seed=42)
opt.optimize_ev = False
opt.setup_deap_environment({"home_appliance": 0}, start_hour=10)
start_solution = [0] * opt.total_slots
neighbors = opt._mutated_warm_start_neighbors(start_solution, count=5)
assert len(neighbors) == 5
assert len({tuple(neighbor) for neighbor in neighbors}) == 5
assert all(neighbor[:10] == start_solution[:10] for neighbor in neighbors)
assert all(neighbor != start_solution for neighbor in neighbors)
def test_educated_guesses_encode_high_price_direct_marketing(config_eos: ConfigEOS):
_configure_hourly_grid(config_eos)
opt = GeneticOptimization(fixed_seed=42)
opt.optimize_ev = False
opt.optimize_dc_charge = True
opt.optimize_battery_grid_export = True
opt.bat_possible_charge_values = [1.0]
opt.setup_deap_environment({"home_appliance": 0}, start_hour=0)
slots = opt.total_slots
opt.simulation.elect_price_hourly = np.linspace(0.0001, 0.0004, slots)
opt.simulation.elect_revenue_per_hour_arr = np.linspace(0.00001, 0.0003, slots)
opt.simulation.pv_prediction_wh = np.full(slots, 1000.0)
opt.simulation.load_energy_array = np.full(slots, 500.0)
guesses = opt._educated_guess_individuals()
dc_allowed_state = 4
export_state = 5
assert len(guesses) >= 4
assert all(len(guess) == slots for guess in guesses)
assert any(guess[0] == dc_allowed_state for guess in guesses)
assert any(guess[-1] == export_state for guess in guesses)
def test_flat_feed_in_tariff_does_not_seed_direct_marketing(config_eos: ConfigEOS):
_configure_hourly_grid(config_eos)
opt = GeneticOptimization(fixed_seed=42)
opt.optimize_ev = False
opt.optimize_dc_charge = True
opt.optimize_battery_grid_export = True
opt.bat_possible_charge_values = [1.0]
opt.setup_deap_environment({"home_appliance": 0}, start_hour=0)
slots = opt.total_slots
opt.simulation.elect_price_hourly = np.linspace(0.0001, 0.0004, slots)
opt.simulation.elect_revenue_per_hour_arr = np.full(slots, 0.00005)
opt.simulation.pv_prediction_wh = np.full(slots, 1000.0)
opt.simulation.load_energy_array = np.full(slots, 500.0)
guesses = opt._educated_guess_individuals()
export_state = 5
assert all(export_state not in guess for guess in guesses)
+5 -1
View File
@@ -1,4 +1,5 @@
import json import json
from datetime import datetime
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
from unittest.mock import patch from unittest.mock import patch
@@ -32,6 +33,9 @@ def compare_dict(actual: dict[str, Any], expected: dict[str, Any]):
compare_dict(actual[key], value) compare_dict(actual[key], value)
elif isinstance(value, list): elif isinstance(value, list):
assert isinstance(actual[key], list) assert isinstance(actual[key], list)
if value and isinstance(value[0], datetime):
assert actual[key] == value
else:
assert actual[key] == pytest.approx(value) assert actual[key] == pytest.approx(value)
else: else:
assert actual[key] == pytest.approx(value) assert actual[key] == pytest.approx(value)
@@ -149,7 +153,7 @@ def test_optimize(
pass pass
# Fake energy management run start datetime # Fake energy management run start datetime
ems_eos.set_start_datetime(to_datetime().set(hour=fixed_start_hour)) ems_eos.set_start_datetime(to_datetime("2025-01-15T10:00:00+01:00"))
# Throw away any cached results of the last energy management run. # Throw away any cached results of the last energy management run.
CacheEnergyManagementStore().clear() CacheEnergyManagementStore().clear()
+13 -11
View File
@@ -145,7 +145,7 @@
1, 1,
0, 0,
0, 0,
1, 0,
1, 1,
0 0
], ],
@@ -272,10 +272,10 @@
0.0, 0.0,
0.0 0.0
], ],
"Gesamt_Verluste": 3425.4668727209255, "Gesamt_Verluste": 3290.8745999936527,
"Gesamtbilanz_Euro": 0.9585224311392879, "Gesamtbilanz_Euro": 1.251565700139288,
"Gesamteinnahmen_Euro": 1.1316277804018695, "Gesamteinnahmen_Euro": 1.1316277804018695,
"Gesamtkosten_Euro": 2.0901502115411574, "Gesamtkosten_Euro": 2.3831934805411574,
"Home_appliance_wh_per_hour": [ "Home_appliance_wh_per_hour": [
0.0, 0.0,
0.0, 0.0,
@@ -316,6 +316,7 @@
0.0, 0.0,
0.0 0.0
], ],
"home_appliance_energy_wh": {},
"Kosten_Euro_pro_Stunde": [ "Kosten_Euro_pro_Stunde": [
0.0, 0.0,
0.0, 0.0,
@@ -352,7 +353,7 @@
0.0, 0.0,
0.17784012884918773, 0.17784012884918773,
0.19011028252189552, 0.19011028252189552,
0.0, 0.293043269,
0.0, 0.0,
0.16484566 0.16484566
], ],
@@ -392,7 +393,7 @@
0.0, 0.0,
556.6201215937018, 556.6201215937018,
617.0408390843736, 617.0408390843736,
0.0, 987.01,
0.0, 0.0,
592.97 592.97
], ],
@@ -472,7 +473,7 @@
81.2380484620021, 81.2380484620021,
0.0, 0.0,
0.0, 0.0,
134.59227272727276, 0.0,
100.08954545454549, 100.08954545454549,
0.0 0.0
], ],
@@ -513,8 +514,8 @@
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
95.75150654269973, 100.0,
92.59211432506888 96.84060778236915
], ],
"Electricity_price": [ "Electricity_price": [
0.000228, 0.000228,
@@ -753,9 +754,10 @@
1.0, 1.0,
2.0, 2.0,
2.0, 2.0,
1.0, 0.0,
1.0, 1.0,
0.0 0.0
], ],
"washingstart": null "washingstart": null,
"appliance_starts": {}
} }
+149 -147
View File
@@ -14,13 +14,6 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.0,
1.0,
0.0,
1.0,
1.0,
0.0,
1.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -41,7 +34,14 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.0, 0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -110,9 +110,7 @@
0, 0,
0, 0,
0, 0,
1, 0,
1,
1,
0, 0,
0, 0,
0, 0,
@@ -122,17 +120,25 @@
0, 0,
0, 0,
1, 1,
1,
0,
0, 0,
0, 0,
1, 1,
1, 1,
1, 1,
1, 1,
1,
1,
1,
1,
0,
0,
0,
0,
0,
0, 0,
0, 0,
1,
1,
1,
0, 0,
0, 0,
0, 0,
@@ -140,14 +146,8 @@
1, 1,
1, 1,
0, 0,
1,
0, 0,
0, 0
0,
0,
0,
1,
1
], ],
"battery_grid_export_allowed": [], "battery_grid_export_allowed": [],
"eautocharge_hours_float": null, "eautocharge_hours_float": null,
@@ -157,7 +157,7 @@
1063.91, 1063.91,
1320.56, 1320.56,
1132.03, 1132.03,
1308.5200000000004, 1163.67,
1176.82, 1176.82,
1216.22, 1216.22,
1103.78, 1103.78,
@@ -237,13 +237,11 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.022582049506752234,
0.21077535122459587, 0.3039575,
0.19320652266312205, 0.19320652266312205,
0.1358062627100041, 0.1358062627100041,
0.0692592282596561, 0.0692592282596561,
0.023370695807696434,
0.0019327051509204403,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -262,20 +260,22 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.24478962017661132, 0.0,
0.15146384621553569, 0.0013652045768039896,
0.2577971476677123,
0.15236390731688437,
0.10316291465819699, 0.10316291465819699,
0.05435777788576338, 0.05435777788576338,
0.020928608511559126, 0.0,
0.003524558735906156, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0 0.0
], ],
"Gesamt_Verluste": 3110.842855499046, "Gesamt_Verluste": 2758.4157389677953,
"Gesamtbilanz_Euro": 1.1850381627731374, "Gesamtbilanz_Euro": 1.2690402398027016,
"Gesamteinnahmen_Euro": 1.2125780919995675, "Gesamteinnahmen_Euro": 1.2938585152448954,
"Gesamtkosten_Euro": 2.397616254772705, "Gesamtkosten_Euro": 2.562898755047597,
"Home_appliance_wh_per_hour": [ "Home_appliance_wh_per_hour": [
0.0, 0.0,
0.0, 0.0,
@@ -316,98 +316,97 @@
0.0, 0.0,
0.0 0.0
], ],
"home_appliance_energy_wh": {},
"Kosten_Euro_pro_Stunde": [ "Kosten_Euro_pro_Stunde": [
0.0, 0.10013413727316416,
0.0, 0.09007999454232955,
0.0, 0.11436917344552285,
0.07557452231671152, 0.07557452231671152,
0.026623430000000066, 0.0,
4.55656845588237e-17, 4.55656845588237e-17,
0.001414013162203277, 0.001414013162203277,
0.005881449073870462, 0.005881449073870462,
0.05258762370598476, 0.05258762370598476,
0.1614775630079859,
0.2338232746714084,
0.0, 0.0,
0.0,
0.29116746986009023,
0.26650619799999997, 0.26650619799999997,
0.19588158, 0.19588158,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.182970359,
0.162995926,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0,
0.25364873699864443,
0.1306329312971816, 0.1306329312971816,
0.07362195915902499, 0.07362195915902499,
0.060401289430882174, 0.060401289430882174,
0.009619897970888898, 0.009619897970888898,
0.0, 0.07029121023060134,
0.0, 4.179128154646605e-17,
2.3325608707865465e-05, 2.3325608707865465e-05,
0.0, 0.0021886029750169123,
0.013012984677295973, 0.013012984677295973,
0.08357424731947552, 0.08357424731947552,
0.17784012884918773,
0.19011028252189552,
0.293043269,
0.0, 0.0,
0.0 0.0,
0.293043269,
0.214398479,
0.16484566
], ],
"Netzbezug_Wh_pro_Stunde": [ "Netzbezug_Wh_pro_Stunde": [
0.0, 439.1848126015972,
0.0, 407.23324838304495,
0.0, 546.436566868241,
402.20607938643707, 402.20607938643707,
144.85000000000036, 0.0,
2.2737367544323206e-13, 2.2737367544323206e-13,
6.433180901743754, 6.433180901743754,
25.909467285772962, 25.909467285772962,
175.4675465665157, 175.4675465665157,
505.40708296709204,
758.9200735845777,
0.0, 0.0,
0.0,
980.6920507244535,
912.38, 912.38,
704.61, 704.61,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
556.31,
488.89,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0,
833.8222781020527,
537.58407941227, 537.58407941227,
322.9033296448464, 322.9033296448464,
273.0618871197205, 273.0618871197205,
45.96224544141853, 45.96224544141853,
0.0, 374.088399311343,
0.0, 2.2737367544323206e-13,
0.11639525303326081, 0.11639525303326081,
0.0, 9.957247384062384,
57.32592368852852, 57.32592368852852,
278.85968408233407, 278.85968408233407,
556.6201215937018,
617.0408390843736,
987.01,
0.0, 0.0,
0.0 0.0,
987.01,
733.99,
592.97
], ],
"Netzeinspeisung_Wh_pro_Stunde": [ "Netzeinspeisung_Wh_pro_Stunde": [
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 322.60070723931767,
3011.0764460656555, 4342.25,
2760.093180901744, 2760.093180901744,
1940.089467285773, 1940.089467285773,
989.4175465665157, 989.4175465665157,
333.86708296709196,
27.61007358457772,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -426,95 +425,97 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
3496.9945739515906, 0.0,
2163.76923165051, 19.502922525771282,
3682.816395253033,
2176.6272473840627,
1473.7559236885286, 1473.7559236885286,
776.5396840823341, 776.5396840823341,
298.9801215937018, 0.0,
50.35083908437366, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0 0.0
], ],
"Verluste_Pro_Stunde": [ "Verluste_Pro_Stunde": [
97.85621559422765, 37.96737751219166,
101.92059640365329, 46.38878980596536,
114.42806532440363, 39.91398802418894,
51.82392952637247, 51.82392952637247,
599.9999999999995, 543.9059151312817,
159.7408264721214,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 108.98319763338179,
133.7321802766326, 106.80230977350088,
0.0014460869344160802,
0.0, 0.0,
0.0, 0.0,
70.41409090909087, 70.41409090909087,
118.37045454545455, 118.37045454545455,
94.68272727272722, 94.68272727272722,
83.01681818181817, 83.01681818181817,
0.0, 75.86045454545456,
0.0, 66.66681818181814,
69.12409090909085, 69.12409090909085,
109.07302361034766, 109.07302361034766,
116.99491129525349, 3.2918733722463145,
22.312089529472388, 22.312089529472388,
54.18759955738153, 54.18759955738153,
86.6234264543665, 86.6234264543665,
165.15986945297027, 165.15986945297027,
116.9350623689079, 65.92300791736113,
538.2984000000001, 535.9580492969076,
22.298618556173096,
2.900768349489402,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
111.78035844493081,
90.18403329253945,
0.0, 0.0,
100.08954545454549, 0.0,
80.85954545454547 0.0
], ],
"akku_soc_pro_stunde": [ "akku_soc_pro_stunde": [
80.0, 80.0,
79.16421888032488, 81.05464937533866,
78.69989843940196, 82.3432268699488,
77.45653455559739, 83.45194875950959,
78.89608815355218, 84.8915023574644,
95.56275482021886,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 98.93741213017658,
95.77874174137638, 95.76274429012544,
95.77874174137638, 95.76278445920696,
95.77874174137638, 95.76278445920696,
93.5560747303571, 95.76278445920696,
89.81963361465462, 93.54011744818767,
86.83091116286398, 89.80367633248518,
84.21043079096314, 86.81495388069455,
84.21043079096314, 84.19447350879372,
84.21043079096314, 81.79988845369729,
82.02848347691355, 79.69550656664495,
78.58559323596526, 77.51355925259536,
75.08792311742263, 74.07066901164707,
75.7077033821302, 74.16210993865391,
77.21291448094635, 74.78189020336148,
79.61912077134542, 76.28710130217763,
84.20689492281682, 78.6933075925767,
84.42786059566187, 83.2810817440481,
99.38059392899518, 85.11227640841923,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 98.60068046043587,
100.0, 96.11252124341868,
96.84060778236915 96.11252124341868,
96.11252124341868
], ],
"Electricity_price": [ "Electricity_price": [
0.000228, 0.000228,
@@ -708,39 +709,21 @@
"initial_soc_percentage": 54 "initial_soc_percentage": 54
}, },
"start_solution": [ "start_solution": [
1.0,
1.0,
0.0,
1.0,
1.0,
2.0,
2.0,
1.0,
1.0,
0.0,
1.0,
1.0,
1.0,
0.0,
2.0,
2.0,
0.0,
2.0,
2.0,
0.0,
2.0,
1.0,
0.0, 0.0,
0.0, 0.0,
1.0,
1.0,
1.0,
1.0,
0.0, 0.0,
0.0, 0.0,
1.0, 0.0,
1.0, 0.0,
1.0, 0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -748,14 +731,33 @@
1.0, 1.0,
1.0, 1.0,
0.0, 0.0,
0.0,
0.0,
1.0, 1.0,
2.0, 1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.0, 1.0,
1.0 1.0,
0.0,
0.0,
0.0
], ],
"washingstart": null "washingstart": null,
"appliance_starts": {}
} }
+352 -352
View File
@@ -10,17 +10,9 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.0,
0.0, 0.0,
0.0, 0.0,
1.0, 0.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
0.0, 0.0,
1.0, 1.0,
0.0, 0.0,
@@ -28,16 +20,9 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.0,
1.0,
0.0, 0.0,
1.0, 1.0,
0.0, 0.0,
1.0,
0.0,
1.0,
1.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -47,6 +32,21 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1.0,
0.0,
0.0 0.0
], ],
"dc_charge": [ "dc_charge": [
@@ -112,19 +112,14 @@
0, 0,
0, 0,
1, 1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0, 0,
0, 0,
0, 0,
1, 1,
0,
1,
1,
0,
1, 1,
0, 0,
0, 0,
@@ -132,17 +127,22 @@
0, 0,
1, 1,
0, 0,
1,
1,
0, 0,
0, 0,
1, 1,
0, 0,
0, 0,
1,
0, 0,
0, 0,
1, 1,
1, 1,
0,
1, 1,
1, 1,
0,
1, 1,
1, 1,
0, 0,
@@ -161,15 +161,15 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.875,
0.75,
0.0,
0.375,
1.0, 1.0,
0.5,
0.625,
0.375,
0.75, 0.75,
0.75,
0.375,
0.875, 0.875,
0.75, 0.1,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -202,28 +202,28 @@
], ],
"result": { "result": {
"Last_Wh_pro_Stunde": [ "Last_Wh_pro_Stunde": [
15230.07, 11541.07,
8929.91, 6307.91,
1320.56, 7875.5599999999995,
10061.61912107894, 5065.03,
13077.21553917656, 13622.08822093064,
9042.82, 9042.82,
10393.22, 7649.22,
8969.78, 12780.779999999999,
1129.12, 2177.92,
1178.71, 1178.71,
1050.98, 1050.98,
988.56, 5988.547949275546,
912.38, 912.38,
704.61, 704.61,
516.37, 516.37,
868.05, 868.05,
694.34, 694.34,
608.79, 608.79,
2056.31, 556.31,
488.89, 488.89,
506.91, 506.91,
1304.8889978824886, 804.89,
1141.98, 1141.98,
1056.97, 1056.97,
992.46, 992.46,
@@ -231,55 +231,55 @@
827.01, 827.01,
1257.98, 1257.98,
1232.67, 1232.67,
871.26, 2188.443604746967,
860.88, 860.88,
1158.03, 1158.03,
1222.72, 1222.72,
3721.04, 1221.04,
3449.99, 949.99,
987.01, 1987.01,
733.99, 733.99,
592.97 592.97
], ],
"EAuto_SoC_pro_Stunde": [ "EAuto_SoC_pro_Stunde": [
5.0, 5.0,
20.294999999999998, 22.48,
33.405, 31.22,
33.405, 42.144999999999996,
39.96, 48.699999999999996,
57.440000000000005, 61.809999999999995,
70.55, 74.92,
85.845, 81.475,
98.955, 96.77,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955, 98.518,
98.955 98.518
], ],
"Einnahmen_Euro_pro_Stunde": [ "Einnahmen_Euro_pro_Stunde": [
0.0, 0.0,
@@ -288,12 +288,6 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
9.722458428505041e-05,
0.0023429436853348124,
0.0692592282596561,
0.023370695807696434,
0.0019327051509204403,
8.435507117427132e-07,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -307,52 +301,31 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.03692581803776506, 0.0,
0.09634325718089931, 0.0,
0.038455087951794004, 0.0,
0.31400739999999994, 0.0,
0.2577866264025879, 0.0,
0.15146384621553569, 0.0,
0.09798107754792196, 0.0,
0.029150936607659956, 0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0 0.0
], ],
"Gesamt_Verluste": 6850.393259430652, "Gesamt_Verluste": 9279.931765999105,
"Gesamtbilanz_Euro": 13.198417631718888, "Gesamtbilanz_Euro": 12.822538076242544,
"Gesamteinnahmen_Euro": 1.1191176909827683, "Gesamteinnahmen_Euro": 0.0,
"Gesamtkosten_Euro": 14.317535322701657, "Gesamtkosten_Euro": 12.822538076242544,
"Home_appliance_wh_per_hour": [ "Home_appliance_wh_per_hour": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -363,37 +336,37 @@
2500.0, 2500.0,
0.0, 0.0,
0.0, 0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0 0.0
], ],
"home_appliance_energy_wh": { "home_appliance_energy_wh": {
"dishwasher1": [ "dishwasher1": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -404,86 +377,113 @@
2500.0, 2500.0,
0.0, 0.0,
0.0, 0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0 0.0
] ]
}, },
"Kosten_Euro_pro_Stunde": [ "Kosten_Euro_pro_Stunde": [
3.26035212, 2.41926012,
0.7712613792641736, 0.19137741085396395,
1.4167558060312964,
0.7340784901492668,
1.4723942300000001,
0.0,
0.8450811735885355,
1.2197241405944232,
0.0, 0.0,
1.672937586,
1.342948866431813,
0.770122611209644,
1.4257539978642364,
1.3586609716653002,
0.05258762370598476,
0.1614775630079859, 0.1614775630079859,
0.2338232746714084, 0.0,
0.29116746986009023, 1.7756638919999999,
0.26650619799999997, 0.26650619799999997,
0.19588158, 0.19588158,
0.0, 0.174739608,
0.0, 0.0,
0.22802125600000003, 0.22802125600000003,
0.199865757,
0.676320359,
0.162995926,
0.0, 0.0,
0.42921344809282075, 0.0,
0.162995926,
0.16677339,
0.0,
0.25364873699864443, 0.25364873699864443,
0.1306329312971816, 0.1306329312971816,
0.0, 0.0,
0.060401289430882174, 0.060401289430882174,
0.009619897970888898, 0.009619897970888898,
0.07029121023060134,
4.179128154646605e-17,
0.0, 0.0,
0.0, 0.0,
0.26398692,
0.0, 0.0,
0.0, 0.0,
0.08357424731947552,
0.0, 0.0,
0.0, 0.0,
0.293043269, 0.589943269,
0.0, 0.0,
0.0 0.0
], ],
"Netzbezug_Wh_pro_Stunde": [ "Netzbezug_Wh_pro_Stunde": [
14299.789999999999, 10610.789999999999,
3486.7150961309835, 865.1781684175585,
6769.01961792306,
3906.7508789210588,
8010.85,
0.0,
3844.7733102299158,
5373.234099534904,
0.0, 0.0,
8903.34,
7306.577075254695,
3842.9272016449304,
6486.596896561585,
5985.290624076212,
175.4675465665157,
505.40708296709204, 505.40708296709204,
758.9200735845777, 0.0,
980.6920507244535, 5980.679999999999,
912.38, 912.38,
704.61, 704.61,
0.0, 516.37,
0.0, 0.0,
694.34, 694.34,
608.79,
2056.31,
488.89,
0.0, 0.0,
1299.8590190576037, 0.0,
488.89,
506.91,
0.0,
833.8222781020527, 833.8222781020527,
537.58407941227, 537.58407941227,
0.0, 0.0,
273.0618871197205, 273.0618871197205,
45.96224544141853, 45.96224544141853,
374.088399311343,
2.2737367544323206e-13,
0.0, 0.0,
0.0, 0.0,
1317.3000000000002,
0.0, 0.0,
0.0, 0.0,
278.85968408233407,
0.0, 0.0,
0.0, 0.0,
987.01, 1987.01,
0.0, 0.0,
0.0 0.0
], ],
@@ -494,12 +494,6 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.3889226326435775,
33.47062407621161,
989.4175465665157,
333.86708296709196,
27.61007358457772,
0.012050724453467332,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -513,14 +507,20 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
527.5116862537866, 0.0,
1376.3322454414188, 0.0,
549.358399311343, 0.0,
4485.82, 0.0,
3682.6660914655417, 0.0,
2163.76923165051, 0.0,
1399.729679256028, 0.0,
416.4419515379994, 0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -528,84 +528,84 @@
0.0 0.0
], ],
"Verluste_Pro_Stunde": [ "Verluste_Pro_Stunde": [
1083.0, 552.0,
1014.0066115357181, 876.0621802101069,
114.42806532440363, 345.0239541507672,
806.9999999999999, 207.4093054705271,
752.8472490305633, 1013.9999999999998,
452.3012641973916, 976.3367916944278,
490.424156871473, 226.85199722758986,
414.0, 1084.2496919441885,
190.65093859054008,
40.06404995605101,
106.80230977350088,
600.0000000000001,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0,
0.0,
0.0,
70.41409090909087,
118.37045454545455, 118.37045454545455,
0.0, 0.0,
83.01681818181817,
75.86045454545456,
0.0, 0.0,
180.0,
0.0, 0.0,
69.12409090909085, 109.07302361034766,
60.00108228691243,
3.2918733722463145, 3.2918733722463145,
22.312089529472388, 22.312089529472388,
98.21987178167876, 98.21987178167876,
23.32202410391207, 86.6234264543665,
0.0, 165.15986945297027,
0.0, 116.9350623689079,
0.0, 538.2984000000001,
0.03390853445803674, 600.0000000000002,
2.900768349489402, 262.55307614755066,
16.700320743972142, 184.66788225469543,
81.2380484620021, 93.18476208988011,
377.3215838283509, 111.78035844493081,
418.18661420587983, 90.18403329253945,
0.0, 120.0,
100.08954545454549, 100.08954545454549,
80.85954545454547 80.85954545454547
], ],
"akku_soc_pro_stunde": [ "akku_soc_pro_stunde": [
80.0, 80.0,
96.66666666666667, 80.0,
77.72745638104269, 61.0623332886646,
76.48409249723811, 61.06299868174146,
93.15075916390477, 61.074368278144995,
98.72984941475377, 77.74103494481164,
99.79377342023686, 62.263433461120634,
100.0, 62.81487782855368,
100.0, 43.910197554276095,
100.0, 42.50754248385738,
100.0, 43.62043276041435,
100.0, 40.44576492036321,
100.0, 57.11243158702987,
100.0, 57.11243158702987,
100.0, 57.11243158702987,
97.77733298898072, 57.11243158702987,
94.04089187327823, 53.3759904713274,
94.04089187327823, 53.3759904713274,
94.04089187327823, 50.75551009942657,
99.04089187327823, 48.36092504433015,
99.04089187327823, 48.36092504433015,
96.85894455922863, 48.36092504433015,
98.52564128942065, 44.918034803381865,
98.6170822164275, 45.0094757303887,
99.23686248113506, 45.629255995096266,
99.35216599711354, 45.744559511074755,
100.0, 48.150765801473824,
100.0, 52.73853995294522,
100.0, 52.95950562579026,
100.0, 67.9122389591236,
100.0, 84.57890562579026,
100.0, 91.79146973129197,
100.0, 96.45723532881205,
100.0, 99.04570094241983,
88.1251455158017, 97.64638140285571,
74.92485531047642, 95.1582221858385,
74.92485531047642, 98.49155551917185,
71.76546309284556 95.332163301541
], ],
"Electricity_price": [ "Electricity_price": [
0.000228, 0.000228,
@@ -702,15 +702,15 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.875,
0.75,
0.0,
0.375,
1.0, 1.0,
0.5,
0.625,
0.375,
0.75, 0.75,
0.75,
0.375,
0.875, 0.875,
0.75, 0.1,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -795,112 +795,112 @@
"capacity_wh": 60000, "capacity_wh": 60000,
"charging_efficiency": 0.95, "charging_efficiency": 0.95,
"max_charge_power_w": 11040, "max_charge_power_w": 11040,
"soc_wh": 59373.0, "soc_wh": 59110.8,
"initial_soc_percentage": 5 "initial_soc_percentage": 5
}, },
"start_solution": [ "start_solution": [
0.0,
1.0,
2.0,
1.0,
0.0,
2.0,
0.0,
2.0,
0.0,
2.0,
0.0,
1.0,
0.0,
0.0,
2.0,
1.0,
0.0,
1.0,
1.0,
0.0,
1.0,
2.0,
0.0,
0.0,
0.0,
1.0,
0.0,
1.0,
1.0,
0.0,
0.0,
1.0,
0.0,
0.0,
1.0,
0.0,
0.0,
1.0,
1.0,
2.0, 2.0,
1.0, 1.0,
1.0, 1.0,
0.0, 0.0,
1.0, 1.0,
1.0, 1.0,
0.0,
2.0,
2.0,
1.0,
2.0, 2.0,
1.0, 1.0,
1.0, 1.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
0.0,
2.0,
0.0,
1.0,
1.0,
0.0,
0.0,
2.0,
2.0,
1.0,
2.0,
0.0,
2.0,
1.0,
2.0,
2.0,
0.0,
0.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
0.0,
1.0,
1.0,
4.0,
0.0,
5.0,
4.0,
1.0,
3.0,
6.0, 6.0,
5.0, 5.0,
3.0,
0.0,
5.0,
4.0, 4.0,
0.0, 3.0,
1.0,
6.0, 6.0,
4.0,
5.0,
4.0,
1.0,
3.0,
3.0,
2.0,
3.0,
0.0,
1.0,
3.0,
4.0,
5.0,
1.0,
3.0,
0.0,
2.0,
2.0,
5.0,
5.0, 5.0,
5.0, 5.0,
6.0, 6.0,
1.0, 1.0,
5.0,
5.0,
0.0,
0.0,
0.0, 0.0,
6.0,
2.0,
3.0,
1.0,
4.0,
4.0,
1.0,
5.0, 5.0,
3.0, 3.0,
5.0,
2.0, 2.0,
0.0, 0.0,
33.0 6.0,
5.0,
6.0,
2.0,
5.0,
2.0,
5.0,
4.0,
4.0,
6.0,
5.0,
6.0,
2.0,
0.0,
4.0,
6.0,
1.0,
2.0,
1.0,
3.0,
1.0,
0.0,
4.0,
4.0,
5.0,
5.0,
1.0,
6.0
], ],
"washingstart": 43, "washingstart": 16,
"appliance_starts": { "appliance_starts": {
"dishwasher1": [ "dishwasher1": [
"2026-07-16 19:00:00+02:00" "2025-01-15 16:00:00+01:00"
] ]
} }
} }
+245 -245
View File
@@ -10,19 +10,23 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.0,
1.0,
1.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.0, 1.0,
1.0,
0.0,
1.0,
1.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.0, 1.0,
1.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -32,11 +36,7 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 1.0,
0.0,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -111,11 +111,7 @@
0, 0,
0, 0,
0, 0,
0,
0,
1, 1,
1,
0,
0, 0,
0, 0,
0, 0,
@@ -127,12 +123,10 @@
0, 0,
1, 1,
0, 0,
1,
1,
0, 0,
1, 1,
1, 0,
1, 0,
1, 1,
1, 1,
0, 0,
@@ -141,6 +135,12 @@
0, 0,
0, 0,
1, 1,
0,
0,
1,
1,
1,
1,
1, 1,
1, 1,
1, 1,
@@ -161,17 +161,17 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.875,
0.0,
1.0, 1.0,
0.0, 0.75,
0.625,
0.375, 0.375,
0.375, 0.75,
1.0,
0.0,
0.75, 0.75,
0.375, 0.375,
0.6, 0.8,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -202,22 +202,22 @@
], ],
"result": { "result": {
"Last_Wh_pro_Stunde": [ "Last_Wh_pro_Stunde": [
15230.07, 11541.07,
1525.2526751616956, 8929.91,
11808.56, 7875.5599999999995,
1132.03, 10061.61912107894,
7596.67, 13622.08822093064,
7609.82, 11542.82,
13190.760676868524, 12483.786689770084,
1103.78, 11482.522793459368,
8995.119999999999, 1129.12,
5111.71, 1178.71,
7343.779999999999, 1050.98,
988.56, 988.56,
5912.38, 912.38,
704.61, 704.61,
516.37, 516.37,
868.05, 2368.05,
694.34, 694.34,
608.79, 608.79,
556.31, 556.31,
@@ -228,7 +228,7 @@
1056.97, 1056.97,
992.46, 992.46,
1155.99, 1155.99,
827.01, 1189.376775455858,
1257.98, 1257.98,
1232.67, 1232.67,
871.26, 871.26,
@@ -243,43 +243,43 @@
], ],
"EAuto_SoC_pro_Stunde": [ "EAuto_SoC_pro_Stunde": [
5.0, 5.0,
20.294999999999998, 22.48,
20.294999999999998, 35.589999999999996,
37.775, 46.515,
37.775, 53.06999999999999,
44.330000000000005, 66.18,
50.885000000000005, 79.29,
68.365, 85.845,
68.365, 99.82900000000001,
81.475, 99.82900000000001,
88.03, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518, 99.82900000000001,
98.518 99.82900000000001
], ],
"Einnahmen_Euro_pro_Stunde": [ "Einnahmen_Euro_pro_Stunde": [
0.0, 0.0,
@@ -289,8 +289,10 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.10263928607047809, 0.0,
0.0002638810165675977, 0.05814763393192599,
0.023370695807696434,
0.0019327051509204403,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -308,10 +310,8 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.300304461863129,
0.0, 0.2577866264025879,
0.035969913516850464,
0.2577971476677123,
0.15146384621553569, 0.15146384621553569,
0.09798107754792196, 0.09798107754792196,
0.029150936607659956, 0.029150936607659956,
@@ -321,18 +321,18 @@
0.0, 0.0,
0.0 0.0
], ],
"Gesamt_Verluste": 7723.761220821238, "Gesamt_Verluste": 8027.369144275042,
"Gesamtbilanz_Euro": 14.859522880677414, "Gesamtbilanz_Euro": 13.979945090881573,
"Gesamteinnahmen_Euro": 0.6752660886427261, "Gesamteinnahmen_Euro": 0.9201379835273773,
"Gesamtkosten_Euro": 15.53478896932014, "Gesamtkosten_Euro": 14.90008307440895,
"Home_appliance_wh_per_hour": [ "Home_appliance_wh_per_hour": [
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
2500.0,
2500.0,
0.0, 0.0,
2500.0,
2500.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -371,9 +371,9 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
2500.0,
2500.0,
0.0, 0.0,
2500.0,
2500.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -408,36 +408,36 @@
] ]
}, },
"Kosten_Euro_pro_Stunde": [ "Kosten_Euro_pro_Stunde": [
3.26035212, 2.41926012,
0.1921289942880966, 0.7712613792641736,
2.2398909259999997, 1.4167558060312964,
1.672937586,
1.4723942300000001,
0.36290611910050846,
1.907718932,
1.9280712188270857,
0.05258762370598476,
0.1614775630079859,
0.2338232746714084,
0.0, 0.0,
0.0, 0.26650619799999997,
0.5064650351737862,
2.0366107701900296,
0.005881449073870462,
2.11462917272379,
0.0,
2.1641282909999995,
0.29116746986009023,
1.727006198,
0.19588158, 0.19588158,
0.174739608,
0.0, 0.0,
0.78571899,
0.22802125600000003, 0.22802125600000003,
0.0, 0.0,
0.0, 0.0,
0.162995926, 0.162995926,
0.16677339,
0.0, 0.0,
0.0, 0.25364873699864443,
0.0, 0.1306329312971816,
0.0,
0.0, 0.0,
0.060401289430882174, 0.060401289430882174,
0.009619897970888898, 0.0854632640738,
0.0,
0.0,
0.0, 0.0,
4.179128154646605e-17,
2.3325608707865465e-05,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -448,36 +448,36 @@
0.16484566 0.16484566
], ],
"Netzbezug_Wh_pro_Stunde": [ "Netzbezug_Wh_pro_Stunde": [
14299.789999999999, 10610.789999999999,
868.5759235447405, 3486.7150961309835,
10701.82, 6769.01961792306,
8903.34,
8010.85,
1810.908777946649,
8679.34,
8493.70580981095,
175.4675465665157,
505.40708296709204,
758.9200735845777,
0.0, 0.0,
0.0, 912.38,
2527.2706345997312,
9265.745087306777,
25.909467285772962,
7055.819728808107,
0.0,
7024.109999999999,
980.6920507244535,
5912.38,
704.61, 704.61,
516.37,
0.0, 0.0,
2368.05,
694.34, 694.34,
0.0, 0.0,
0.0, 0.0,
488.89, 488.89,
506.91,
0.0, 0.0,
0.0, 833.8222781020527,
0.0, 537.58407941227,
0.0,
0.0, 0.0,
273.0618871197205, 273.0618871197205,
45.96224544141853, 408.3290208972767,
0.0,
0.0,
0.0, 0.0,
2.2737367544323206e-13,
0.11639525303326081,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -495,8 +495,10 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1466.2755152925442, 0.0,
3.769728808108539, 830.6804847418,
333.86708296709196,
27.61007358457772,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -514,10 +516,8 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 4290.063740901843,
0.0, 3682.6660914655417,
513.8559073835781,
3682.816395253033,
2163.76923165051, 2163.76923165051,
1399.729679256028, 1399.729679256028,
416.4419515379994, 416.4419515379994,
@@ -528,36 +528,36 @@
0.0 0.0
], ],
"Verluste_Pro_Stunde": [ "Verluste_Pro_Stunde": [
1083.0,
101.74991082536883,
552.0, 552.0,
106.67021307906845, 1014.0066115357181,
567.0367126720731, 345.0239541507672,
259.38247615196775, 806.9999999999999,
735.7686104768134, 1013.9999999999998,
56.857674239187475, 1036.459053353598,
414.0, 807.0,
766.976146106431, 683.6982971773144,
331.2000000000007, 19.04844741896588,
0.0014460869344160802,
600.0,
0.0, 0.0,
0.0, 0.0,
118.37045454545455, 133.7321802766326,
0.0,
0.0,
70.41409090909087,
180.0,
0.0, 0.0,
83.01681818181817, 83.01681818181817,
75.86045454545456, 75.86045454545456,
0.0, 0.0,
69.12409090909085, 0.0,
109.07302361034766, 109.07302361034766,
116.99491129525349, 3.2918733722463145,
95.61900944932736, 22.312089529472388,
98.21987178167876, 98.21987178167876,
86.6234264543665, 86.6234264543665,
165.15986945297027, 208.64388250767325,
116.9350623689079, 116.9350623689079,
476.63569111397055, 23.490751091778808,
0.0, 0.03390853445803674,
2.900768349489402, 2.900768349489402,
16.700320743972142, 16.700320743972142,
81.2380484620021, 81.2380484620021,
@@ -569,34 +569,34 @@
], ],
"akku_soc_pro_stunde": [ "akku_soc_pro_stunde": [
80.0, 80.0,
96.66666666666667, 80.0,
99.49305307848245, 61.06078971437601,
99.49305307848245, 61.06145510745288,
99.20134772591024, 77.72812177411956,
91.86086775366753, 94.39478844078621,
93.31593653566664, 76.07925709454777,
98.42062016002258, 92.74592376121446,
99.47087646058428,
100.0, 100.0,
100.0, 100.0,
82.33137823444534, 100.0,
82.33137823444534, 95.77874174137638,
82.33141840352684, 95.77874174137638,
98.99808507019351, 95.77874174137638,
98.99808507019351, 93.5560747303571,
98.99808507019351, 98.5560747303571,
95.26164395449102, 98.5560747303571,
95.26164395449102, 95.93559435845627,
92.6411635825902, 93.54100930335983,
90.24657852749377, 93.54100930335983,
90.24657852749377, 93.54100930335983,
88.06463121344417, 90.09811906241156,
84.6217409724959, 90.1895599894184,
81.12407085395327, 90.80934025412597,
79.4298700605846, 90.92464377010445,
79.54517357656309, 93.33085006050352,
81.95137986696216, 99.12651346349443,
86.53915401843355, 99.34747913633947,
86.76011969127859,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
@@ -702,17 +702,17 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.875,
0.0,
1.0, 1.0,
0.0, 0.75,
0.625,
0.375, 0.375,
0.375, 0.75,
1.0,
0.0,
0.75, 0.75,
0.375, 0.375,
0.6, 0.8,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -795,112 +795,112 @@
"capacity_wh": 60000, "capacity_wh": 60000,
"charging_efficiency": 0.95, "charging_efficiency": 0.95,
"max_charge_power_w": 11040, "max_charge_power_w": 11040,
"soc_wh": 59110.8, "soc_wh": 59897.4,
"initial_soc_percentage": 5 "initial_soc_percentage": 5
}, },
"start_solution": [ "start_solution": [
2.0, 2.0,
2.0,
1.0,
1.0,
0.0, 0.0,
1.0, 1.0,
2.0, 2.0,
2.0,
2.0,
0.0,
0.0,
1.0, 1.0,
2.0, 0.0,
2.0,
2.0, 2.0,
2.0, 2.0,
1.0, 1.0,
2.0, 2.0,
2.0, 2.0,
0.0,
0.0,
0.0,
1.0,
0.0,
0.0,
1.0,
2.0,
2.0, 2.0,
1.0, 1.0,
1.0, 1.0,
0.0, 0.0,
2.0,
0.0,
0.0, 0.0,
1.0, 1.0,
0.0, 0.0,
0.0, 0.0,
1.0,
0.0,
2.0, 2.0,
0.0,
0.0,
1.0,
0.0,
1.0,
1.0,
0.0,
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
0.0,
0.0,
1.0,
0.0,
0.0,
1.0,
1.0,
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
0.0, 0.0,
3.0,
0.0, 0.0,
5.0, 5.0,
4.0, 4.0,
0.0,
2.0,
1.0,
5.0,
0.0,
6.0,
5.0,
0.0,
6.0,
0.0,
1.0,
1.0,
6.0,
0.0,
4.0,
1.0,
5.0,
2.0,
1.0,
4.0,
6.0,
6.0,
6.0,
6.0,
3.0, 3.0,
6.0, 6.0,
1.0,
5.0, 5.0,
5.0, 5.0,
5.0,
5.0,
2.0,
6.0,
4.0,
4.0,
5.0,
4.0,
1.0,
6.0,
5.0,
1.0,
2.0,
3.0, 3.0,
1.0, 1.0,
4.0 0.0,
6.0,
4.0,
3.0,
1.0,
4.0,
4.0,
1.0,
5.0,
3.0,
2.0,
5.0,
6.0,
5.0,
1.0,
1.0,
1.0,
2.0,
5.0,
4.0,
2.0,
6.0,
5.0,
6.0,
2.0,
0.0,
4.0,
4.0,
1.0,
2.0,
1.0,
3.0,
2.0,
1.0,
0.0,
0.0,
0.0,
4.0,
5.0,
5.0
], ],
"washingstart": 14, "washingstart": 15,
"appliance_starts": { "appliance_starts": {
"dishwasher1": [ "dishwasher1": [
"2026-07-15 14:00:00+02:00" "2025-01-15 15:00:00+01:00"
] ]
} }
} }