Skip to content

Commit 1293739

Browse files
committed
refactoring: SLA/SRP
1 parent ed93c4d commit 1293739

1 file changed

Lines changed: 43 additions & 37 deletions

File tree

packages/modules/common/store/_tariff.py

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -76,62 +76,68 @@ 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.")
135+
101136
if len(flexible_tariff_prices) == 0 and len(grid_fee_prices) > 0:
102137
return grid_fee_prices
103138
if len(grid_fee_prices) == 0 and len(flexible_tariff_prices) > 0:
104139
return flexible_tariff_prices
105-
106-
flexible_tariff_keys = sorted(flexible_tariff_prices.keys())
107-
grid_fee_keys = sorted(grid_fee_prices.keys())
108-
# Get distinct grid_fee_prices values, sort and take the middle one
109-
distinct_grid_fee_values = sorted(set(grid_fee_prices.values()))
110-
median_grid_fee = (
111-
distinct_grid_fee_values[len(distinct_grid_fee_values) // 2]
112-
if distinct_grid_fee_values else 0)
113-
grid_fee_prices = {int(float(k)): v - median_grid_fee for k, v in grid_fee_prices.items()}
114-
115-
median_delta_seconds_grid = median_delta(
116-
sorted(int(float(k)) for k in grid_fee_prices.keys())).total_seconds()
117-
median_delta_seconds_flexible = median_delta(
118-
sorted(int(float(k)) for k in flexible_tariff_prices.keys())).total_seconds()
119-
120-
result = {}
121-
def _get_value_from_keys(d: Dict[int, float], keys_list: list, ts_key: int) -> float:
122-
keys = [k for k in keys_list if k <= ts_key]
123-
if keys:
124-
key = max(keys)
125-
else:
126-
key = min(keys_list)
127-
return d[key]
128-
129-
for ts in (flexible_tariff_keys
130-
if median_delta_seconds_flexible < median_delta_seconds_grid
131-
else grid_fee_keys):
132-
result[ts] = (_get_value_from_keys(flexible_tariff_prices, flexible_tariff_keys, ts) +
133-
_get_value_from_keys(grid_fee_prices, grid_fee_keys, ts))
134-
return result
140+
return _sum_of_tariff_and_grid_fee(flexible_tariff_prices, grid_fee_prices)
135141

136142

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

0 commit comments

Comments
 (0)