1010
1111import grpc
1212from frequenz .channels import Broadcast , Sender , merge , select , selected_from
13- from frequenz .channels .timer import SkipMissedAndDrift , Timer
1413from frequenz .client .microgrid import ApiClient , ComponentCategory , EVChargerData
1514from typing_extensions import override
1615
2019from ....._internal ._math import is_close_to_zero
2120from .....timeseries import Power , Sample3Phase , Voltage
2221from ..._component_pool_status_tracker import ComponentPoolStatusTracker
23-
24- # from .._component_pool_status_tracker import ComponentPoolStatusTracker
2522from ..._component_status import ComponentPoolStatus , EVChargerStatusTracker
2623from ...request import Request
2724from ...result import PartialFailure , Result , Success
3229_logger = logging .getLogger (__name__ )
3330
3431_DEFAULT_API_REQUEST_TIMEOUT = timedelta (seconds = 5.0 )
35- _TGT_POWER_RESEND_INTERVAL = timedelta (seconds = 5.0 )
3632
3733
3834class EVChargerManager (ComponentManager ):
@@ -79,7 +75,9 @@ def component_ids(self) -> collections.abc.Set[int]:
7975 @override
8076 async def start (self ) -> None :
8177 """Start the ev charger data manager."""
82- self ._task = asyncio .create_task (self ._run_forever ())
78+ # Need to start a task only if there are EV chargers in the component graph.
79+ if self ._ev_charger_ids :
80+ self ._task = asyncio .create_task (self ._run_forever ())
8381
8482 @override
8583 async def distribute_power (self , request : Request ) -> None :
@@ -88,7 +86,8 @@ async def distribute_power(self, request: Request) -> None:
8886 Args:
8987 request: Request to get the distribution for.
9088 """
91- await self ._target_power_tx .send (request )
89+ if self ._ev_charger_ids :
90+ await self ._target_power_tx .send (request )
9291
9392 @override
9493 async def stop (self ) -> None :
@@ -222,10 +221,8 @@ async def _run(self) -> None: # pylint: disable=too-many-locals
222221 )
223222 target_power_rx = self ._target_power_channel .new_receiver ()
224223 api_request_timeout = _DEFAULT_API_REQUEST_TIMEOUT
225- resend_timer = Timer (_TGT_POWER_RESEND_INTERVAL , SkipMissedAndDrift ())
226224 latest_target_powers : dict [int , Power ] = {}
227- async for selected in select (ev_charger_data_rx , target_power_rx , resend_timer ):
228- resending = False
225+ async for selected in select (ev_charger_data_rx , target_power_rx ):
229226 target_power_changes = {}
230227 now = datetime .now (tz = timezone .utc )
231228
@@ -276,21 +273,14 @@ async def _run(self) -> None: # pylint: disable=too-many-locals
276273 diff_power = allocated_power - self ._target_power
277274 target_power_changes = self ._deallocate_unused_power (diff_power )
278275
279- elif selected_from (selected , resend_timer ):
280- target_power_changes = latest_target_powers
281- resending = True
282-
283276 if target_power_changes :
284277 _logger .debug ("Setting power to EV chargers: %s" , target_power_changes )
285278 else :
286279 continue
287- if not resending :
288- for component_id , power in target_power_changes .items ():
289- self ._evc_states .get (component_id ).update_last_allocation (
290- power , now
291- )
280+ for component_id , power in target_power_changes .items ():
281+ self ._evc_states .get (component_id ).update_last_allocation (power , now )
292282
293- latest_target_powers .update (target_power_changes )
283+ latest_target_powers .update (target_power_changes )
294284 result = await self ._set_api_power (
295285 api , target_power_changes , api_request_timeout
296286 )
0 commit comments