@@ -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
137143def get_price_value_store () -> ValueStore [TariffState ]:
0 commit comments