mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2026-08-31 12:46:38 +00:00
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:
co-authored by
Claude Opus 4.8
parent
c59bf1b486
commit
67cf6f7d8a
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user