Skip to content

Commit bf1def5

Browse files
committed
refactoring: SLA/SRP
1 parent d16a7ca commit bf1def5

2 files changed

Lines changed: 57 additions & 37 deletions

File tree

packages/modules/common/store/_tariff.py

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -76,26 +76,60 @@ def _get_value_at_or_before(d: Dict[int, float], ts_key: int) -> float:
7676
key = min(d.keys())
7777
return d[key]
7878

79+
def _add_missing_slots(prices: Dict[int, float]) -> None:
80+
last_timestamp = max(int(float(k)) for k in prices.keys())
81+
target_timestamp = (
82+
datetime.fromtimestamp(last_timestamp).replace(second=59, microsecond=0).timestamp())
83+
for ts in range(int(first_timestamp), int(target_timestamp), 900):
84+
if ts not in prices:
85+
prices[ts] = _get_value_at_or_before(prices, ts)
86+
7987
def reduce_prices(prices: Dict[str, float]) -> Dict[int, float]:
8088
prices = {int(float(k)): v for k, v in prices.items() if int(float(k)) >= first_timestamp}
8189
if (len(prices) > 0):
8290
median_delta_seconds = median_delta(sorted(int(float(k)) for k in prices.keys())).total_seconds()
8391
if median_delta_seconds > 900:
8492
# Wenn die typische Schrittweite größer als 15 Minuten ist, annehmen,
8593
# dass es sich um unregelmäßige Preise handelt
86-
last_timestamp = max(int(float(k)) for k in prices.keys())
87-
target_timestamp = (
88-
datetime.fromtimestamp(last_timestamp).replace(second=59, microsecond=0).timestamp())
89-
for ts in range(int(first_timestamp), int(target_timestamp), 900):
90-
if ts not in prices:
91-
prices[ts] = _get_value_at_or_before(prices, ts)
94+
_add_missing_slots(prices)
9295
return prices
9396

97+
def _normalize_grid_fee_prices(grid_fee_prices: Dict[int, float]) -> Dict[int, float]:
98+
# Get distinct grid_fee_prices values, sort and take the middle one
99+
distinct_grid_fee_values = sorted(set(grid_fee_prices.values()))
100+
median_grid_fee = (
101+
distinct_grid_fee_values[len(distinct_grid_fee_values) // 2]
102+
if distinct_grid_fee_values else 0)
103+
return {int(float(k)): v - median_grid_fee for k, v in grid_fee_prices.items()}
104+
105+
def _sum_of_tariff_and_grid_fee(
106+
flexible_tariff_prices: Dict[int, float],
107+
grid_fee_prices: Dict[int, float]
108+
) -> Dict[int, float]:
109+
flexible_tariff_keys = sorted(flexible_tariff_prices.keys())
110+
grid_fee_keys = sorted(grid_fee_prices.keys())
111+
grid_fee_prices = _normalize_grid_fee_prices(grid_fee_prices)
112+
113+
median_delta_seconds_grid = median_delta(
114+
sorted(int(float(k)) for k in grid_fee_prices.keys())).total_seconds()
115+
median_delta_seconds_flexible = median_delta(
116+
sorted(int(float(k)) for k in flexible_tariff_prices.keys())).total_seconds()
117+
118+
result = {}
119+
for ts in (flexible_tariff_keys
120+
if median_delta_seconds_flexible < median_delta_seconds_grid
121+
else grid_fee_keys):
122+
result[ts] = (_get_value_at_or_before(flexible_tariff_prices, ts) +
123+
_get_value_at_or_before(grid_fee_prices, ts))
124+
return result
125+
94126
flexible_tariff_prices = reduce_prices(
95127
data.data.optional_data.data.electricity_pricing.flexible_tariff.get.prices)
128+
grid_fee_prices = reduce_prices(
129+
data.data.optional_data.data.electricity_pricing.grid_fee.get.prices)
130+
96131
if len(flexible_tariff_prices) == 0 and data.data.optional_data.flexible_tariff_module is not None:
97132
raise ValueError("Keine Preise für konfigurierten dynamischen Stromtarif vorhanden.")
98-
grid_fee_prices = reduce_prices(data.data.optional_data.data.electricity_pricing.grid_fee.get.prices)
99133
if len(grid_fee_prices) == 0 and data.data.optional_data.grid_fee_module is not None:
100134
raise ValueError("Keine Preise für konfigurierten Netzentgelttarif vorhanden.")
101135
flexible_tariff_prices = {int(float(k)): v for k, v in flexible_tariff_prices.items()}
@@ -104,36 +138,7 @@ def reduce_prices(prices: Dict[str, float]) -> Dict[int, float]:
104138
return grid_fee_prices
105139
if len(grid_fee_prices) == 0 and len(flexible_tariff_prices) > 0:
106140
return flexible_tariff_prices
107-
108-
flexible_tariff_keys = sorted(flexible_tariff_prices.keys())
109-
grid_fee_keys = sorted(grid_fee_prices.keys())
110-
# Get distinct grid_fee_prices values, sort and take the middle one
111-
distinct_grid_fee_values = sorted(set(grid_fee_prices.values()))
112-
median_grid_fee = (
113-
distinct_grid_fee_values[len(distinct_grid_fee_values) // 2]
114-
if distinct_grid_fee_values else 0)
115-
grid_fee_prices = {int(float(k)): v - median_grid_fee for k, v in grid_fee_prices.items()}
116-
117-
median_delta_seconds_grid = median_delta(
118-
sorted(int(float(k)) for k in grid_fee_prices.keys())).total_seconds()
119-
median_delta_seconds_flexible = median_delta(
120-
sorted(int(float(k)) for k in flexible_tariff_prices.keys())).total_seconds()
121-
122-
result = {}
123-
def _get_value_from_keys(d: Dict[int, float], keys_list: list, ts_key: int) -> float:
124-
keys = [k for k in keys_list if k <= ts_key]
125-
if keys:
126-
key = max(keys)
127-
else:
128-
key = min(keys_list)
129-
return d[key]
130-
131-
for ts in (flexible_tariff_keys
132-
if median_delta_seconds_flexible < median_delta_seconds_grid
133-
else grid_fee_keys):
134-
result[ts] = (_get_value_from_keys(flexible_tariff_prices, flexible_tariff_keys, ts) +
135-
_get_value_from_keys(grid_fee_prices, grid_fee_keys, ts))
136-
return result
141+
return _sum_of_tariff_and_grid_fee(flexible_tariff_prices, grid_fee_prices)
137142

138143

139144
def get_price_value_store() -> ValueStore[TariffState]:

packages/modules/electricity_pricing/flexible_tariffs/fixed_hours/tariff_test.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,21 @@ class TestCreateElectricityTariff:
295295
3.5,
296296
id="premium_tariff",
297297
),
298+
pytest.param(
299+
2000,
300+
[
301+
{
302+
"name": "never active_tariff",
303+
"price": 3500,
304+
"active_times": {
305+
"dates": [("01-01", "01-01")],
306+
"times": [("00:00", "00:00")],
307+
},
308+
}
309+
],
310+
2.0,
311+
id="not_matching_tariff returns default price",
312+
),
298313
],
299314
)
300315
def test_create_electricity_tariff_updater(

0 commit comments

Comments
 (0)