Expand optimizer seeding and cache fitness

This commit is contained in:
Andreas
2026-07-16 10:35:52 +02:00
parent b0b437f1d7
commit 5b8f7de113
7 changed files with 1139 additions and 837 deletions
+7 -3
View File
@@ -62,9 +62,13 @@ 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 - Use a fixed, diverse genetic start population with ten exact warm-start copies, up to fifty
warm-start neighbours, and diverse domain-informed battery, direct-marketing, EV, and flexible locally mutated warm-start neighbours, up to one hundred randomized domain-informed battery,
appliance schedules to improve early convergence without discarding the previous solution. direct-marketing, EV, and flexible-appliance schedules, and a guaranteed random remainder.
Retain 150 parents while generating 150 offspring per generation.
- Memoize successful canonical fitness evaluations within one optimization run, including repaired
EV genomes and auxiliary metrics. Log cache hits, misses, key count, and hit rate after each run;
failed evaluations and results from previous runs are never reused.
- `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.
+251 -54
View File
@@ -76,6 +76,15 @@ class ApplianceGeneLayout:
) )
@dataclass(frozen=True)
class FitnessCacheEntry:
"""One canonical, successful fitness evaluation within an optimization run."""
genome: tuple[int, ...]
fitness: tuple[float]
extra_data: tuple[float, float, float]
class GeneticSimulation(PydanticBaseModel): class GeneticSimulation(PydanticBaseModel):
"""Device simulation for GENETIC optimization algorithm.""" """Device simulation for GENETIC optimization algorithm."""
@@ -537,7 +546,11 @@ class GeneticOptimization(OptimizationBase):
"""GENETIC algorithm to solve energy optimization.""" """GENETIC algorithm to solve energy optimization."""
WARM_START_COPIES = 10 WARM_START_COPIES = 10
WARM_START_MUTATIONS = 20 WARM_START_MUTATIONS = 50
EDUCATED_GUESS_TARGET = 100
MIN_RANDOM_POPULATION_FRACTION = 0.25
SURVIVOR_COUNT = 150
OFFSPRING_COUNT = 150
EDUCATED_GUESS_EXPORT_QUANTILES = (0.60, 0.75, 0.90) 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.
@@ -624,6 +637,14 @@ class GeneticOptimization(OptimizationBase):
# Per-run cache for the AC-charge break-even penalty (see evaluate()). # Per-run cache for the AC-charge break-even penalty (see evaluate()).
self._ac_break_even_best_prices: Optional[list[float]] = None self._ac_break_even_best_prices: Optional[list[float]] = None
# Fitness memoization is activated only around optimize(). The cache is
# never shared across runs because forecasts, prices and device state may
# have changed even when the genome is identical.
self._fitness_cache_enabled = False
self._fitness_cache: dict[tuple[int, ...], FitnessCacheEntry] = {}
self._fitness_cache_hits = 0
self._fitness_cache_misses = 0
# Appliance genome layout, built once per optimization run in # Appliance genome layout, built once per optimization run in
# optimierung_ems(). Empty by default so setup_deap_environment() can be # optimierung_ems(). Empty by default so setup_deap_environment() can be
# exercised standalone (e.g. in tests) without appliances. # exercised standalone (e.g. in tests) without appliances.
@@ -1247,8 +1268,14 @@ class GeneticOptimization(OptimizationBase):
genes.append(min(range(len(gene.allowed_start_slots)), key=opportunity_cost)) genes.append(min(range(len(gene.allowed_start_slots)), key=opportunity_cost))
return genes return genes
def _educated_guess_individuals(self) -> list[list[int]]: def _educated_guess_individuals(
"""Create diverse domain-informed candidates for the initial population.""" self,
target_count: int = EDUCATED_GUESS_TARGET,
) -> list[list[int]]:
"""Create a randomized family of domain-informed initial candidates."""
if target_count <= 0:
return []
slots = self.total_slots slots = self.total_slots
start_slot = self._start_day_slot() start_slot = self._start_day_slot()
len_bat = len(self.bat_possible_charge_values) len_bat = len(self.bat_possible_charge_values)
@@ -1267,6 +1294,7 @@ class GeneticOptimization(OptimizationBase):
future_feed_in = feed_in[future] future_feed_in = feed_in[future]
high_import_price = float(np.quantile(future_prices, 0.70)) high_import_price = float(np.quantile(future_prices, 0.70))
low_import_price = float(np.quantile(future_prices, 0.25)) low_import_price = float(np.quantile(future_prices, 0.25))
feed_spread = float(np.ptp(future_feed_in)) if future_feed_in.size else 0.0
ev_price = self._heuristic_ev_schedule(prefer_pv=False) ev_price = self._heuristic_ev_schedule(prefer_pv=False)
ev_pv = self._heuristic_ev_schedule(prefer_pv=True) ev_pv = self._heuristic_ev_schedule(prefer_pv=True)
@@ -1279,56 +1307,127 @@ class GeneticOptimization(OptimizationBase):
individual.extend(appliance_genes) individual.extend(appliance_genes)
return individual return individual
guesses: list[list[int]] = [] unique: dict[tuple[int, ...], list[int]] = {}
def add_guess(battery_genes: list[int], ev_genes: list[int]) -> None:
guess = compose(battery_genes, ev_genes)
unique.setdefault(tuple(guess), guess)
def policy_guess(
*,
import_quantile: float,
export_quantile: Optional[float],
pv_surplus_ratio: float,
allow_ac_arbitrage: bool,
) -> list[int]:
import_threshold = float(np.quantile(future_prices, import_quantile))
export_threshold = (
float(np.quantile(future_feed_in, export_quantile))
if export_quantile is not None and future_feed_in.size
else float("inf")
)
low_price_threshold = float(
np.quantile(future_prices, max(0.05, 1.0 - import_quantile))
)
battery_genes = [idle_state] * slots
for slot in range(start_slot, slots):
high_feed_in = (
export_quantile is not None
and self.optimize_battery_grid_export
and feed_spread > 1e-12
and feed_in[slot] > 0.0
and feed_in[slot] >= export_threshold
)
pv_surplus = pv[slot] > load[slot] * pv_surplus_ratio
if high_feed_in:
battery_genes[slot] = export_state
elif self.optimize_dc_charge and pv_surplus:
battery_genes[slot] = dc_allowed_state
elif allow_ac_arbitrage and prices[slot] <= low_price_threshold:
battery_genes[slot] = ac_charge_state
elif prices[slot] >= import_threshold and load[slot] > pv[slot]:
battery_genes[slot] = discharge_state
return battery_genes
# Baseline and self-consumption candidates are useful even without # Baseline and self-consumption candidates are useful even without
# direct marketing and anchor the population with feasible schedules. # direct marketing and anchor the population with feasible schedules.
guesses.append(compose([idle_state] * slots, ev_price)) add_guess([idle_state] * slots, ev_price)
self_consumption = [idle_state] * slots add_guess(
for slot in range(start_slot, slots): policy_guess(
if self.optimize_dc_charge and pv[slot] > load[slot]: import_quantile=0.70,
self_consumption[slot] = dc_allowed_state export_quantile=None,
elif prices[slot] >= high_import_price and load[slot] > pv[slot]: pv_surplus_ratio=1.0,
self_consumption[slot] = discharge_state allow_ac_arbitrage=False,
guesses.append(compose(self_consumption, ev_pv)) ),
ev_pv,
)
# Direct marketing candidates export only in the relatively expensive # Direct marketing candidates export only in the relatively expensive
# feed-in slots. At low tariffs PV is preferentially stored instead. # feed-in slots. At low tariffs PV is preferentially stored instead.
if self.optimize_battery_grid_export and future_feed_in.size: 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: for quantile in self.EDUCATED_GUESS_EXPORT_QUANTILES:
export_threshold = float(np.quantile(future_feed_in, quantile)) add_guess(
direct_marketing = [idle_state] * slots policy_guess(
for slot in range(start_slot, slots): import_quantile=0.70,
high_feed_in = ( export_quantile=quantile,
feed_spread > 1e-12 pv_surplus_ratio=1.0,
and feed_in[slot] > 0.0 allow_ac_arbitrage=False,
and feed_in[slot] >= export_threshold ),
ev_pv,
) )
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 inverter = self.simulation.inverter
if inverter is not None and ( ac_arbitrage_possible = inverter is not None and (
inverter.max_ac_charge_power_w is None or inverter.max_ac_charge_power_w > 0 inverter.max_ac_charge_power_w is None or inverter.max_ac_charge_power_w > 0
): )
if ac_arbitrage_possible:
price_arbitrage = [idle_state] * slots price_arbitrage = [idle_state] * slots
for slot in range(start_slot, slots): for slot in range(start_slot, slots):
if prices[slot] <= low_import_price: if prices[slot] <= low_import_price:
price_arbitrage[slot] = ac_charge_state price_arbitrage[slot] = ac_charge_state
elif prices[slot] >= high_import_price: elif prices[slot] >= high_import_price:
price_arbitrage[slot] = discharge_state price_arbitrage[slot] = discharge_state
guesses.append(compose(price_arbitrage, ev_price)) add_guess(price_arbitrage, ev_price)
unique: dict[tuple[int, ...], list[int]] = {} # Randomize policy thresholds rather than merely cloning a handful of
for guess in guesses: # templates. Every candidate remains policy-safe: a flat/low-information
unique.setdefault(tuple(guess), guess) # feed-in series never acquires export actions through blind mutation.
return list(unique.values()) attempts = max(target_count * 20, 100)
for _ in range(attempts):
export_quantile = (
random.uniform(0.50, 0.98) # noqa: S311
if self.optimize_battery_grid_export and feed_spread > 1e-12
else None
)
randomized = policy_guess(
import_quantile=random.uniform(0.55, 0.95), # noqa: S311
export_quantile=export_quantile,
pv_surplus_ratio=random.uniform(0.80, 1.20), # noqa: S311
allow_ac_arbitrage=ac_arbitrage_possible and random.random() < 0.35, # noqa: S311
)
# Add small policy-safe local variations. These provide diversity
# even when price quantiles collapse to only a few distinct slot
# masks. Export is only ever removed here, never introduced into a
# slot that the tariff policy did not mark as attractive.
future_slots = list(range(start_slot, slots))
perturbations = random.randint(1, max(2, len(future_slots) // 12)) # noqa: S311
for slot in random.sample(future_slots, min(perturbations, len(future_slots))): # noqa: S311
if randomized[slot] != idle_state:
randomized[slot] = idle_state
elif self.optimize_dc_charge and pv[slot] > load[slot]:
randomized[slot] = dc_allowed_state
elif load[slot] > pv[slot] and prices[slot] >= high_import_price:
randomized[slot] = discharge_state
add_guess(
randomized,
ev_pv if random.random() < 0.5 else ev_price, # noqa: S311
)
if len(unique) >= target_count:
break
return list(unique.values())[:target_count]
def _mutated_warm_start_neighbors( def _mutated_warm_start_neighbors(
self, self,
@@ -1478,6 +1577,49 @@ class GeneticOptimization(OptimizationBase):
parameters: GeneticOptimizationParameters, parameters: GeneticOptimizationParameters,
start_hour: int, start_hour: int,
worst_case: bool, worst_case: bool,
) -> tuple[float]:
"""Evaluate an individual, using run-local canonical memoization when active."""
if not self._fitness_cache_enabled:
return self._evaluate_uncached(individual, parameters, start_hour, worst_case)
original_key = tuple(int(value) for value in individual)
cached = self._fitness_cache.get(original_key)
if cached is not None:
individual[:] = cached.genome
individual.extra_data = cached.extra_data # type: ignore[attr-defined]
self._fitness_cache_hits += 1
return cached.fitness
self._fitness_cache_misses += 1
fitness = self._evaluate_uncached(individual, parameters, start_hour, worst_case)
extra_data = getattr(individual, "extra_data", None)
if extra_data is None:
# Failed evaluations use the sentinel fitness and are intentionally
# not cached: an unexpected transient failure must never become a
# persistent result for the remainder of the run.
return fitness
canonical_key = tuple(int(value) for value in individual)
extra_value1, extra_value2, extra_value3 = extra_data
entry = FitnessCacheEntry(
genome=canonical_key,
fitness=fitness,
extra_data=(
float(extra_value1),
float(extra_value2),
float(extra_value3),
),
)
self._fitness_cache[original_key] = entry
self._fitness_cache[canonical_key] = entry
return fitness
def _evaluate_uncached(
self,
individual: list[int],
parameters: GeneticOptimizationParameters,
start_hour: int,
worst_case: bool,
) -> tuple[float]: ) -> tuple[float]:
"""Evaluate the fitness score of a single individual in the DEAP genetic algorithm. """Evaluate the fitness score of a single individual in the DEAP genetic algorithm.
@@ -1519,6 +1661,8 @@ class GeneticOptimization(OptimizationBase):
simulation_result = self.evaluate_inner(individual) simulation_result = self.evaluate_inner(individual)
except Exception: except Exception:
# Return bad fitness score ("FitnessMin") in case of an exception # Return bad fitness score ("FitnessMin") in case of an exception
if hasattr(individual, "extra_data"):
del individual.extra_data # type: ignore[attr-defined]
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)
@@ -1716,7 +1860,6 @@ class GeneticOptimization(OptimizationBase):
individuals = 300 individuals = 300
logger.error("Individuals not configured. Using {}.", individuals) logger.error("Individuals not configured. Using {}.", individuals)
population = self.toolbox.population(n=individuals)
hof = tools.HallOfFame(1) hof = tools.HallOfFame(1)
stats = tools.Statistics(lambda ind: ind.fitness.values) stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("min", np.min) stats.register("min", np.min)
@@ -1725,9 +1868,8 @@ class GeneticOptimization(OptimizationBase):
logger.debug("Start optimize: {}", start_solution) logger.debug("Start optimize: {}", start_solution)
# Insert the start solution into the population if provided and compatible with the # Validate the warm start before assigning the fixed population budget.
# currently active genome layout. EV optimization adds one gene per prediction slot, valid_start_solution: Optional[list[float]] = None
# so a cached solution from a previous run without EV optimization must not be reused.
if start_solution is not None: if start_solution is not None:
n_appliance_genes = self.appliance_layout.n_genes n_appliance_genes = self.appliance_layout.n_genes
expected_length = ( expected_length = (
@@ -1747,32 +1889,67 @@ class GeneticOptimization(OptimizationBase):
"appliance layout." "appliance layout."
) )
else: else:
for _ in range(self.WARM_START_COPIES): valid_start_solution = start_solution
population.insert(0, creator.Individual(start_solution))
# Keep the configured initial population size fixed. With the default
# 300 individuals this yields 10 exact warm starts, 50 local variants,
# 100 educated guesses and 140 fully random candidates.
minimum_random = max(
int(individuals * self.MIN_RANDOM_POPULATION_FRACTION + 0.999999),
individuals
- (
self.WARM_START_COPIES
+ self.WARM_START_MUTATIONS
+ self.EDUCATED_GUESS_TARGET
),
)
seed_budget = max(individuals - minimum_random, 0)
seeded: list[list[float]] = []
exact_warm_count = 0
warm_neighbors: list[list[int]] = []
if valid_start_solution is not None and seed_budget > 0:
exact_warm_count = min(self.WARM_START_COPIES, seed_budget)
seeded.extend([valid_start_solution] * exact_warm_count)
remaining_seed_budget = seed_budget - len(seeded)
warm_neighbors = self._mutated_warm_start_neighbors( warm_neighbors = self._mutated_warm_start_neighbors(
start_solution, valid_start_solution,
self.WARM_START_MUTATIONS, min(self.WARM_START_MUTATIONS, remaining_seed_budget),
) )
population.extend(creator.Individual(neighbor) for neighbor in warm_neighbors) seeded.extend(warm_neighbors)
remaining_seed_budget = seed_budget - len(seeded)
educated_guesses = self._educated_guess_individuals(
min(self.EDUCATED_GUESS_TARGET, remaining_seed_budget)
)
seeded.extend(educated_guesses)
random_count = max(individuals - len(seeded), 0)
population = [creator.Individual(seed) for seed in seeded]
population.extend(self.toolbox.population(n=random_count))
logger.info( logger.info(
"Seeded population with {} exact and {} mutated warm-start solutions.", "Initial population {}: {} exact warm starts, {} warm mutations, "
self.WARM_START_COPIES, "{} educated guesses, {} random candidates.",
len(population),
exact_warm_count,
len(warm_neighbors), 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), len(educated_guesses),
random_count,
) )
# Run the evolutionary algorithm # The memoization scope is exactly one optimizer invocation. Always turn
# it off again, including when DEAP raises, so no later caller can reuse
# results under changed forecasts or device state.
self._fitness_cache.clear()
self._fitness_cache_hits = 0
self._fitness_cache_misses = 0
self._fitness_cache_enabled = True
try:
pop, log = algorithms.eaMuPlusLambda( pop, log = algorithms.eaMuPlusLambda(
population, population,
self.toolbox, self.toolbox,
mu=100, mu=self.SURVIVOR_COUNT,
lambda_=150, lambda_=self.OFFSPRING_COUNT,
cxpb=0.6, cxpb=0.6,
mutpb=0.4, mutpb=0.4,
ngen=ngen, ngen=ngen,
@@ -1780,6 +1957,20 @@ class GeneticOptimization(OptimizationBase):
halloffame=hof, halloffame=hof,
verbose=self.verbose, verbose=self.verbose,
) )
finally:
self._fitness_cache_enabled = False
cache_lookups = self._fitness_cache_hits + self._fitness_cache_misses
cache_hit_rate = (
self._fitness_cache_hits / cache_lookups if cache_lookups > 0 else 0.0
)
logger.info(
"Fitness cache: {} hits, {} misses, {:.1%} hit rate, {} keys.",
self._fitness_cache_hits,
self._fitness_cache_misses,
cache_hit_rate,
len(self._fitness_cache),
)
# Store fitness history # Store fitness history
self.fitness_history = { self.fitness_history = {
@@ -1787,6 +1978,12 @@ class GeneticOptimization(OptimizationBase):
"avg": log.select("avg"), # Average fitness for each generation (Y-axis) "avg": log.select("avg"), # Average fitness for each generation (Y-axis)
"max": log.select("max"), # Maximum fitness for each generation (Y-axis) "max": log.select("max"), # Maximum fitness for each generation (Y-axis)
"min": log.select("min"), # Minimum fitness for each generation (Y-axis) "min": log.select("min"), # Minimum fitness for each generation (Y-axis)
"fitness_cache": {
"hits": self._fitness_cache_hits,
"misses": self._fitness_cache_misses,
"hit_rate": cache_hit_rate,
"keys": len(self._fitness_cache),
},
} }
member: dict[str, list[float]] = {"bilanz": [], "verluste": [], "nebenbedingung": []} member: dict[str, list[float]] = {"bilanz": [], "verluste": [], "nebenbedingung": []}
+102 -1
View File
@@ -52,6 +52,63 @@ def test_ev_repair_is_resimulated_before_fitness_assignment(config_eos: ConfigEO
assert individual[opt.total_slots :] == [0] * opt.total_slots assert individual[opt.total_slots :] == [0] * opt.total_slots
def test_fitness_cache_restores_canonical_ev_genome(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)
parameters = SimpleNamespace(
ems=SimpleNamespace(preis_euro_pro_wh_akku=0.0),
eauto=None,
)
result = {
"Gesamtbilanz_Euro": 1.0,
"Gesamt_Verluste": 0.0,
"EAuto_SoC_pro_Stunde": np.full(opt.total_slots, 100.0),
}
first = creator.Individual([0] * opt.total_slots + [1] * opt.total_slots)
duplicate = creator.Individual(first)
opt._fitness_cache_enabled = True
with patch.object(opt, "evaluate_inner", return_value=result) as evaluate:
first_fitness = opt.evaluate(first, parameters, 0, False) # type: ignore[arg-type]
duplicate_fitness = opt.evaluate(duplicate, parameters, 0, False) # type: ignore[arg-type]
# The miss evaluates and then re-evaluates the repaired EV plan. The duplicate
# is served directly from the original-key alias and receives the canonical genome.
assert evaluate.call_count == 2
assert first_fitness == duplicate_fitness
assert duplicate == first
assert duplicate[opt.total_slots :] == [0] * opt.total_slots
assert duplicate.extra_data == first.extra_data
assert opt._fitness_cache_hits == 1
assert opt._fitness_cache_misses == 1
def test_fitness_cache_never_stores_failed_evaluations(config_eos: ConfigEOS):
_configure_hourly_grid(config_eos)
opt = GeneticOptimization(fixed_seed=42)
opt.optimize_ev = False
opt.setup_deap_environment({"home_appliance": 0}, start_hour=0)
parameters = SimpleNamespace(
ems=SimpleNamespace(preis_euro_pro_wh_akku=0.0),
eauto=None,
)
first = creator.Individual([0] * opt.total_slots)
duplicate = creator.Individual(first)
opt._fitness_cache_enabled = True
with patch.object(opt, "evaluate_inner", side_effect=RuntimeError("transient")) as evaluate:
assert opt.evaluate(first, parameters, 0, False) == (100000.0,) # type: ignore[arg-type]
assert opt.evaluate(duplicate, parameters, 0, False) == (100000.0,) # type: ignore[arg-type]
assert evaluate.call_count == 2
assert opt._fitness_cache_hits == 0
assert opt._fitness_cache_misses == 2
assert opt._fitness_cache == {}
def test_mutated_warm_start_neighbors_keep_elapsed_slots(config_eos: ConfigEOS): def test_mutated_warm_start_neighbors_keep_elapsed_slots(config_eos: ConfigEOS):
_configure_hourly_grid(config_eos, start_hour=10) _configure_hourly_grid(config_eos, start_hour=10)
opt = GeneticOptimization(fixed_seed=42) opt = GeneticOptimization(fixed_seed=42)
@@ -67,6 +124,50 @@ def test_mutated_warm_start_neighbors_keep_elapsed_slots(config_eos: ConfigEOS):
assert all(neighbor != start_solution for neighbor in neighbors) assert all(neighbor != start_solution for neighbor in neighbors)
def test_initial_population_uses_fixed_seed_budget_and_150_survivors(config_eos: ConfigEOS):
_configure_hourly_grid(config_eos)
config_eos.optimization.genetic.individuals = 300
opt = GeneticOptimization(fixed_seed=42)
opt.optimize_ev = False
opt.setup_deap_environment({"home_appliance": 0}, start_hour=0)
start_solution = [5] * opt.total_slots
warm_neighbors = [[6] * opt.total_slots for _ in range(50)]
educated = [[7] * opt.total_slots for _ in range(100)]
captured: dict[str, object] = {}
def fake_ea(population, toolbox, **kwargs):
captured["population"] = list(population)
captured["mu"] = kwargs["mu"]
captured["lambda"] = kwargs["lambda_"]
for individual in population:
individual.fitness.values = (float(sum(individual)),)
individual.extra_data = (0.0, 0.0, 0.0)
kwargs["halloffame"].update(population)
return population, SimpleNamespace(select=lambda _name: [])
with (
patch.object(opt, "_mutated_warm_start_neighbors", return_value=warm_neighbors),
patch.object(opt, "_educated_guess_individuals", return_value=educated),
patch.object(
opt.toolbox,
"population",
side_effect=lambda n: [creator.Individual([9] * opt.total_slots) for _ in range(n)],
),
patch("akkudoktoreos.optimization.genetic.genetic.algorithms.eaMuPlusLambda", fake_ea),
):
opt.optimize(start_solution=start_solution, ngen=1)
population = captured["population"]
first_genes = [individual[0] for individual in population] # type: ignore[union-attr]
assert len(population) == 300 # type: ignore[arg-type]
assert first_genes.count(5) == 10
assert first_genes.count(6) == 50
assert first_genes.count(7) == 100
assert first_genes.count(9) == 140
assert captured["mu"] == 150
assert captured["lambda"] == 150
def test_educated_guesses_encode_high_price_direct_marketing(config_eos: ConfigEOS): def test_educated_guesses_encode_high_price_direct_marketing(config_eos: ConfigEOS):
_configure_hourly_grid(config_eos) _configure_hourly_grid(config_eos)
opt = GeneticOptimization(fixed_seed=42) opt = GeneticOptimization(fixed_seed=42)
@@ -86,7 +187,7 @@ def test_educated_guesses_encode_high_price_direct_marketing(config_eos: ConfigE
dc_allowed_state = 4 dc_allowed_state = 4
export_state = 5 export_state = 5
assert len(guesses) >= 4 assert len(guesses) == opt.EDUCATED_GUESS_TARGET
assert all(len(guess) == slots for guess in guesses) assert all(len(guess) == slots for guess in guesses)
assert any(guess[0] == dc_allowed_state 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) assert any(guess[-1] == export_state for guess in guesses)
+144 -144
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,
@@ -40,11 +33,18 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.0,
1.0,
0.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 0.0
@@ -110,9 +110,7 @@
0, 0,
0, 0,
0, 0,
1, 0,
1,
1,
0, 0,
0, 0,
0, 0,
@@ -122,31 +120,33 @@
0, 0,
0, 0,
1, 1,
1,
1,
0, 0,
0, 0,
1, 1,
1, 1,
1, 1,
1, 1,
1,
1,
1,
1,
1,
0,
0,
0,
0, 0,
0, 0,
0, 0,
1,
1,
1,
1,
1,
0, 0,
1,
1,
0, 0,
0, 0,
0, 0,
1, 1,
0,
0,
0,
1, 1,
1,
0,
0 0
], ],
"battery_grid_export_allowed": [], "battery_grid_export_allowed": [],
@@ -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.18814608875566813, 0.0,
0.0,
0.09514375330616998,
0.15236390731688437, 0.15236390731688437,
0.10316291465819699, 0.10316291465819699,
0.029150936607659956, 0.05435777788576338,
0.020928608511559126, 0.0,
0.003524558735906156, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0 0.0
], ],
"Gesamt_Verluste": 3290.8745999936527, "Gesamt_Verluste": 3421.6165248449383,
"Gesamtbilanz_Euro": 1.251565700139288, "Gesamtbilanz_Euro": 0.5951993628823129,
"Gesamteinnahmen_Euro": 1.1316277804018695, "Gesamteinnahmen_Euro": 1.1298399163065491,
"Gesamtkosten_Euro": 2.3831934805411574, "Gesamtkosten_Euro": 1.725039279188862,
"Home_appliance_wh_per_hour": [ "Home_appliance_wh_per_hour": [
0.0, 0.0,
0.0, 0.0,
@@ -318,17 +318,17 @@
], ],
"home_appliance_energy_wh": {}, "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.0,
0.2338232746714084, 0.0,
0.0, 0.0,
0.26650619799999997, 0.26650619799999997,
0.19588158, 0.19588158,
@@ -336,39 +336,39 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.182970359,
0.162995926,
0.16677339,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.1306329312971816,
0.07362195915902499,
0.060401289430882174,
0.009619897970888898, 0.009619897970888898,
0.0, 0.07029121023060134,
0.0, 4.179128154646605e-17,
2.3325608707865465e-05, 2.3325608707865465e-05,
0.0021886029750169123, 0.0021886029750169123,
0.013012984677295973, 0.013012984677295973,
0.08357424731947552,
0.0, 0.0,
0.17784012884918773,
0.19011028252189552,
0.293043269,
0.0, 0.0,
0.0,
0.214398479,
0.16484566 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, 0.0,
758.9200735845777, 0.0,
0.0, 0.0,
912.38, 912.38,
704.61, 704.61,
@@ -376,25 +376,25 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
556.31,
488.89,
506.91,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
537.58407941227,
322.9033296448464,
273.0618871197205,
45.96224544141853, 45.96224544141853,
0.0, 374.088399311343,
0.0, 2.2737367544323206e-13,
0.11639525303326081, 0.11639525303326081,
9.957247384062384, 9.957247384062384,
57.32592368852852, 57.32592368852852,
278.85968408233407,
0.0, 0.0,
556.6201215937018,
617.0408390843736,
987.01,
0.0, 0.0,
0.0,
733.99,
592.97 592.97
], ],
"Netzeinspeisung_Wh_pro_Stunde": [ "Netzeinspeisung_Wh_pro_Stunde": [
@@ -402,13 +402,11 @@
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,
@@ -427,28 +425,30 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
2687.8012679381163, 0.0,
0.0,
1359.1964758024283,
2176.6272473840627, 2176.6272473840627,
1473.7559236885286, 1473.7559236885286,
416.4419515379994, 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,
106.80230977350088,
133.7321802766326, 133.7321802766326,
0.0, 0.0,
0.0, 0.0,
@@ -456,66 +456,66 @@
118.37045454545455, 118.37045454545455,
94.68272727272722, 94.68272727272722,
83.01681818181817, 83.01681818181817,
0.0, 75.86045454545456,
0.0, 66.66681818181814,
0.0, 69.12409090909085,
109.07302361034766, 109.07302361034766,
116.99491129525349, 116.99491129525349,
95.61900944932736, 22.312089529472388,
98.21987178167876, 54.18759955738153,
123.8591383343284, 86.6234264543665,
165.15986945297027, 165.15986945297027,
116.9350623689079, 65.92300791736113,
538.2984000000001, 538.2984000000001,
119.40181527778998, 278.8343903340726,
0.0,
0.0,
81.2380484620021,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
100.08954545454549, 111.78035844493081,
90.18403329253945,
134.59227272727276,
0.0,
0.0 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, 91.54148603150185,
95.77874174137638, 91.54148603150185,
93.5560747303571, 91.54148603150185,
89.81963361465462, 89.31881902048255,
86.83091116286398, 85.58237790478007,
84.21043079096314, 82.59365545298944,
84.21043079096314, 79.97317508108861,
84.21043079096314, 77.57859002599218,
84.21043079096314, 75.47420813893983,
80.76754055001486, 73.29226082489025,
77.26987043147221, 69.84937058394196,
75.57566963810356, 66.35170046539932,
75.69097315408206, 66.97148073010689,
76.9218097513005, 68.47669182892304,
81.5095839027719, 70.8828981193221,
81.73054957561693, 75.4706722707935,
96.68328290895028, 77.30186693516465,
92.254600268498,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 98.60068046043587,
100.0, 96.11252124341868,
100.0, 91.86402778611841,
96.84060778236915 91.86402778611841
], ],
"Electricity_price": [ "Electricity_price": [
0.000228, 0.000228,
@@ -711,51 +711,51 @@
"start_solution": [ "start_solution": [
0.0, 0.0,
0.0, 0.0,
1.0,
2.0,
0.0, 0.0,
2.0, 0.0,
2.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,
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
0.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,
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
0.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,
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, 1.0,
0.0, 0.0,
2.0,
2.0,
1.0,
2.0,
2.0,
0.0,
1.0,
0.0 0.0
], ],
"washingstart": null, "washingstart": null,
+72 -72
View File
@@ -110,9 +110,10 @@
0, 0,
0, 0,
0, 0,
1,
1,
0, 0,
0, 1,
0,
0, 0,
0, 0,
0, 0,
@@ -123,7 +124,7 @@
1, 1,
0, 0,
0, 0,
0, 1,
1, 1,
1, 1,
1, 1,
@@ -142,10 +143,9 @@
0, 0,
0, 0,
0, 0,
0,
1, 1,
1, 1,
0, 1,
0, 0,
0 0
], ],
@@ -237,11 +237,12 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.022582049506752234, 0.0,
0.3039575, 0.21367321450420126,
0.19320652266312205, 0.19320652266312205,
0.1358062627100041, 0.1358062627100041,
0.0692592282596561, 0.0692592282596561,
0.023370695807696434,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -261,8 +262,7 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0013652045768039896, 0.11745809857246167,
0.2577971476677123,
0.15236390731688437, 0.15236390731688437,
0.10316291465819699, 0.10316291465819699,
0.05435777788576338, 0.05435777788576338,
@@ -272,10 +272,10 @@
0.0, 0.0,
0.0 0.0
], ],
"Gesamt_Verluste": 2758.4157389677953, "Gesamt_Verluste": 3638.132237848992,
"Gesamtbilanz_Euro": 1.2690402398027016, "Gesamtbilanz_Euro": 0.5580695656866563,
"Gesamteinnahmen_Euro": 1.2938585152448954, "Gesamteinnahmen_Euro": 1.0626586223779864,
"Gesamtkosten_Euro": 2.562898755047597, "Gesamtkosten_Euro": 1.6207281880646427,
"Home_appliance_wh_per_hour": [ "Home_appliance_wh_per_hour": [
0.0, 0.0,
0.0, 0.0,
@@ -318,18 +318,18 @@
], ],
"home_appliance_energy_wh": {}, "home_appliance_energy_wh": {},
"Kosten_Euro_pro_Stunde": [ "Kosten_Euro_pro_Stunde": [
0.10013413727316416, 0.0,
0.09007999454232955, 0.0,
0.11436917344552285, 0.11436917344552285,
0.07557452231671152, 0.0,
0.0, 0.0,
4.55656845588237e-17, 4.55656845588237e-17,
0.001414013162203277, 0.001414013162203277,
0.005881449073870462, 0.005881449073870462,
0.05258762370598476, 0.05258762370598476,
0.1614775630079859,
0.0, 0.0,
0.0, 0.0,
0.29116746986009023,
0.26650619799999997, 0.26650619799999997,
0.19588158, 0.19588158,
0.0, 0.0,
@@ -340,7 +340,7 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.25364873699864443, 0.0,
0.1306329312971816, 0.1306329312971816,
0.07362195915902499, 0.07362195915902499,
0.060401289430882174, 0.060401289430882174,
@@ -353,23 +353,23 @@
0.08357424731947552, 0.08357424731947552,
0.0, 0.0,
0.0, 0.0,
0.293043269, 0.0,
0.214398479, 0.214398479,
0.16484566 0.16484566
], ],
"Netzbezug_Wh_pro_Stunde": [ "Netzbezug_Wh_pro_Stunde": [
439.1848126015972, 0.0,
407.23324838304495, 0.0,
546.436566868241, 546.436566868241,
402.20607938643707, 0.0,
0.0, 0.0,
2.2737367544323206e-13, 2.2737367544323206e-13,
6.433180901743754, 6.433180901743754,
25.909467285772962, 25.909467285772962,
175.4675465665157, 175.4675465665157,
505.40708296709204,
0.0, 0.0,
0.0, 0.0,
980.6920507244535,
912.38, 912.38,
704.61, 704.61,
0.0, 0.0,
@@ -380,7 +380,7 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
833.8222781020527, 0.0,
537.58407941227, 537.58407941227,
322.9033296448464, 322.9033296448464,
273.0618871197205, 273.0618871197205,
@@ -393,7 +393,7 @@
278.85968408233407, 278.85968408233407,
0.0, 0.0,
0.0, 0.0,
987.01, 0.0,
733.99, 733.99,
592.97 592.97
], ],
@@ -402,11 +402,12 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
322.60070723931767, 0.0,
4342.25, 3052.474492917161,
2760.093180901744, 2760.093180901744,
1940.089467285773, 1940.089467285773,
989.4175465665157, 989.4175465665157,
333.86708296709196,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -426,8 +427,7 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
19.502922525771282, 1677.9728367494527,
3682.816395253033,
2176.6272473840627, 2176.6272473840627,
1473.7559236885286, 1473.7559236885286,
776.5396840823341, 776.5396840823341,
@@ -438,18 +438,18 @@
0.0 0.0
], ],
"Verluste_Pro_Stunde": [ "Verluste_Pro_Stunde": [
37.96737751219166, 97.85621559422765,
46.38878980596536, 101.92059640365329,
39.91398802418894, 39.91398802418894,
51.82392952637247, 106.67021307906845,
543.9059151312817, 582.6179999999995,
154.77306084994075,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
108.98319763338179,
106.80230977350088, 106.80230977350088,
0.0014460869344160802, 133.7321802766326,
0.0, 0.0,
0.0, 0.0,
70.41409090909087, 70.41409090909087,
@@ -460,62 +460,62 @@
66.66681818181814, 66.66681818181814,
69.12409090909085, 69.12409090909085,
109.07302361034766, 109.07302361034766,
3.2918733722463145, 116.99491129525349,
22.312089529472388, 22.312089529472388,
54.18759955738153, 54.18759955738153,
86.6234264543665, 86.6234264543665,
165.15986945297027, 165.15986945297027,
65.92300791736113, 65.92300791736113,
535.9580492969076, 538.2984000000001,
0.0, 240.58122702042965,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
111.78035844493081, 111.78035844493081,
90.18403329253945, 90.18403329253945,
0.0, 134.59227272727276,
0.0, 0.0,
0.0 0.0
], ],
"akku_soc_pro_stunde": [ "akku_soc_pro_stunde": [
80.0, 80.0,
81.05464937533866, 79.16421888032488,
82.3432268699488, 78.69989843940196,
83.45194875950959, 79.80862032896276,
84.8915023574644, 79.51691497639054,
95.70074830972388,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
98.93741213017658, 96.82533215994886,
95.76274429012544, 92.60407390132525,
95.76278445920696, 92.60407390132525,
95.76278445920696, 92.60407390132525,
95.76278445920696, 90.38140689030597,
93.54011744818767, 86.64496577460349,
89.80367633248518, 83.65624332281286,
86.81495388069455, 81.03576295091202,
84.19447350879372, 78.64117789581559,
81.79988845369729, 76.53679600876325,
79.69550656664495, 74.35484869471367,
77.51355925259536, 70.91195845376538,
74.07066901164707, 67.41428833522274,
74.16210993865391, 68.03406859993031,
74.78189020336148, 69.53927969874645,
76.28710130217763, 71.94548598914552,
78.6933075925767, 76.53326014061692,
83.2810817440481, 78.36445480498806,
85.11227640841923, 93.3171881383214,
100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
100.0, 100.0,
98.60068046043587, 98.60068046043587,
96.11252124341868, 96.11252124341868,
96.11252124341868, 91.86402778611841,
96.11252124341868 91.86402778611841
], ],
"Electricity_price": [ "Electricity_price": [
0.000228, 0.000228,
@@ -717,11 +717,12 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
2.0,
2.0,
1.0,
1.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,
@@ -732,7 +733,7 @@
1.0, 1.0,
0.0, 0.0,
0.0, 0.0,
0.0, 1.0,
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
@@ -751,10 +752,9 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0,
1.0, 1.0,
1.0, 1.0,
0.0, 1.0,
0.0, 0.0,
0.0 0.0
], ],
+238 -238
View File
@@ -14,14 +14,6 @@
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,
1.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -39,13 +31,21 @@
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,
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
], ],
@@ -111,43 +111,43 @@
0, 0,
0, 0,
0, 0,
1,
0,
0,
0,
1,
0,
1,
1,
0,
1,
0, 0,
0, 0,
0, 0,
0, 0,
1, 0,
0,
0,
0,
0, 0,
1, 1,
1, 1,
0, 0,
0, 0,
1, 1,
0,
0,
1, 1,
1,
1,
1,
1,
1,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0, 0,
0, 0,
1, 1,
1, 1,
0,
1,
1, 1,
0, 0,
1, 0
1,
0,
1,
1
], ],
"battery_grid_export_allowed": [], "battery_grid_export_allowed": [],
"eautocharge_hours_float": [ "eautocharge_hours_float": [
@@ -161,14 +161,14 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.0, 0.875,
0.5, 0.625,
0.625, 0.625,
0.375, 0.375,
0.875,
0.75, 0.75,
0.75, 0.75,
0.375, 0.375,
0.875,
0.1, 0.1,
0.0, 0.0,
0.0, 0.0,
@@ -202,18 +202,18 @@
], ],
"result": { "result": {
"Last_Wh_pro_Stunde": [ "Last_Wh_pro_Stunde": [
11541.07, 10230.07,
6307.91, 7618.91,
7875.5599999999995, 7875.5599999999995,
5065.03, 7565.03,
13622.08822093064, 12840.67,
9042.82, 9042.82,
7649.22, 9082.22,
12780.779999999999, 5036.78,
2177.92, 2177.92,
1178.71, 1178.71,
1050.98, 1050.98,
5988.547949275546, 988.56,
912.38, 912.38,
704.61, 704.61,
516.37, 516.37,
@@ -231,25 +231,25 @@
827.01, 827.01,
1257.98, 1257.98,
1232.67, 1232.67,
2188.443604746967, 871.26,
860.88, 860.88,
1158.03, 1158.03,
1222.72, 1222.72,
1221.04, 1221.04,
949.99, 949.99,
1987.01, 987.01,
733.99, 733.99,
592.97 592.97
], ],
"EAuto_SoC_pro_Stunde": [ "EAuto_SoC_pro_Stunde": [
5.0, 5.0,
22.48, 20.294999999999998,
31.22, 31.22,
42.144999999999996, 42.144999999999996,
48.699999999999996, 48.699999999999996,
61.809999999999995, 63.995000000000005,
74.92, 77.105,
81.475, 90.215,
96.77, 96.77,
98.518, 98.518,
98.518, 98.518,
@@ -313,22 +313,19 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.05936927575872234,
0.0, 0.05435777788576338,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0 0.0
], ],
"Gesamt_Verluste": 9279.931765999105, "Gesamt_Verluste": 6227.580163897914,
"Gesamtbilanz_Euro": 12.822538076242544, "Gesamtbilanz_Euro": 11.420868526053463,
"Gesamteinnahmen_Euro": 0.0, "Gesamteinnahmen_Euro": 0.11372705364448572,
"Gesamtkosten_Euro": 12.822538076242544, "Gesamtkosten_Euro": 11.534595579697948,
"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,
@@ -363,13 +360,13 @@
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,
@@ -404,88 +401,91 @@
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": [
2.41926012, 2.1203521199999997,
0.19137741085396395, 1.4545721927072854,
1.4167558060312964, 1.4167558060312964,
0.7340784901492668, 1.2032659414129376,
1.4723942300000001, 1.2892826874611185,
0.0, 0.770122611209644,
0.8450811735885355, 1.1459236583154115,
1.2197241405944232, 0.4965507655670841,
0.0, 0.1912938683161112,
0.1614775630079859, 0.1614775630079859,
0.0, 0.0,
1.7756638919999999, 0.0,
0.26650619799999997, 0.26650619799999997,
0.19588158, 0.19588158,
0.174739608,
0.0,
0.22802125600000003,
0.0, 0.0,
0.0, 0.0,
0.162995926,
0.16677339,
0.0, 0.0,
0.25364873699864443, 0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.1306329312971816, 0.1306329312971816,
0.0, 0.07362195915902499,
0.060401289430882174, 0.060401289430882174,
0.009619897970888898, 0.009619897970888898,
0.0, 0.07029121023060134,
0.0, 4.179128154646605e-17,
0.26398692, 2.3325608707865465e-05,
0.0, 0.0021886029750169123,
0.0, 0.013012984677295973,
0.08357424731947552, 0.08357424731947552,
0.0, 0.0,
0.0, 0.0,
0.589943269,
0.0, 0.0,
0.0 0.214398479,
0.16484566
], ],
"Netzbezug_Wh_pro_Stunde": [ "Netzbezug_Wh_pro_Stunde": [
10610.789999999999, 9299.789999999999,
865.1781684175585, 6575.823656000386,
6769.01961792306, 6769.01961792306,
3906.7508789210588, 6403.757005923032,
8010.85, 7014.595688036554,
0.0, 3842.9272016449304,
3844.7733102299158, 5213.483431826258,
5373.234099534904, 2187.4483064629258,
0.0, 638.2845122326032,
505.40708296709204, 505.40708296709204,
0.0, 0.0,
5980.679999999999, 0.0,
912.38, 912.38,
704.61, 704.61,
516.37,
0.0,
694.34,
0.0, 0.0,
0.0, 0.0,
488.89,
506.91,
0.0, 0.0,
833.8222781020527, 0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
537.58407941227, 537.58407941227,
0.0, 322.9033296448464,
273.0618871197205, 273.0618871197205,
45.96224544141853, 45.96224544141853,
0.0, 374.088399311343,
0.0, 2.2737367544323206e-13,
1317.3000000000002, 0.11639525303326081,
0.0, 9.957247384062384,
0.0, 57.32592368852852,
278.85968408233407, 278.85968408233407,
0.0, 0.0,
0.0, 0.0,
1987.01,
0.0, 0.0,
0.0 733.99,
592.97
], ],
"Netzeinspeisung_Wh_pro_Stunde": [ "Netzeinspeisung_Wh_pro_Stunde": [
0.0, 0.0,
@@ -519,8 +519,8 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 848.1325108388907,
0.0, 776.5396840823341,
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": [
552.0, 483.0,
876.0621802101069, 345.0196387200463,
345.0239541507672, 345.0239541507672,
207.4093054705271, 207.05004071076388,
1013.9999999999998, 506.1294825643864,
976.3367916944278, 452.3012641973916,
226.85199722758986, 426.13721181915116,
1084.2496919441885, 227.23539677555112,
190.65093859054008, 103.61214146791241,
40.06404995605101, 40.06404995605101,
106.80230977350088, 106.80230977350088,
600.0000000000001, 133.7321802766326,
0.0,
0.0, 0.0,
0.0, 0.0,
70.41409090909087,
118.37045454545455, 118.37045454545455,
0.0, 94.68272727272722,
83.01681818181817, 83.01681818181817,
75.86045454545456, 75.86045454545456,
0.0, 66.66681818181814,
0.0, 69.12409090909085,
109.07302361034766, 109.07302361034766,
3.2918733722463145, 116.99491129525349,
22.312089529472388, 22.312089529472388,
98.21987178167876, 54.18759955738153,
86.6234264543665, 86.6234264543665,
165.15986945297027, 165.15986945297027,
116.9350623689079, 65.92300791736113,
538.2984000000001, 538.2984000000001,
600.0000000000002, 441.9379674303641,
262.55307614755066, 261.1952696860876,
184.66788225469543, 75.0748095419566,
93.18476208988011, 0.0,
111.78035844493081, 111.78035844493081,
90.18403329253945, 90.18403329253945,
120.0, 134.59227272727276,
100.08954545454549, 0.0,
80.85954545454547 0.0
], ],
"akku_soc_pro_stunde": [ "akku_soc_pro_stunde": [
80.0, 80.0,
80.0, 80.0,
61.0623332886646, 80.00054552000128,
61.06299868174146, 80.00121091307815,
61.074368278144995, 80.0026009328216,
77.74103494481164, 80.6450865596101,
62.263433461120634, 81.70901056509321,
62.81487782855368, 82.04615533784741,
43.910197554276095, 82.60824969272383,
42.50754248385738, 83.95303140016584,
43.62043276041435, 85.06592167672281,
40.44576492036321, 81.89125383667168,
57.11243158702987, 77.66999557804807,
57.11243158702987, 77.66999557804807,
57.11243158702987, 77.66999557804807,
57.11243158702987, 75.44732856702878,
53.3759904713274, 71.71088745132629,
53.3759904713274, 68.72216499953565,
50.75551009942657, 66.10168462763482,
48.36092504433015, 63.7070995725384,
48.36092504433015, 61.60271768548606,
48.36092504433015, 59.42077037143647,
44.918034803381865, 55.97788013048819,
45.0094757303887, 52.48021001194556,
45.629255995096266, 53.09999027665313,
45.744559511074755, 54.60520137546928,
48.150765801473824, 57.01140766586834,
52.73853995294522, 61.59918181733974,
52.95950562579026, 63.43037648171088,
67.9122389591236, 78.38310981504422,
84.57890562579026, 90.65916446588767,
91.79146973129197, 97.91458862383455,
96.45723532881205, 100.0,
99.04570094241983, 100.0,
97.64638140285571, 98.60068046043587,
95.1582221858385, 96.11252124341868,
98.49155551917185, 91.86402778611841,
95.332163301541 91.86402778611841
], ],
"Electricity_price": [ "Electricity_price": [
0.000228, 0.000228,
@@ -702,14 +702,14 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
1.0, 0.875,
0.5, 0.625,
0.625, 0.625,
0.375, 0.375,
0.875,
0.75, 0.75,
0.75, 0.75,
0.375, 0.375,
0.875,
0.1, 0.1,
0.0, 0.0,
0.0, 0.0,
@@ -800,107 +800,107 @@
}, },
"start_solution": [ "start_solution": [
0.0, 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, 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,
0.0,
0.0, 0.0,
1.0, 1.0,
1.0, 1.0,
0.0, 0.0,
0.0, 0.0,
1.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,
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,
2.0,
1.0,
1.0, 1.0,
0.0, 0.0,
1.0, 0.0,
1.0,
2.0,
1.0,
1.0,
6.0,
5.0,
4.0,
3.0, 3.0,
6.0, 6.0,
5.0,
5.0,
6.0,
1.0,
0.0,
6.0,
2.0, 2.0,
3.0,
1.0,
4.0,
4.0, 4.0,
5.0,
6.0,
0.0,
1.0, 1.0,
2.0,
0.0,
5.0, 5.0,
3.0, 3.0,
2.0,
0.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, 3.0,
1.0, 1.0,
0.0, 5.0,
4.0, 4.0,
4.0, 4.0,
5.0,
5.0,
1.0, 1.0,
6.0 1.0,
2.0,
2.0,
1.0,
4.0,
6.0,
4.0,
5.0,
6.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,
3.0
], ],
"washingstart": 16, "washingstart": 13,
"appliance_starts": { "appliance_starts": {
"dishwasher1": [ "dishwasher1": [
"2025-01-15 16:00:00+01:00" "2025-01-15 13:00:00+01:00"
] ]
} }
} }
+313 -313
View File
@@ -13,20 +13,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,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1.0,
1.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -36,7 +22,21 @@
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,
0.0,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -110,33 +110,21 @@
0, 0,
0, 0,
0, 0,
0,
1, 1,
0,
0,
0,
1, 1,
0, 0,
0, 0,
0, 0,
0, 0,
0, 0,
1,
0, 0,
0, 0,
1,
0,
0, 0,
1, 1,
1, 1,
0, 0,
0, 0,
1, 1,
0,
0,
1,
0,
0,
1, 1,
1, 1,
1, 1,
@@ -145,8 +133,20 @@
1, 1,
1, 1,
1, 1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
1, 1,
1, 1,
0,
0 0
], ],
"battery_grid_export_allowed": [], "battery_grid_export_allowed": [],
@@ -162,13 +162,13 @@
0.0, 0.0,
0.0, 0.0,
1.0, 1.0,
0.5,
0.75, 0.75,
0.625, 0.875,
0.5,
0.375, 0.375,
0.75, 1.0,
0.75,
0.375, 0.375,
0.8,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -203,13 +203,13 @@
"result": { "result": {
"Last_Wh_pro_Stunde": [ "Last_Wh_pro_Stunde": [
11541.07, 11541.07,
8929.91, 6307.91,
7875.5599999999995, 9186.56,
10061.61912107894, 10309.03,
13622.08822093064, 6407.67,
11542.82, 5109.82,
12483.786689770084, 11704.22,
11482.522793459368, 5036.78,
1129.12, 1129.12,
1178.71, 1178.71,
1050.98, 1050.98,
@@ -217,7 +217,7 @@
912.38, 912.38,
704.61, 704.61,
516.37, 516.37,
2368.05, 868.05,
694.34, 694.34,
608.79, 608.79,
556.31, 556.31,
@@ -228,9 +228,9 @@
1056.97, 1056.97,
992.46, 992.46,
1155.99, 1155.99,
1189.376775455858, 827.01,
1257.98, 3757.98,
1232.67, 3732.67,
871.26, 871.26,
860.88, 860.88,
1158.03, 1158.03,
@@ -244,42 +244,42 @@
"EAuto_SoC_pro_Stunde": [ "EAuto_SoC_pro_Stunde": [
5.0, 5.0,
22.48, 22.48,
35.589999999999996, 31.22,
46.515, 44.330000000000005,
53.06999999999999, 59.62499999999999,
66.18, 68.365,
79.29, 74.92,
85.845, 92.4,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001, 98.955,
99.82900000000001 98.955
], ],
"Einnahmen_Euro_pro_Stunde": [ "Einnahmen_Euro_pro_Stunde": [
0.0, 0.0,
@@ -290,9 +290,6 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.05814763393192599,
0.023370695807696434,
0.0019327051509204403,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -310,22 +307,47 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
0.300304461863129, 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
], ],
"Gesamt_Verluste": 8027.369144275042, "Gesamt_Verluste": 7430.87215820259,
"Gesamtbilanz_Euro": 13.979945090881573, "Gesamtbilanz_Euro": 9.4881560601163,
"Gesamteinnahmen_Euro": 0.9201379835273773, "Gesamteinnahmen_Euro": 0.0,
"Gesamtkosten_Euro": 14.90008307440895, "Gesamtkosten_Euro": 9.4881560601163,
"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,
@@ -341,32 +363,32 @@
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,
@@ -382,109 +404,87 @@
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": [
2.41926012, 1.4160601199999998,
0.7712613792641736, 0.19137741085396395,
1.4167558060312964, 1.691123530177008,
1.672937586, 1.7187910298948639,
1.4723942300000001, 0.20791005863613377,
0.36290611910050846, 0.09234842570092357,
1.907718932, 1.709869129414328,
1.9280712188270857, 0.4965507655670841,
0.05258762370598476, 0.05258762370598476,
0.1614775630079859, 0.1614775630079859,
0.2338232746714084, 0.0,
0.0, 0.0,
0.26650619799999997, 0.26650619799999997,
0.19588158, 0.19588158,
0.0, 0.0,
0.78571899,
0.22802125600000003,
0.0, 0.0,
0.0, 0.0,
0.162995926,
0.16677339,
0.0, 0.0,
0.25364873699864443, 0.0,
0.0,
0.0,
0.0,
0.0,
0.1306329312971816, 0.1306329312971816,
0.0, 0.07362195915902499,
0.060401289430882174, 0.060401289430882174,
0.0854632640738, 0.009619897970888898,
0.4410873661898387,
0.0, 0.0,
2.3325608707865465e-05,
0.0021886029750169123,
0.013012984677295973,
0.0, 0.0,
0.0, 0.17784012884918773,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
0.214398479,
0.16484566 0.16484566
], ],
"Netzbezug_Wh_pro_Stunde": [ "Netzbezug_Wh_pro_Stunde": [
10610.789999999999, 6210.789999999999,
3486.7150961309835, 865.1781684175585,
6769.01961792306, 8079.902198647912,
8903.34, 9147.371101090283,
8010.85, 1131.1755094457767,
1810.908777946649, 460.8204875295587,
8679.34, 7779.204410438253,
8493.70580981095, 2187.4483064629258,
175.4675465665157, 175.4675465665157,
505.40708296709204, 505.40708296709204,
758.9200735845777, 0.0,
0.0, 0.0,
912.38, 912.38,
704.61, 704.61,
0.0, 0.0,
2368.05,
694.34,
0.0, 0.0,
0.0, 0.0,
488.89,
506.91,
0.0, 0.0,
833.8222781020527, 0.0,
0.0,
0.0,
0.0,
0.0,
537.58407941227, 537.58407941227,
0.0, 322.9033296448464,
273.0618871197205, 273.0618871197205,
408.3290208972767, 45.96224544141853,
2347.45804252176,
0.0, 0.0,
0.11639525303326081,
9.957247384062384,
57.32592368852852,
0.0, 0.0,
0.0, 556.6201215937018,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0, 0.0,
0.0, 0.0,
733.99,
592.97 592.97
], ],
"Netzeinspeisung_Wh_pro_Stunde": [ "Netzeinspeisung_Wh_pro_Stunde": [
@@ -496,9 +496,6 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
830.6804847418,
333.86708296709196,
27.61007358457772,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -516,11 +513,14 @@
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
4290.063740901843, 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,
@@ -528,84 +528,84 @@
0.0 0.0
], ],
"Verluste_Pro_Stunde": [ "Verluste_Pro_Stunde": [
552.0, 1152.0,
1014.0066115357181, 876.0621802101069,
345.0239541507672, 414.00986383774955,
806.9999999999999, 483.00373213083384,
1013.9999999999998, 365.07906113349316,
1036.459053353598, 311.4084585035471,
807.0, 557.3837292525905,
683.6982971773144, 227.23539677555112,
19.04844741896588, 118.73010558798194,
0.0, 40.06404995605101,
0.0, 106.80230977350088,
133.7321802766326, 133.7321802766326,
0.0, 0.0,
0.0, 0.0,
70.41409090909087, 70.41409090909087,
180.0, 118.37045454545455,
0.0, 94.68272727272722,
83.01681818181817, 83.01681818181817,
75.86045454545456, 75.86045454545456,
0.0, 66.66681818181814,
0.0, 69.12409090909085,
109.07302361034766, 109.07302361034766,
3.2918733722463145, 116.99491129525349,
22.312089529472388, 22.312089529472388,
98.21987178167876, 54.18759955738153,
86.6234264543665, 86.6234264543665,
208.64388250767325, 165.15986945297027,
116.9350623689079, 2.727365102611202,
23.490751091778808, 238.2983999999999,
0.03390853445803674, 441.9379674303641,
2.900768349489402, 261.1952696860876,
16.700320743972142, 176.85071084262336,
81.2380484620021, 131.21108264656203,
111.78035844493081, 35.877614591244196,
90.18403329253945, 90.18403329253945,
134.59227272727276, 134.59227272727276,
100.08954545454549, 0.0,
0.0 0.0
], ],
"akku_soc_pro_stunde": [ "akku_soc_pro_stunde": [
80.0, 80.0,
80.0, 61.06060606060606,
61.06078971437601, 42.12293934927065,
61.06145510745288, 42.12321334476369,
77.72812177411956, 42.123317015064636,
94.39478844078621, 44.59773537988389,
76.07925709454777, 47.49797033831576,
92.74592376121446, 47.64751837310994,
99.47087646058428, 48.209612727986354,
100.0, 51.507671216541404,
100.0, 52.620561493098386,
100.0, 49.44589365304724,
95.77874174137638, 45.224635394423636,
95.77874174137638, 45.224635394423636,
95.77874174137638, 45.224635394423636,
93.5560747303571, 43.00196838340435,
98.5560747303571, 39.26552726770188,
98.5560747303571, 36.27680481591124,
95.93559435845627, 33.656324444010416,
93.54100930335983, 31.261739388913995,
93.54100930335983, 29.157357501861657,
93.54100930335983, 26.97541018781207,
90.09811906241156, 23.53251994686378,
90.1895599894184, 20.034849828321157,
90.80934025412597, 20.654630093028718,
90.92464377010445, 22.159841191844876,
93.33085006050352, 24.566047482243945,
99.12651346349443, 29.15382163371534,
99.34747913633947, 29.229581775454538,
100.0, 35.84898177545453,
100.0, 48.12503642629798,
100.0, 55.38046058424485,
100.0, 60.29298032987328,
100.0, 61.68112016833327,
98.60068046043587, 62.6777205736456,
96.11252124341868, 60.18956135662841,
91.86402778611841, 55.94106789932813,
88.70463556848756 55.94106789932813
], ],
"Electricity_price": [ "Electricity_price": [
0.000228, 0.000228,
@@ -703,13 +703,13 @@
0.0, 0.0,
0.0, 0.0,
1.0, 1.0,
0.5,
0.75, 0.75,
0.625, 0.875,
0.5,
0.375, 0.375,
0.75, 1.0,
0.75,
0.375, 0.375,
0.8,
0.0, 0.0,
0.0, 0.0,
0.0, 0.0,
@@ -795,49 +795,35 @@
"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": 59897.4, "soc_wh": 59373.0,
"initial_soc_percentage": 5 "initial_soc_percentage": 5
}, },
"start_solution": [ "start_solution": [
2.0,
2.0,
1.0,
1.0,
0.0,
1.0,
2.0,
2.0,
2.0,
0.0,
0.0,
1.0, 1.0,
0.0, 0.0,
2.0, 2.0,
2.0, 2.0,
1.0,
2.0,
2.0,
0.0,
0.0,
0.0,
1.0,
0.0,
0.0, 0.0,
1.0, 1.0,
2.0, 2.0,
2.0, 2.0,
1.0, 1.0,
1.0,
0.0,
0.0,
1.0,
0.0,
0.0,
1.0,
0.0,
2.0, 2.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,
1.0,
1.0,
0.0,
0.0,
1.0,
1.0, 1.0,
1.0, 1.0,
1.0, 1.0,
@@ -848,59 +834,73 @@
1.0, 1.0,
0.0, 0.0,
0.0, 0.0,
5.0, 0.0,
4.0, 0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1.0,
0.0,
1.0,
1.0,
0.0,
0.0,
0.0,
0.0,
2.0,
3.0, 3.0,
6.0, 6.0,
5.0,
5.0,
3.0,
1.0,
0.0,
6.0,
4.0, 4.0,
3.0, 3.0,
1.0, 1.0,
4.0,
4.0,
1.0,
5.0,
3.0,
2.0,
5.0,
6.0, 6.0,
5.0,
1.0, 1.0,
1.0,
1.0,
2.0,
5.0,
4.0,
2.0,
6.0,
5.0,
6.0, 6.0,
2.0, 2.0,
0.0,
4.0, 4.0,
4.0, 5.0,
1.0,
2.0, 2.0,
1.0, 1.0,
6.0,
1.0,
3.0,
4.0,
3.0,
3.0, 3.0,
2.0, 2.0,
1.0, 3.0,
0.0,
0.0, 0.0,
0.0, 0.0,
6.0,
4.0, 4.0,
5.0, 5.0,
5.0 6.0,
1.0,
2.0,
4.0,
3.0,
3.0,
0.0,
6.0,
5.0,
4.0,
1.0,
6.0,
1.0,
2.0,
4.0,
1.0,
6.0,
1.0,
4.0,
27.0
], ],
"washingstart": 15, "washingstart": 37,
"appliance_starts": { "appliance_starts": {
"dishwasher1": [ "dishwasher1": [
"2025-01-15 15:00:00+01:00" "2025-01-16 13:00:00+01:00"
] ]
} }
} }