feat(optimization): schedule any number of flexible consumers

Replace the single hourly "dishwasher" home appliance with a list of
flexible consumers (home_appliances). Each consumer defines its load
either as an explicit power profile (energy-preservingly resampled onto
the optimization slot grid, incl. 15-min and non-integer interval ratios)
or the flat consumption_wh/duration_h fallback, and runs ONCE or DAILY
within its time windows and the optimization horizon.

- ConsumerScheduleMode + shared load-definition validation (XOR of
  profile/fallback, reject negative/NaN/inf, unique device_id)
- ApplianceGeneLayout: variable appliance gene block (index into
  allowed_start_slots), ONCE/DAILY calendar-day based, no snapping
- per-device output: result.home_appliance_energy_wh, appliance_starts
  (absolute local times), per-device solution columns and DDBC RUN/OFF
  instructions on state transitions only
- deprecate dishwasher/washingstart/Home_appliance_wh_per_hour with
  backward-compatible mapping and explicit conflict rejection
- max_home_appliances is now an upper bound only; no demo appliance and
  no on/off behaviour
- docs, openapi.json, CHANGELOG and optimize_result_2* fixtures updated;
  new tests/test_homeappliance.py covers the mandatory test matrix

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Andreas
2026-07-15 14:19:46 +02:00
co-authored by Claude Opus 4.8
parent c59bf1b486
commit 67cf6f7d8a
21 changed files with 2505 additions and 1094 deletions
+5 -5
View File
@@ -54,7 +54,7 @@ def genetic_simulation(config_eos) -> GeneticSimulation:
battery=akku,
)
# Household device (currently not used, set to None)
# Flexible consumer (fixed start at slot 2 for this deterministic test)
home_appliance = HomeAppliance(
HomeApplianceParameters(
device_id="dishwasher1",
@@ -65,6 +65,7 @@ def genetic_simulation(config_eos) -> GeneticSimulation:
optimization_hours=config_eos.optimization.horizon_hours,
prediction_hours=config_eos.prediction.hours,
)
home_appliance.build_load_curve([2])
# Example initialization of electric car battery
eauto = Battery(
@@ -246,7 +247,7 @@ def genetic_simulation(config_eos) -> GeneticSimulation:
prediction_hours=config_eos.prediction.hours,
inverter=inverter,
ev=eauto,
home_appliance=home_appliance,
home_appliances=[home_appliance],
)
# Init for test
@@ -259,7 +260,6 @@ def genetic_simulation(config_eos) -> GeneticSimulation:
simulation.dc_charge_hours[start_hour] = 1.0
simulation.bat_discharge_hours[start_hour] = 1.0
simulation.ev_charge_hours[start_hour] = 1.0
simulation.home_appliance_start_hour = 2
return simulation
@@ -362,8 +362,8 @@ def test_simulation(genetic_simulation):
# Check home appliances
assert (
sum(simulation.home_appliance.get_load_curve()) == 2000
), "The sum of 'simulation.home_appliance.get_load_curve()' should be 2000."
sum(simulation.home_appliances[0].get_load_curve()) == 2000
), "The sum of 'simulation.home_appliances[0].get_load_curve()' should be 2000."
assert (
np.nansum(
+3 -3
View File
@@ -50,7 +50,7 @@ def genetic_simulation_2(config_eos) -> GeneticSimulation:
battery = akku,
)
# Household device (currently not used, set to None)
# Flexible consumer (fixed start at slot 2 for this deterministic test)
home_appliance = HomeAppliance(
HomeApplianceParameters(
device_id="dishwasher1",
@@ -61,6 +61,7 @@ def genetic_simulation_2(config_eos) -> GeneticSimulation:
optimization_hours = config_eos.optimization.horizon_hours,
prediction_hours = config_eos.prediction.hours,
)
home_appliance.build_load_curve([2])
# Example initialization of electric car battery
eauto = Battery(
@@ -148,7 +149,7 @@ def genetic_simulation_2(config_eos) -> GeneticSimulation:
prediction_hours = config_eos.prediction.hours,
inverter=inverter,
ev=eauto,
home_appliance=home_appliance,
home_appliances=[home_appliance],
)
ac = np.full(config_eos.prediction.hours, 0.0)
@@ -157,7 +158,6 @@ def genetic_simulation_2(config_eos) -> GeneticSimulation:
dc = np.full(config_eos.prediction.hours, 0.0)
dc[11] = 1
simulation.dc_charge_hours = dc
simulation.home_appliance_start_hour = 2
return simulation
+355
View File
@@ -0,0 +1,355 @@
"""Tests for flexible consumers (home appliances).
Covers the energy-preserving load profile, allowed start computation, the
appliance genome layout (ONCE/DAILY), multi-device scheduling and the
deprecated single-appliance compatibility path.
"""
import numpy as np
import pytest
from pydantic import ValidationError
from akkudoktoreos.config.configabc import TimeWindow, TimeWindowSequence
from akkudoktoreos.core.cache import CacheEnergyManagementStore
from akkudoktoreos.core.coreabc import get_ems
from akkudoktoreos.devices.devices import DevicesCommonSettings
from akkudoktoreos.devices.genetic.homeappliance import (
HomeAppliance,
resample_power_to_slot_energy,
)
from akkudoktoreos.optimization.genetic.genetic import GeneticOptimization
from akkudoktoreos.optimization.genetic.geneticdevices import HomeApplianceParameters
from akkudoktoreos.optimization.genetic.geneticparams import GeneticOptimizationParameters
from akkudoktoreos.utils.datetimeutil import to_datetime, to_duration, to_time
ems_eos = get_ems(init=True)
def _appliance(prediction_hours: int, slot_duration_h: float, **params) -> HomeAppliance:
return HomeAppliance(
HomeApplianceParameters(**params),
optimization_hours=prediction_hours,
prediction_hours=prediction_hours,
slot_duration_h=slot_duration_h,
)
def _ems(n: int, load: float = 500.0) -> dict:
return {
"pv_prognose_wh": [0.0] * n,
"strompreis_euro_pro_wh": [0.0003] * n,
"einspeiseverguetung_euro_pro_wh": 0.00007,
"preis_euro_pro_wh_akku": 0.0001,
"gesamtlast": [load] * n,
}
# --------------------------------------------------------------------------- #
# Energy-preserving resampling
# --------------------------------------------------------------------------- #
@pytest.mark.parametrize(
"input_interval, slot_interval",
[(3600, 900), (900, 3600), (600, 900), (1200, 900), (1800, 900), (3600, 3600)],
)
def test_resample_conserves_energy(input_interval: int, slot_interval: int):
"""Energy is conserved for integer and non-integer interval ratios."""
power = [1000.0, 0.0, 500.0, 2500.0, 750.0]
energy = resample_power_to_slot_energy(power, input_interval, slot_interval)
expected = sum(p * input_interval / 3600 for p in power)
assert energy.sum() == pytest.approx(expected)
assert (energy >= 0).all()
def test_flat_fallback_hourly_matches_legacy():
"""The flat consumption_wh/duration_h fallback reproduces the legacy curve."""
appliance = _appliance(48, 1.0, device_id="dw", consumption_wh=2000, duration_h=2)
assert appliance.run_slots == 2
assert list(appliance.run_energy_wh) == [1000.0, 1000.0]
appliance.build_load_curve([5])
curve = appliance.get_load_curve()
assert curve[5] == 1000.0 and curve[6] == 1000.0
assert curve.sum() == 2000.0
def test_flat_fallback_15min_grid():
"""The flat fallback resamples onto the quarter-hour grid, conserving energy."""
appliance = _appliance(192, 0.25, device_id="dw", consumption_wh=2000, duration_h=2)
assert appliance.run_slots == 8 # 2 h -> 8 quarter-hours
assert appliance.run_energy_wh.sum() == pytest.approx(2000.0)
assert all(value == pytest.approx(250.0) for value in appliance.run_energy_wh)
def test_build_load_curve_overlapping_runs_add():
"""Overlapping runs of one appliance sum their per-slot energy."""
appliance = _appliance(
10, 1.0, device_id="d", load_profile_power_w=[3600.0, 3600.0], load_profile_interval_seconds=3600
)
appliance.build_load_curve([2, 3]) # runs occupy [2,3] and [3,4] -> overlap at 3
curve = appliance.get_load_curve()
assert curve[2] == pytest.approx(3600.0)
assert curve[3] == pytest.approx(7200.0)
assert curve[4] == pytest.approx(3600.0)
# --------------------------------------------------------------------------- #
# Allowed start slots and time windows
# --------------------------------------------------------------------------- #
def test_allowed_start_slots_time_window_and_horizon():
"""Only starts whose full run fits a window and the horizon are allowed."""
slot0 = to_datetime("2026-07-15 00:00:00")
windows = TimeWindowSequence(
windows=[TimeWindow(start_time=to_time("10:00"), duration=to_duration("3 hours"))]
)
appliance = _appliance(
48, 1.0, device_id="d", consumption_wh=1000, duration_h=1, time_windows=windows
)
allowed = appliance.allowed_start_slots(
slot0_datetime=slot0, earliest_slot=0, horizon_end_slot=48
)
# window 10:00-13:00, run 1 h -> starts 10,11,12 each day (+24 on day 1)
assert allowed == [10, 11, 12, 34, 35, 36]
def test_allowed_start_slots_window_over_midnight():
"""A window crossing midnight yields starts on both sides of midnight."""
slot0 = to_datetime("2026-07-15 00:00:00")
windows = TimeWindowSequence(
windows=[TimeWindow(start_time=to_time("23:00"), duration=to_duration("3 hours"))]
)
appliance = _appliance(
48, 1.0, device_id="d", consumption_wh=1000, duration_h=1, time_windows=windows
)
allowed = appliance.allowed_start_slots(
slot0_datetime=slot0, earliest_slot=0, horizon_end_slot=48
)
# 23:00-02:00 window: a run starting at 23:00 crosses midnight (ends 00:00).
# TimeWindow evaluates the window on the start's own calendar day, so the
# only allowed start per day is 23:00 (slot 23 on day 0, slot 47 on day 1).
assert allowed == [23, 47]
def test_allowed_start_slots_weekday_restriction():
"""A weekday-restricted window only allows starts on that weekday."""
slot0 = to_datetime("2026-07-15 00:00:00") # Wednesday
weekday = slot0.day_of_week
windows = TimeWindowSequence(
windows=[
TimeWindow(
start_time=to_time("10:00"), duration=to_duration("2 hours"), day_of_week=weekday
)
]
)
appliance = _appliance(
72, 1.0, device_id="d", consumption_wh=1000, duration_h=1, time_windows=windows
)
allowed = appliance.allowed_start_slots(
slot0_datetime=slot0, earliest_slot=0, horizon_end_slot=72
)
# Only day 0 (the Wednesday) matches: starts 10, 11
assert allowed == [10, 11]
# --------------------------------------------------------------------------- #
# Genome layout (ONCE / DAILY)
# --------------------------------------------------------------------------- #
def _optimizer(config_eos, *, prediction_hours: int, horizon_hours: int, interval: int, hour: int):
config_eos.merge_settings_from_dict(
{
"prediction": {"hours": prediction_hours},
"optimization": {"horizon_hours": horizon_hours, "interval": interval},
}
)
ems_eos.set_start_datetime(to_datetime().set(hour=hour, minute=0))
return GeneticOptimization(fixed_seed=1)
def test_once_layout_single_gene(config_eos):
opt = _optimizer(config_eos, prediction_hours=48, horizon_hours=48, interval=3600, hour=10)
slot0 = opt.ems.start_datetime.set(hour=0, minute=0, second=0, microsecond=0)
appliance = _appliance(48, 1.0, device_id="d", consumption_wh=1000, duration_h=2)
layout = opt._build_appliance_layout([appliance], slot0)
assert layout.n_genes == 1
assert layout.genes[0].run_date is None
assert layout.genes[0].allowed_start_slots[0] == opt._start_day_slot()
def test_once_no_valid_start_raises(config_eos):
opt = _optimizer(config_eos, prediction_hours=48, horizon_hours=10, interval=3600, hour=10)
slot0 = opt.ems.start_datetime.set(hour=0, minute=0, second=0, microsecond=0)
# 02:00 window is in the past (start slot 10) and day 1 is beyond the 10 h horizon.
windows = TimeWindowSequence(
windows=[TimeWindow(start_time=to_time("02:00"), duration=to_duration("1 hours"))]
)
appliance = _appliance(
48, 1.0, device_id="d", consumption_wh=500, duration_h=1, time_windows=windows
)
with pytest.raises(ValueError, match="no valid start"):
opt._build_appliance_layout([appliance], slot0)
def test_daily_layout_one_gene_per_calendar_day(config_eos):
opt = _optimizer(config_eos, prediction_hours=72, horizon_hours=72, interval=3600, hour=0)
slot0 = opt.ems.start_datetime.set(hour=0, minute=0, second=0, microsecond=0)
windows = TimeWindowSequence(
windows=[TimeWindow(start_time=to_time("10:00"), duration=to_duration("2 hours"))]
)
appliance = _appliance(
72,
1.0,
device_id="d",
consumption_wh=500,
duration_h=1,
schedule_mode="DAILY",
time_windows=windows,
)
layout = opt._build_appliance_layout([appliance], slot0)
assert layout.n_genes == 3 # 3 calendar days in the 72 h horizon
assert len({gene.run_date for gene in layout.genes}) == 3
for gene in layout.genes:
assert len(gene.allowed_start_slots) == 2 # starts 10 and 11 on each day
def test_daily_layout_partial_first_day(config_eos):
"""A partial first day (start after the window) produces no gene for that day."""
opt = _optimizer(config_eos, prediction_hours=48, horizon_hours=48, interval=3600, hour=14)
slot0 = opt.ems.start_datetime.set(hour=0, minute=0, second=0, microsecond=0)
windows = TimeWindowSequence(
windows=[TimeWindow(start_time=to_time("10:00"), duration=to_duration("2 hours"))]
)
appliance = _appliance(
48,
1.0,
device_id="d",
consumption_wh=500,
duration_h=1,
schedule_mode="DAILY",
time_windows=windows,
)
layout = opt._build_appliance_layout([appliance], slot0)
# Day 0 window (10:00-12:00) is already in the past at start hour 14 -> only day 1.
assert layout.n_genes == 1
assert all(slot >= opt._start_day_slot() for slot in layout.genes[0].allowed_start_slots)
# --------------------------------------------------------------------------- #
# Multiple devices, aggregate and deprecated compatibility (integration)
# --------------------------------------------------------------------------- #
def test_multiple_appliances_scheduled_and_aggregate(config_eos):
config_eos.merge_settings_from_dict(
{
"prediction": {"hours": 48},
"optimization": {
"horizon_hours": 48,
"interval": 3600,
"genetic": {
"individuals": 60,
"generations": 10,
"penalties": {"ev_soc_miss": 10, "ac_charge_break_even": 0},
},
},
}
)
ems_eos.set_start_datetime(to_datetime().set(hour=0, minute=0))
CacheEnergyManagementStore().clear()
parameters = GeneticOptimizationParameters(
ems=_ems(48),
pv_akku=None,
inverter=None,
eauto=None,
home_appliances=[
HomeApplianceParameters(device_id="dw", consumption_wh=1000, duration_h=1),
HomeApplianceParameters(device_id="wm", consumption_wh=2000, duration_h=2),
],
)
solution = GeneticOptimization(fixed_seed=7).optimierung_ems(
parameters=parameters, start_hour=0, ngen=3
)
per_device = solution.result.home_appliance_energy_wh
assert set(per_device) == {"dw", "wm"}
assert sum(per_device["dw"]) == pytest.approx(1000.0)
assert sum(per_device["wm"]) == pytest.approx(2000.0)
# Per-device energy sums exactly to the deprecated aggregate.
aggregate = [
(per_device["dw"][i] or 0.0) + (per_device["wm"][i] or 0.0)
for i in range(len(per_device["dw"]))
]
reported = [value or 0.0 for value in solution.result.Home_appliance_wh_per_hour]
assert reported == pytest.approx(aggregate)
# Each device has an absolute start datetime.
assert set(solution.appliance_starts) == {"dw", "wm"}
assert len(solution.appliance_starts["dw"]) == 1
# DDBC instructions are only emitted on RUN/OFF transitions.
plan = solution.energy_management_plan()
dw_instructions = [i for i in plan.instructions if i.resource_id == "dw"]
modes = [str(i.operation_mode_id) for i in dw_instructions]
# A single 1 h run yields an OFF/RUN/OFF sequence (no repeated RUN).
assert modes.count("RUN") == 1
def test_duplicate_device_id_rejected():
with pytest.raises(ValidationError, match="unique"):
GeneticOptimizationParameters(
ems=_ems(2),
pv_akku=None,
inverter=None,
eauto=None,
home_appliances=[
HomeApplianceParameters(device_id="x", consumption_wh=1000, duration_h=1),
HomeApplianceParameters(device_id="x", consumption_wh=1000, duration_h=1),
],
)
def test_dishwasher_and_home_appliances_conflict_rejected():
with pytest.raises(ValidationError, match="either"):
GeneticOptimizationParameters(
ems=_ems(2),
pv_akku=None,
inverter=None,
eauto=None,
dishwasher=HomeApplianceParameters(device_id="d", consumption_wh=1000, duration_h=1),
home_appliances=[
HomeApplianceParameters(device_id="e", consumption_wh=1000, duration_h=1)
],
)
def test_deprecated_dishwasher_maps_to_list():
parameters = GeneticOptimizationParameters(
ems=_ems(2),
pv_akku=None,
inverter=None,
eauto=None,
dishwasher=HomeApplianceParameters(device_id="d", consumption_wh=1000, duration_h=1),
)
resolved = parameters.resolved_home_appliances()
assert [appliance.device_id for appliance in resolved] == ["d"]
def test_max_home_appliances_is_upper_bound():
with pytest.raises(ValidationError, match="exceeds max_home_appliances"):
DevicesCommonSettings(
max_home_appliances=1,
home_appliances=[
{"device_id": "a", "consumption_wh": 1000, "duration_h": 1},
{"device_id": "b", "consumption_wh": 1000, "duration_h": 1},
],
)
def test_start_solution_layout_mismatch_is_ignored(config_eos):
opt = _optimizer(config_eos, prediction_hours=48, horizon_hours=48, interval=3600, hour=10)
slot0 = opt.ems.start_datetime.set(hour=0, minute=0, second=0, microsecond=0)
appliance = _appliance(48, 1.0, device_id="d", consumption_wh=1000, duration_h=1)
opt.appliance_layout = opt._build_appliance_layout([appliance], slot0)
opt.optimize_ev = False
valid_index_count = len(opt.appliance_layout.genes[0].allowed_start_slots)
# A tail index beyond the allowed range must be rejected.
bad_solution = [0] * opt.total_slots + [valid_index_count + 5]
assert opt._start_solution_matches_layout(bad_solution) is False
good_solution = [0] * opt.total_slots + [0]
assert opt._start_solution_matches_layout(good_solution) is True
+11 -3
View File
@@ -277,7 +277,7 @@ class TestAcChargingInSimulation:
prediction_hours=prediction_hours,
inverter=inverter,
ev=None,
home_appliance=None,
home_appliances=None,
)
return sim, akku, inverter
@@ -553,7 +553,10 @@ def _run_evaluate_with_mocked_sim(
- self.simulation is replaced by mock_sim
Then call evaluate() and return the fitness tuple.
"""
from akkudoktoreos.optimization.genetic.genetic import GeneticOptimization
from akkudoktoreos.optimization.genetic.genetic import (
ApplianceGeneLayout,
GeneticOptimization,
)
config_eos.merge_settings_from_dict(
{
@@ -572,6 +575,7 @@ def _run_evaluate_with_mocked_sim(
optim.optimize_ev = False
optim.verbose = False
optim.opti_param = {"home_appliance": 0}
optim.appliance_layout = ApplianceGeneLayout([])
optim.simulation = mock_sim
# evaluate_inner() just returns the base balance; we test the *additional* penalty
@@ -602,7 +606,10 @@ def _run_evaluate_with_mocked_sim(
def _run_evaluate_with_mocked_ev_soc(config_eos, ev_soc_percentage: float) -> float:
"""Return fitness for a mocked EV SoC while EV optimization is active."""
from akkudoktoreos.optimization.genetic.genetic import GeneticOptimization
from akkudoktoreos.optimization.genetic.genetic import (
ApplianceGeneLayout,
GeneticOptimization,
)
config_eos.merge_settings_from_dict(
{
@@ -620,6 +627,7 @@ def _run_evaluate_with_mocked_ev_soc(config_eos, ev_soc_percentage: float) -> fl
optim.optimize_ev = True
optim.verbose = False
optim.opti_param = {"home_appliance": 0}
optim.appliance_layout = ApplianceGeneLayout([])
mock_ev = Mock()
mock_ev.current_soc_percentage.return_value = ev_soc_percentage
+20 -10
View File
@@ -221,7 +221,7 @@ def test_hourly_start_solution_is_expanded_to_slots(config_eos: ConfigEOS):
opt.optimize_ev = False
hourly = list(range(48))
migrated = opt._start_solution_for_slot_grid(hourly, has_appliance=False)
migrated = opt._start_solution_for_slot_grid(hourly)
assert len(migrated) == 192
assert migrated[:8] == [0, 0, 0, 0, 1, 1, 1, 1]
@@ -242,8 +242,8 @@ def test_quarter_hour_mutation_probability_preserves_hourly_rate(config_eos: Con
assert opt.toolbox.mutate_charge_discharge.keywords["indpb"] == pytest.approx(0.05)
def test_sub_hourly_home_appliance_is_rejected(config_eos: ConfigEOS):
"""An hourly appliance model must not silently run on slot indices."""
def test_sub_hourly_home_appliance_is_scheduled(config_eos: ConfigEOS):
"""A home appliance is scheduled on the 15-min slot grid and delivers its energy."""
config_eos.merge_settings_from_dict(
{
"prediction": {"hours": 48},
@@ -252,18 +252,28 @@ def test_sub_hourly_home_appliance_is_rejected(config_eos: ConfigEOS):
)
parameters = load_hourly_parameters().model_copy(
update={
"dishwasher": HomeApplianceParameters(
device_id="dishwasher", consumption_wh=1200, duration_h=2
)
"home_appliances": [
HomeApplianceParameters(
device_id="dishwasher1", consumption_wh=1200, duration_h=2
)
]
},
deep=True,
)
ems_eos.set_start_datetime(to_datetime().set(hour=10, minute=0))
CacheEnergyManagementStore().clear()
with pytest.raises(ValueError, match="Home-appliance scheduling"):
GeneticOptimization(fixed_seed=42).optimierung_ems(
parameters=parameters, start_hour=10, ngen=1
)
genetic_solution = GeneticOptimization(fixed_seed=42).optimierung_ems(
parameters=parameters, start_hour=10, ngen=3
)
# The appliance runs exactly once and delivers its full energy on the 15-min grid.
energy = genetic_solution.result.home_appliance_energy_wh["dishwasher1"]
assert sum(energy) == pytest.approx(1200.0)
# The run occupies 2 h = 8 quarter-hour slots at 1200/2 = 600 W -> 150 Wh/slot.
assert max(energy) == pytest.approx(150.0)
# A single start time is reported as an absolute datetime.
assert len(genetic_solution.appliance_starts["dishwasher1"]) == 1
def test_optimize_15min_slot_grid(config_eos: ConfigEOS):
+338 -291
View File
@@ -10,12 +10,24 @@
0.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,
0.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1.0,
1.0,
0.0,
@@ -25,7 +37,6 @@
0.0,
1.0,
1.0,
1.0,
0.0,
0.0,
0.0,
@@ -36,17 +47,6 @@
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1.0,
0.0,
1.0,
0.0,
0.0
],
"dc_charge": [
@@ -110,7 +110,11 @@
0,
0,
0,
0,
1,
1,
0,
0,
0,
0,
0,
@@ -121,19 +125,18 @@
0,
0,
1,
1,
0,
0,
0,
0,
1,
0,
0,
0,
1,
1,
1,
1,
0,
1,
1,
1,
0,
0,
0,
1,
@@ -142,9 +145,6 @@
1,
1,
1,
1,
0,
0,
0,
1,
1
@@ -161,15 +161,15 @@
0.0,
0.0,
0.0,
0.875,
0.75,
0.0,
0.875,
0.75,
1.0,
0.625,
0.375,
1.0,
0.75,
0.875,
0.1,
0.75,
0.0,
0.0,
0.0,
0.0,
@@ -202,28 +202,28 @@
],
"result": {
"Last_Wh_pro_Stunde": [
1053.07,
10240.91,
14186.477801352086,
11620.03,
10686.11504084929,
7609.82,
9082.22,
10280.78,
2177.92,
15230.07,
8929.91,
1320.56,
10061.61912107894,
13077.21553917656,
9042.82,
10393.22,
8969.78,
1129.12,
1178.71,
1050.98,
1488.5587949275546,
988.56,
912.38,
2204.61,
704.61,
516.37,
868.05,
694.34,
608.79,
556.31,
2056.31,
488.89,
506.91,
804.89,
1304.8889978824886,
1141.98,
1056.97,
992.46,
@@ -235,51 +235,51 @@
860.88,
1158.03,
1222.72,
1221.04,
949.99,
3721.04,
3449.99,
987.01,
733.99,
592.97
],
"EAuto_SoC_pro_Stunde": [
5.0,
5.0,
20.294999999999998,
33.405,
50.885000000000005,
61.809999999999995,
68.365,
81.475,
96.77,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518
33.405,
39.96,
57.440000000000005,
70.55,
85.845,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955
],
"Einnahmen_Euro_pro_Stunde": [
0.0,
@@ -288,10 +288,12 @@
0.0,
0.0,
0.0,
0.005594705401588846,
0.0016437871377312284,
0.028240415856282213,
9.722458428505041e-05,
0.0023429436853348124,
0.0692592282596561,
0.023370695807696434,
0.0019327051509204403,
8.435507117427132e-07,
0.0,
0.0,
0.0,
@@ -305,27 +307,54 @@
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.09023487592359272,
0.03692581803776506,
0.09634325718089931,
0.038455087951794004,
0.31400739999999994,
0.2577866264025879,
0.15146384621553569,
0.09798107754792196,
0.029150936607659956,
0.020928608511559126,
0.003524558735906156,
0.0,
0.0,
0.0,
0.0,
0.0
],
"Gesamt_Verluste": 6008.882879266785,
"Gesamtbilanz_Euro": 13.081213953988335,
"Gesamteinnahmen_Euro": 0.7099201341480623,
"Gesamtkosten_Euro": 13.791134088136397,
"Gesamt_Verluste": 6850.393259430652,
"Gesamtbilanz_Euro": 13.198417631718888,
"Gesamteinnahmen_Euro": 1.1191176909827683,
"Gesamtkosten_Euro": 14.317535322701657,
"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,
@@ -334,113 +363,126 @@
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
],
"home_appliance_energy_wh": {
"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,
2500.0,
2500.0,
0.0,
0.0,
0.0
]
},
"Kosten_Euro_pro_Stunde": [
3.26035212,
0.7712613792641736,
0.0,
2.034522392,
2.737606326,
1.9651220859999998,
0.9176848434271027,
0.5064650351737862,
1.1459236583154115,
1.6539907068609285,
0.1912938683161112,
1.672937586,
1.342948866431813,
0.770122611209644,
1.4257539978642364,
1.3586609716653002,
0.05258762370598476,
0.1614775630079859,
0.0,
0.4396171120740812,
0.0,
0.61288158,
0.174739608,
0.28801899,
0.2338232746714084,
0.29116746986009023,
0.26650619799999997,
0.19588158,
0.0,
0.0,
0.22802125600000003,
0.199865757,
0.676320359,
0.162995926,
0.0,
0.42921344809282075,
0.25364873699864443,
0.1306329312971816,
0.0,
0.16677339,
0.0,
0.0,
0.0,
0.07362195915902499,
0.060401289430882174,
0.009619897970888898,
0.07029121023060134,
4.179128154646605e-17,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.17784012884918773,
0.19011028252189552,
0.293043269,
0.0,
0.0
],
"Netzbezug_Wh_pro_Stunde": [
14299.789999999999,
3486.7150961309835,
0.0,
9197.66,
13079.82,
10458.34,
4992.84463235638,
2527.2706345997312,
5213.483431826258,
7286.3026733961615,
638.2845122326032,
8903.34,
7306.577075254695,
3842.9272016449304,
6486.596896561585,
5985.290624076212,
175.4675465665157,
505.40708296709204,
0.0,
1480.6908456520082,
0.0,
2204.61,
516.37,
868.05,
758.9200735845777,
980.6920507244535,
912.38,
704.61,
0.0,
0.0,
694.34,
608.79,
2056.31,
488.89,
0.0,
1299.8590190576037,
833.8222781020527,
537.58407941227,
0.0,
506.91,
0.0,
0.0,
0.0,
322.9033296448464,
273.0618871197205,
45.96224544141853,
374.088399311343,
2.2737367544323206e-13,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
556.6201215937018,
617.0408390843736,
987.01,
0.0,
0.0
@@ -452,10 +494,12 @@
0.0,
0.0,
0.0,
79.92436287984066,
23.482673396160408,
403.4345122326031,
1.3889226326435775,
33.47062407621161,
989.4175465665157,
333.86708296709196,
27.61007358457772,
0.012050724453467332,
0.0,
0.0,
0.0,
@@ -469,92 +513,68 @@
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1289.0696560513247,
527.5116862537866,
1376.3322454414188,
549.358399311343,
4485.82,
3682.6660914655417,
2163.76923165051,
1399.729679256028,
416.4419515379994,
298.9801215937018,
50.35083908437366,
0.0,
0.0,
0.0,
0.0,
0.0
],
"Verluste_Pro_Stunde": [
97.85621559422765,
483.0,
1014.0000000000001,
552.0,
440.15935588276557,
259.38247615196775,
416.54628827357027,
483.0,
55.200000000000045,
1083.0,
1014.0066115357181,
114.42806532440363,
806.9999999999999,
752.8472490305633,
452.3012641973916,
490.424156871473,
414.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
70.41409090909087,
118.37045454545455,
0.0,
0.0,
106.80230977350088,
60.001301478240954,
124.41545454545451,
180.0,
0.0,
69.12409090909085,
60.00108228691243,
3.2918733722463145,
22.312089529472388,
98.21987178167876,
23.32202410391207,
0.0,
0.0,
94.68272727272722,
83.01681818181817,
75.86045454545456,
66.66681818181814,
0.0,
109.07302361034766,
116.99491129525349,
95.61900944932736,
54.18759955738153,
86.6234264543665,
171.42744837680007,
116.9350623689079,
383.6100412738411,
0.03390853445803674,
2.900768349489402,
16.700320743972142,
81.2380484620021,
0.0,
0.0,
377.3215838283509,
418.18661420587983,
0.0,
100.08954545454549,
80.85954545454547
],
"akku_soc_pro_stunde": [
80.0,
79.16421888032488,
79.16421888032488,
95.83088554699157,
95.83088554699157,
98.47420098817949,
99.9292697701786,
100.0,
100.0,
100.0,
100.0,
96.82533215994886,
98.49203497878888,
94.56477946914701,
99.564779469147,
99.564779469147,
99.564779469147,
96.57605701735636,
93.95557664545554,
91.56099159035911,
89.45660970330677,
89.45660970330677,
86.01371946235848,
82.51604934381585,
80.82184855044719,
82.32705964926333,
84.7332659396624,
89.12319984732603,
89.34416552017109,
96.66666666666667,
77.72745638104269,
76.48409249723811,
93.15075916390477,
98.72984941475377,
99.79377342023686,
100.0,
100.0,
100.0,
@@ -563,7 +583,29 @@
100.0,
100.0,
100.0,
96.84060778236915
97.77733298898072,
94.04089187327823,
94.04089187327823,
94.04089187327823,
99.04089187327823,
99.04089187327823,
96.85894455922863,
98.52564128942065,
98.6170822164275,
99.23686248113506,
99.35216599711354,
100.0,
100.0,
100.0,
100.0,
100.0,
100.0,
100.0,
100.0,
88.1251455158017,
74.92485531047642,
74.92485531047642,
71.76546309284556
],
"Electricity_price": [
0.000228,
@@ -660,15 +702,15 @@
0.0,
0.0,
0.0,
0.875,
0.75,
0.0,
0.875,
0.75,
1.0,
0.625,
0.375,
1.0,
0.75,
0.875,
0.1,
0.75,
0.0,
0.0,
0.0,
0.0,
@@ -753,44 +795,47 @@
"capacity_wh": 60000,
"charging_efficiency": 0.95,
"max_charge_power_w": 11040,
"soc_wh": 59110.8,
"soc_wh": 59373.0,
"initial_soc_percentage": 5
},
"start_solution": [
2.0,
1.0,
1.0,
0.0,
1.0,
1.0,
0.0,
2.0,
2.0,
1.0,
2.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,
2.0,
1.0,
1.0,
1.0,
0.0,
2.0,
0.0,
2.0,
0.0,
2.0,
1.0,
2.0,
0.0,
2.0,
1.0,
2.0,
1.0,
2.0,
2.0,
2.0,
1.0,
1.0,
1.0,
1.0,
0.0,
1.0,
1.0,
1.0,
0.0,
0.0,
1.0,
@@ -799,61 +844,63 @@
1.0,
1.0,
1.0,
1.0,
2.0,
0.0,
2.0,
1.0,
1.0,
6.0,
2.0,
1.0,
1.0,
6.0,
4.0,
6.0,
4.0,
2.0,
5.0,
0.0,
5.0,
4.0,
6.0,
3.0,
1.0,
4.0,
5.0,
3.0,
6.0,
5.0,
3.0,
0.0,
5.0,
4.0,
0.0,
1.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,
6.0,
1.0,
5.0,
5.0,
0.0,
0.0,
0.0,
5.0,
3.0,
5.0,
2.0,
0.0,
0.0,
4.0,
5.0,
0.0,
0.0,
6.0,
1.0,
1.0,
6.0,
0.0,
5.0,
2.0,
6.0,
3.0,
4.0,
5.0,
6.0,
2.0,
2.0,
14.0
33.0
],
"washingstart": 14
"washingstart": 43,
"appliance_starts": {
"dishwasher1": [
"2026-07-16 19:00:00+02:00"
]
}
}
+276 -229
View File
@@ -11,18 +11,13 @@
0.0,
0.0,
1.0,
0.0,
1.0,
0.0,
1.0,
0.0,
0.0,
0.0,
1.0,
0.0,
1.0,
0.0,
0.0,
1.0,
0.0,
0.0,
0.0,
@@ -42,7 +37,12 @@
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,
@@ -113,7 +113,6 @@
0,
0,
0,
0,
1,
1,
0,
@@ -123,7 +122,7 @@
1,
0,
0,
1,
0,
0,
0,
1,
@@ -134,6 +133,11 @@
1,
1,
1,
1,
1,
0,
0,
1,
0,
0,
1,
@@ -142,10 +146,6 @@
1,
1,
1,
0,
1,
0,
1,
1,
0
],
@@ -161,17 +161,17 @@
0.0,
0.0,
0.0,
1.0,
0.75,
0.625,
0.5,
0.375,
0.875,
0.5,
0.0,
1.0,
0.0,
0.375,
0.375,
1.0,
0.0,
0.75,
0.0,
0.0,
0.0,
0.375,
0.6,
0.0,
0.0,
0.0,
@@ -202,24 +202,24 @@
],
"result": {
"Last_Wh_pro_Stunde": [
16541.07,
8929.91,
8375.540038207693,
6376.03,
5096.67,
12853.82,
8960.220000000001,
13936.309375923789,
1129.12,
1178.71,
1050.98,
15230.07,
1525.2526751616956,
11808.56,
1132.03,
7596.67,
7609.82,
13190.760676868524,
1103.78,
8995.119999999999,
5111.71,
7343.779999999999,
988.56,
1412.38,
5912.38,
704.61,
516.37,
868.05,
694.34,
2608.79,
608.79,
556.31,
488.89,
506.91,
@@ -243,55 +243,54 @@
],
"EAuto_SoC_pro_Stunde": [
5.0,
22.48,
35.589999999999996,
46.515,
55.254999999999995,
61.809999999999995,
77.105,
85.845,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955,
98.955
20.294999999999998,
20.294999999999998,
37.775,
37.775,
44.330000000000005,
50.885000000000005,
68.365,
68.365,
81.475,
88.03,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518,
98.518
],
"Einnahmen_Euro_pro_Stunde": [
0.0,
0.0,
0.0,
0.0,
0.024981227816847,
0.0,
0.0,
0.0,
0.038217249326498136,
0.023370695807696434,
0.10263928607047809,
0.0002638810165675977,
0.0,
0.0,
0.0,
@@ -310,29 +309,30 @@
0.0,
0.0,
0.0,
0.19904591069188757,
0.2577866264025879,
0.0,
0.035969913516850464,
0.2577971476677123,
0.15146384621553569,
0.09798107754792196,
0.05435777788576338,
0.029150936607659956,
0.0,
0.0,
0.0,
0.0,
0.0
],
"Gesamt_Verluste": 7095.270423117038,
"Gesamtbilanz_Euro": 14.155149367775268,
"Gesamteinnahmen_Euro": 0.847204411694738,
"Gesamtkosten_Euro": 15.002353779470006,
"Gesamt_Verluste": 7723.761220821238,
"Gesamtbilanz_Euro": 14.859522880677414,
"Gesamteinnahmen_Euro": 0.6752660886427261,
"Gesamtkosten_Euro": 15.53478896932014,
"Home_appliance_wh_per_hour": [
0.0,
0.0,
0.0,
0.0,
2500.0,
2500.0,
0.0,
2500.0,
2500.0,
0.0,
0.0,
0.0,
@@ -365,83 +365,125 @@
0.0,
0.0
],
"home_appliance_energy_wh": {
"dishwasher1": [
0.0,
0.0,
0.0,
0.0,
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
]
},
"Kosten_Euro_pro_Stunde": [
3.55926012,
1.7445413792641737,
1.5214016280281666,
0.9799189133780641,
3.26035212,
0.1921289942880966,
2.2398909259999997,
0.0,
0.6146086578009714,
1.120219902993293,
2.4860631399999997,
0.05258762370598476,
0.1614775630079859,
0.0,
0.5064650351737862,
2.0366107701900296,
0.005881449073870462,
2.11462917272379,
0.0,
2.1641282909999995,
0.29116746986009023,
0.41255619800000004,
0.0,
1.727006198,
0.19588158,
0.174739608,
0.28801899,
0.0,
0.856465757,
0.22802125600000003,
0.0,
0.0,
0.162995926,
0.0,
0.0,
0.16677339,
0.0,
0.0,
0.0,
0.07362195915902499,
0.060401289430882174,
0.009619897970888898,
0.0,
4.179128154646605e-17,
2.3325608707865465e-05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.08357424731947552,
0.0,
0.19011028252189552,
0.0,
0.0,
0.16484566
],
"Netzbezug_Wh_pro_Stunde": [
15610.789999999999,
7886.7150961309835,
7268.9996561307535,
5215.108639585227,
14299.789999999999,
868.5759235447405,
10701.82,
0.0,
3066.9094700647274,
5096.541869851197,
10951.82,
175.4675465665157,
505.40708296709204,
0.0,
2527.2706345997312,
9265.745087306777,
25.909467285772962,
7055.819728808107,
0.0,
7024.109999999999,
980.6920507244535,
1412.38,
0.0,
5912.38,
704.61,
516.37,
868.05,
0.0,
2608.79,
694.34,
0.0,
0.0,
488.89,
0.0,
0.0,
506.91,
0.0,
0.0,
0.0,
322.9033296448464,
273.0618871197205,
45.96224544141853,
0.0,
2.2737367544323206e-13,
0.11639525303326081,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
278.85968408233407,
0.0,
617.0408390843736,
0.0,
0.0,
592.97
],
@@ -450,12 +492,11 @@
0.0,
0.0,
0.0,
356.87468309781434,
0.0,
0.0,
0.0,
545.9607046642591,
333.86708296709196,
1466.2755152925442,
3.769728808108539,
0.0,
0.0,
0.0,
@@ -474,11 +515,12 @@
0.0,
0.0,
0.0,
2843.513009884108,
3682.6660914655417,
0.0,
513.8559073835781,
3682.816395253033,
2163.76923165051,
1399.729679256028,
776.5396840823341,
416.4419515379994,
0.0,
0.0,
0.0,
@@ -486,41 +528,41 @@
0.0
],
"Verluste_Pro_Stunde": [
1152.0,
414.0066115357181,
405.0215587356905,
276.0922367502273,
333.15830172751845,
1098.8591364077674,
288.74422438214356,
1013.9999999999997,
53.21482102827082,
0.0,
106.80230977350088,
1083.0,
101.74991082536883,
552.0,
106.67021307906845,
567.0367126720731,
259.38247615196775,
735.7686104768134,
56.857674239187475,
414.0,
766.976146106431,
331.2000000000007,
0.0014460869344160802,
60.0,
96.08318181818186,
600.0,
0.0,
0.0,
94.68272727272722,
240.0,
118.37045454545455,
0.0,
83.01681818181817,
75.86045454545456,
66.66681818181814,
0.0,
69.12409090909085,
109.07302361034766,
116.99491129525349,
95.61900944932736,
54.18759955738153,
98.21987178167876,
86.6234264543665,
171.42744837680007,
165.15986945297027,
116.9350623689079,
197.07683881390702,
0.03390853445803674,
476.63569111397055,
0.0,
2.900768349489402,
16.700320743972142,
0.0,
81.2380484620021,
111.78035844493081,
6.04210069012484,
90.18403329253945,
134.59227272727276,
100.08954545454549,
0.0
@@ -528,42 +570,42 @@
"akku_soc_pro_stunde": [
80.0,
96.66666666666667,
96.66685032043661,
98.33411584087247,
98.33667797282322,
100.0,
81.50113762748849,
81.85514386032581,
98.52181052699248,
99.49305307848245,
99.49305307848245,
99.20134772591024,
91.86086775366753,
93.31593653566664,
98.42062016002258,
100.0,
100.0,
96.82533215994886,
96.82537232903037,
98.49203899569704,
95.45911027668879,
95.45911027668879,
95.45911027668879,
92.47038782489815,
99.13705449156481,
96.7424694364684,
94.63808754941604,
94.63808754941604,
91.19519730846775,
87.69752718992511,
86.00332639655647,
87.50853749537262,
89.91474378577168,
94.30467769343532,
94.52564336628036,
82.33137823444534,
82.33137823444534,
82.33141840352684,
98.99808507019351,
98.99808507019351,
98.99808507019351,
95.26164395449102,
95.26164395449102,
92.6411635825902,
90.24657852749377,
90.24657852749377,
88.06463121344417,
84.6217409724959,
81.12407085395327,
79.4298700605846,
79.54517357656309,
81.95137986696216,
86.53915401843355,
86.76011969127859,
100.0,
100.0,
100.0,
100.0,
100.0,
98.60068046043587,
98.76851659071711,
94.52002313341684,
91.360630915786
96.11252124341868,
91.86402778611841,
88.70463556848756
],
"Electricity_price": [
0.000228,
@@ -660,17 +702,17 @@
0.0,
0.0,
0.0,
1.0,
0.75,
0.625,
0.5,
0.375,
0.875,
0.5,
0.0,
1.0,
0.0,
0.375,
0.375,
1.0,
0.0,
0.75,
0.0,
0.0,
0.0,
0.375,
0.6,
0.0,
0.0,
0.0,
@@ -753,44 +795,48 @@
"capacity_wh": 60000,
"charging_efficiency": 0.95,
"max_charge_power_w": 11040,
"soc_wh": 59373.0,
"soc_wh": 59110.8,
"initial_soc_percentage": 5
},
"start_solution": [
0.0,
0.0,
2.0,
0.0,
1.0,
2.0,
1.0,
0.0,
2.0,
2.0,
2.0,
0.0,
2.0,
0.0,
1.0,
2.0,
2.0,
2.0,
1.0,
1.0,
0.0,
2.0,
0.0,
2.0,
0.0,
1.0,
0.0,
0.0,
2.0,
1.0,
0.0,
0.0,
1.0,
2.0,
0.0,
1.0,
1.0,
0.0,
1.0,
1.0,
1.0,
1.0,
1.0,
0.0,
0.0,
1.0,
0.0,
0.0,
1.0,
@@ -799,61 +845,62 @@
1.0,
1.0,
1.0,
2.0,
1.0,
0.0,
1.0,
1.0,
3.0,
0.0,
1.0,
6.0,
5.0,
3.0,
0.0,
0.0,
4.0,
6.0,
3.0,
2.0,
6.0,
4.0,
3.0,
0.0,
2.0,
1.0,
5.0,
2.0,
4.0,
4.0,
0.0,
6.0,
5.0,
0.0,
2.0,
2.0,
2.0,
4.0,
6.0,
0.0,
1.0,
4.0,
5.0,
3.0,
6.0,
3.0,
5.0,
3.0,
1.0,
6.0,
0.0,
4.0,
1.0,
5.0,
2.0,
0.0,
1.0,
4.0,
6.0,
6.0,
6.0,
6.0,
3.0,
6.0,
1.0,
5.0,
5.0,
5.0,
5.0,
2.0,
6.0,
4.0,
4.0,
5.0,
4.0,
3.0,
1.0,
6.0,
5.0,
1.0,
2.0,
3.0,
1.0,
3.0,
15.0
4.0
],
"washingstart": 15
"washingstart": 14,
"appliance_starts": {
"dishwasher1": [
"2026-07-15 14:00:00+02:00"
]
}
}
+250 -203
View File
@@ -111,12 +111,10 @@
0,
0,
0,
0,
1,
0,
0,
0,
1,
0,
1,
1,
@@ -147,6 +145,8 @@
1,
1,
1,
1,
1,
1
],
"battery_grid_export_allowed": [],
@@ -162,15 +162,15 @@
0.0,
0.0,
0.375,
0.375,
0.875,
0.5,
0.75,
0.75,
1.0,
1.0,
0.875,
0.625,
0.375,
0.375,
0.375,
0.1,
0.6,
0.0,
0.0,
0.0,
0.0,
0.0,
@@ -203,15 +203,15 @@
"result": {
"Last_Wh_pro_Stunde": [
4986.07,
4996.91,
12997.56,
14120.029999999999,
10340.67,
7731.82,
6307.91,
9186.56,
8998.03,
11651.67,
11664.82,
5149.22,
5036.78,
5062.12,
2227.51,
7396.579999999999,
1129.12,
1178.71,
1050.98,
988.56,
912.38,
@@ -236,22 +236,22 @@
1158.03,
1222.72,
1221.04,
949.99,
987.01,
3449.99,
3487.01,
733.99,
592.97
],
"EAuto_SoC_pro_Stunde": [
5.0,
11.555,
18.11,
20.294999999999998,
33.405,
50.885000000000005,
66.18,
77.105,
83.66,
90.215,
96.77,
46.515,
63.995000000000005,
81.475,
88.03,
98.518,
98.518,
98.518,
98.518,
98.518,
@@ -321,59 +321,101 @@
0.0,
0.0
],
"Gesamt_Verluste": 8404.44594732788,
"Gesamtbilanz_Euro": 7.836546975121494,
"Gesamt_Verluste": 9242.679077117135,
"Gesamtbilanz_Euro": 6.793576335409896,
"Gesamteinnahmen_Euro": 0.0,
"Gesamtkosten_Euro": 7.836546975121494,
"Gesamtkosten_Euro": 6.793576335409896,
"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,
0.0,
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,
0.0
],
"home_appliance_energy_wh": {
"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,
0.0,
2500.0,
2500.0,
0.0,
0.0
]
},
"Kosten_Euro_pro_Stunde": [
0.9248695241652183,
0.8749092776800845,
1.5678286259999998,
2.4348720859999995,
0.8528744919675278,
0.5282751491259897,
0.19137741085396395,
1.691123530177008,
1.4724745282943246,
1.0809335963311613,
1.2680155994326825,
0.0,
0.4965507655670841,
0.008761738662872717,
0.0,
0.0,
0.0,
@@ -389,14 +431,14 @@
0.0,
0.0,
0.0,
0.11338560853163265,
0.11522756438372463,
0.04079284310894048,
0.0,
0.0,
0.0,
4.179128154646605e-17,
0.0,
0.0,
0.0021886029750169123,
0.0,
0.0,
0.0,
@@ -407,13 +449,13 @@
],
"Netzbezug_Wh_pro_Stunde": [
4056.445281426396,
3955.2860654615033,
7490.82,
12958.339999999998,
4640.231185895146,
2636.103538552843,
865.1781684175585,
8079.902198647912,
7836.479660959684,
5881.031536078136,
6327.4231508616895,
0.0,
2187.4483064629258,
38.597967677853376,
0.0,
0.0,
0.0,
@@ -429,14 +471,14 @@
0.0,
0.0,
0.0,
466.6074425170068,
474.1875077519532,
178.91597854798454,
0.0,
0.0,
0.0,
2.2737367544323206e-13,
0.0,
0.0,
9.957247384062384,
0.0,
0.0,
0.0,
@@ -487,15 +529,15 @@
],
"Verluste_Pro_Stunde": [
207.07863377116755,
207.1951278553804,
1083.0,
552.0,
521.2057423074175,
395.8024246263412,
876.0621802101069,
414.00986383774955,
414.016759315162,
581.7817843293763,
573.8007781034028,
458.55183787620945,
227.23539677555112,
640.3849261442235,
253.88850337853552,
938.3973561213433,
142.6574983015977,
108.98319763338179,
106.80230977350088,
133.7321802766326,
124.41545454545451,
@@ -509,47 +551,47 @@
69.12409090909085,
109.07302361034766,
116.99491129525349,
31.990721833371907,
30.957076574061034,
73.82223834331725,
123.8591383343284,
171.42744837680007,
116.9350623689079,
538.2984000000001,
441.9538395103232,
261.1952696860876,
262.55307614755066,
184.66788225469543,
131.21108264656203,
111.78035844493081,
90.18403329253945,
134.59227272727276,
418.18661420587983,
475.50136363636375,
100.08954545454549,
80.85954545454547
],
"akku_soc_pro_stunde": [
80.0,
80.00218427142131,
80.00760448962633,
61.06821055023239,
61.06821055023239,
62.12948116988288,
63.5406596317257,
58.120614791285504,
58.682709146161926,
45.22651624410048,
39.85140827675753,
36.67674043670639,
32.45548217808278,
28.528226668440908,
25.495297949432643,
23.27263093841336,
19.53618982271088,
16.54746737092025,
13.926986999019423,
11.532401943923004,
9.428020056870663,
7.2460727428210765,
3.8031825018727887,
0.30551238333016156,
61.0645175600859,
61.06479155557894,
61.065257092111224,
61.892528879038345,
62.498106048577306,
57.07806120813711,
38.33859382766936,
40.88136845531483,
39.81878058549141,
36.64411274544027,
32.422854486816654,
28.495598977174787,
25.46267025816652,
23.240003247147236,
19.503562131444756,
16.514839679654123,
13.894359307753296,
11.499774252656877,
9.395392365604536,
7.21344505155495,
3.7705548106066624,
0.2728846920640356,
0.6197802647075666,
1.5052110988161542,
2.736047696034607,
@@ -557,13 +599,13 @@
7.346947276543289,
22.29968060987662,
34.57523424809509,
41.83065840604197,
46.49642400356206,
47.884563842022054,
46.48524430245792,
43.99708508544073,
39.74859162814045,
36.5891994105096
41.7877983535968,
46.45356395111689,
47.841703789576876,
46.44238425001274,
33.24209404468744,
18.23258130364061,
15.073189086009755
],
"Electricity_price": [
0.000228,
@@ -661,15 +703,15 @@
0.0,
0.0,
0.375,
0.375,
0.875,
0.5,
0.75,
0.75,
1.0,
1.0,
0.875,
0.625,
0.375,
0.375,
0.375,
0.1,
0.6,
0.0,
0.0,
0.0,
0.0,
0.0,
@@ -757,103 +799,108 @@
"initial_soc_percentage": 5
},
"start_solution": [
2.0,
2.0,
2.0,
1.0,
1.0,
0.0,
2.0,
2.0,
2.0,
0.0,
0.0,
1.0,
0.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,
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,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
0.0,
5.0,
2.0,
0.0,
2.0,
0.0,
1.0,
2.0,
1.0,
0.0,
0.0,
0.0,
1.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,
1.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,
1.0,
1.0,
0.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
5.0,
6.0,
1.0,
0.0,
6.0,
1.0,
3.0,
5.0,
1.0,
1.0,
1.0,
5.0,
6.0,
5.0,
3.0,
1.0,
1.0,
1.0,
4.0,
1.0,
4.0,
2.0,
6.0,
5.0,
5.0,
3.0,
1.0,
2.0,
2.0,
6.0,
5.0,
2.0,
5.0,
4.0,
0.0,
4.0,
6.0,
6.0,
1.0,
4.0,
6.0,
3.0,
1.0,
4.0,
5.0,
2.0,
1.0,
6.0,
4.0,
2.0,
4.0,
1.0,
0.0,
0.0,
5.0,
0.0,
0.0,
2.0,
3.0,
4.0,
4.0,
2.0,
5.0,
0.0,
0.0,
0.0,
1.0,
0.0,
0.0,
4.0,
6.0,
3.0,
12.0
1.0,
1.0,
3.0,
34.0
],
"washingstart": 12
"washingstart": 44,
"appliance_starts": {
"dishwasher1": [
"2026-07-16 20:00:00+02:00"
]
}
}