Skip to content

Commit a1ab925

Browse files
committed
Add a ComponentCategory parameter to the PowerDistributingActor
Signed-off-by: Sahas Subramanian <[email protected]>
1 parent 70a9a3d commit a1ab925

File tree

5 files changed

+50
-6
lines changed

5 files changed

+50
-6
lines changed

benchmarks/power_distribution/power_distributor.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ async def run_test( # pylint: disable=too-many-locals
115115
battery_status_channel = Broadcast[ComponentPoolStatus]("battery-status")
116116
power_result_channel = Broadcast[Result]("power-result")
117117
async with PowerDistributingActor(
118+
component_category=ComponentCategory.BATTERY,
118119
requests_receiver=power_request_channel.new_receiver(),
119120
results_sender=power_result_channel.new_sender(),
120121
component_pool_status_sender=battery_status_channel.new_sender(),

src/frequenz/sdk/actor/power_distributing/power_distributing.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
from frequenz.channels import Receiver, Sender
1818

1919
from ...actor._actor import Actor
20-
from ._component_managers import BatteryManager, ComponentManager
20+
from ...microgrid.component import ComponentCategory
21+
from ._component_managers import BatteryManager, ComponentManager, EVChargerManager
2122
from ._component_status import ComponentPoolStatus
2223
from .request import Request
2324
from .result import Result
@@ -51,6 +52,7 @@ class PowerDistributingActor(Actor):
5152

5253
def __init__( # pylint: disable=too-many-arguments
5354
self,
55+
component_category: ComponentCategory,
5456
requests_receiver: Receiver[Request],
5557
results_sender: Sender[Result],
5658
component_pool_status_sender: Sender[ComponentPoolStatus],
@@ -61,6 +63,8 @@ def __init__( # pylint: disable=too-many-arguments
6163
"""Create class instance.
6264
6365
Args:
66+
component_category: The category of the components that this actor is
67+
responsible for.
6468
requests_receiver: Receiver for receiving power requests from the power
6569
manager.
6670
results_sender: Sender for sending results to the power manager.
@@ -70,15 +74,25 @@ def __init__( # pylint: disable=too-many-arguments
7074
request. It is a time needed to collect first components data.
7175
name: The name of the actor. If `None`, `str(id(self))` will be used. This
7276
is used mostly for debugging purposes.
77+
78+
Raises:
79+
ValueError: If the given component category is not supported.
7380
"""
7481
super().__init__(name=name)
82+
self._component_category = component_category
7583
self._requests_receiver = requests_receiver
7684
self._result_sender = results_sender
7785
self._wait_for_data_sec = wait_for_data_sec
7886

79-
self._component_manager: ComponentManager = BatteryManager(
80-
component_pool_status_sender
81-
)
87+
self._component_manager: ComponentManager
88+
if component_category == ComponentCategory.BATTERY:
89+
self._component_manager = BatteryManager(component_pool_status_sender)
90+
elif component_category == ComponentCategory.EV_CHARGER:
91+
self._component_manager = EVChargerManager(component_pool_status_sender)
92+
else:
93+
raise ValueError(
94+
f"PowerDistributor doesn't support controlling: {component_category}"
95+
)
8296

8397
async def _run(self) -> None: # pylint: disable=too-many-locals
8498
"""Run actor main function.

src/frequenz/sdk/microgrid/_data_pipeline.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from frequenz.channels import Broadcast, Sender
1919

2020
from ..actor._actor import Actor
21+
from ..microgrid.component import ComponentCategory
2122
from ..timeseries._grid_frequency import GridFrequency
2223
from ..timeseries._voltage_streamer import VoltageStreamer
2324
from ..timeseries.grid import Grid
@@ -88,7 +89,9 @@ def __init__(
8889
self._data_sourcing_actor: _ActorInfo | None = None
8990
self._resampling_actor: _ActorInfo | None = None
9091

91-
self._battery_power_wrapper = PowerWrapper(self._channel_registry)
92+
self._battery_power_wrapper = PowerWrapper(
93+
ComponentCategory.BATTERY, self._channel_registry
94+
)
9295

9396
self._logical_meter: LogicalMeter | None = None
9497
self._consumer: Consumer | None = None

src/frequenz/sdk/microgrid/_power_wrapper.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,17 @@
3434
class PowerWrapper:
3535
"""Wrapper around the power managing and power distributing actors."""
3636

37-
def __init__(self, channel_registry: ChannelRegistry):
37+
def __init__(
38+
self, component_category: ComponentCategory, channel_registry: ChannelRegistry
39+
):
3840
"""Initialize the power control.
3941
4042
Args:
43+
component_category: The category of the components that actors started by
44+
this instance of the PowerWrapper will be responsible for.
4145
channel_registry: A channel registry for use in the actors.
4246
"""
47+
self._component_category = component_category
4348
self._channel_registry = channel_registry
4449

4550
self.status_channel: Broadcast[ComponentPoolStatus] = Broadcast(
@@ -123,6 +128,7 @@ def _start_power_distributing_actor(self) -> None:
123128
# Until the PowerManager is implemented, support for multiple use-case actors
124129
# will not be available in the high level interface.
125130
self._power_distributing_actor = PowerDistributingActor(
131+
component_category=self._component_category,
126132
requests_receiver=self._power_distribution_requests_channel.new_receiver(),
127133
results_sender=self._power_distribution_results_channel.new_sender(),
128134
component_pool_status_sender=self.status_channel.new_sender(),

tests/actor/power_distributing/test_power_distributing.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ async def test_constructor_with_grid_meter(self, mocker: MockerFixture) -> None:
183183
results_channel = Broadcast[Result]("power_distributor results")
184184
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
185185
async with PowerDistributingActor(
186+
component_category=ComponentCategory.BATTERY,
186187
requests_receiver=requests_channel.new_receiver(),
187188
results_sender=results_channel.new_sender(),
188189
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -210,6 +211,7 @@ async def test_constructor_without_grid_meter(self, mocker: MockerFixture) -> No
210211
results_channel = Broadcast[Result]("power_distributor results")
211212
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
212213
async with PowerDistributingActor(
214+
component_category=ComponentCategory.BATTERY,
213215
requests_receiver=requests_channel.new_receiver(),
214216
results_sender=results_channel.new_sender(),
215217
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -273,6 +275,7 @@ async def test_power_distributor_one_user(self, mocker: MockerFixture) -> None:
273275

274276
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
275277
async with PowerDistributingActor(
278+
component_category=ComponentCategory.BATTERY,
276279
requests_receiver=requests_channel.new_receiver(),
277280
results_sender=results_channel.new_sender(),
278281
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -330,6 +333,7 @@ async def test_power_distributor_exclusion_bounds(
330333

331334
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
332335
async with PowerDistributingActor(
336+
component_category=ComponentCategory.BATTERY,
333337
requests_receiver=requests_channel.new_receiver(),
334338
results_sender=results_channel.new_sender(),
335339
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -429,6 +433,7 @@ async def test_two_batteries_one_inverters(self, mocker: MockerFixture) -> None:
429433
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
430434

431435
async with PowerDistributingActor(
436+
component_category=ComponentCategory.BATTERY,
432437
requests_receiver=requests_channel.new_receiver(),
433438
component_pool_status_sender=battery_status_channel.new_sender(),
434439
results_sender=results_channel.new_sender(),
@@ -505,6 +510,7 @@ async def test_two_batteries_one_broken_one_inverters(
505510
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
506511

507512
async with PowerDistributingActor(
513+
component_category=ComponentCategory.BATTERY,
508514
requests_receiver=requests_channel.new_receiver(),
509515
component_pool_status_sender=battery_status_channel.new_sender(),
510516
results_sender=results_channel.new_sender(),
@@ -557,6 +563,7 @@ async def test_battery_two_inverters(self, mocker: MockerFixture) -> None:
557563
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
558564

559565
async with PowerDistributingActor(
566+
component_category=ComponentCategory.BATTERY,
560567
requests_receiver=requests_channel.new_receiver(),
561568
component_pool_status_sender=battery_status_channel.new_sender(),
562569
results_sender=results_channel.new_sender(),
@@ -605,6 +612,7 @@ async def test_two_batteries_three_inverters(self, mocker: MockerFixture) -> Non
605612
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
606613

607614
async with PowerDistributingActor(
615+
component_category=ComponentCategory.BATTERY,
608616
requests_receiver=requests_channel.new_receiver(),
609617
component_pool_status_sender=battery_status_channel.new_sender(),
610618
results_sender=results_channel.new_sender(),
@@ -687,6 +695,7 @@ async def test_two_batteries_one_inverter_different_exclusion_bounds_2(
687695
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
688696

689697
async with PowerDistributingActor(
698+
component_category=ComponentCategory.BATTERY,
690699
requests_receiver=requests_channel.new_receiver(),
691700
component_pool_status_sender=battery_status_channel.new_sender(),
692701
results_sender=results_channel.new_sender(),
@@ -770,6 +779,7 @@ async def test_two_batteries_one_inverter_different_exclusion_bounds(
770779
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
771780

772781
async with PowerDistributingActor(
782+
component_category=ComponentCategory.BATTERY,
773783
requests_receiver=requests_channel.new_receiver(),
774784
component_pool_status_sender=battery_status_channel.new_sender(),
775785
results_sender=results_channel.new_sender(),
@@ -832,6 +842,7 @@ async def test_connected_but_not_requested_batteries(
832842
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
833843

834844
async with PowerDistributingActor(
845+
component_category=ComponentCategory.BATTERY,
835846
requests_receiver=requests_channel.new_receiver(),
836847
component_pool_status_sender=battery_status_channel.new_sender(),
837848
results_sender=results_channel.new_sender(),
@@ -886,6 +897,7 @@ async def test_battery_soc_nan(self, mocker: MockerFixture) -> None:
886897
await self._patch_battery_pool_status(mocks, mocker, request.component_ids)
887898
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
888899
async with PowerDistributingActor(
900+
component_category=ComponentCategory.BATTERY,
889901
requests_receiver=requests_channel.new_receiver(),
890902
results_sender=results_channel.new_sender(),
891903
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -937,6 +949,7 @@ async def test_battery_capacity_nan(self, mocker: MockerFixture) -> None:
937949

938950
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
939951
async with PowerDistributingActor(
952+
component_category=ComponentCategory.BATTERY,
940953
requests_receiver=requests_channel.new_receiver(),
941954
results_sender=results_channel.new_sender(),
942955
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1007,6 +1020,7 @@ async def test_battery_power_bounds_nan(self, mocker: MockerFixture) -> None:
10071020

10081021
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
10091022
async with PowerDistributingActor(
1023+
component_category=ComponentCategory.BATTERY,
10101024
requests_receiver=requests_channel.new_receiver(),
10111025
results_sender=results_channel.new_sender(),
10121026
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1049,6 +1063,7 @@ async def test_power_distributor_invalid_battery_id(
10491063

10501064
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
10511065
async with PowerDistributingActor(
1066+
component_category=ComponentCategory.BATTERY,
10521067
requests_receiver=requests_channel.new_receiver(),
10531068
results_sender=results_channel.new_sender(),
10541069
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1090,6 +1105,7 @@ async def test_power_distributor_one_user_adjust_power_consume(
10901105

10911106
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
10921107
async with PowerDistributingActor(
1108+
component_category=ComponentCategory.BATTERY,
10931109
requests_receiver=requests_channel.new_receiver(),
10941110
results_sender=results_channel.new_sender(),
10951111
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1133,6 +1149,7 @@ async def test_power_distributor_one_user_adjust_power_supply(
11331149

11341150
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
11351151
async with PowerDistributingActor(
1152+
component_category=ComponentCategory.BATTERY,
11361153
requests_receiver=requests_channel.new_receiver(),
11371154
results_sender=results_channel.new_sender(),
11381155
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1176,6 +1193,7 @@ async def test_power_distributor_one_user_adjust_power_success(
11761193

11771194
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
11781195
async with PowerDistributingActor(
1196+
component_category=ComponentCategory.BATTERY,
11791197
requests_receiver=requests_channel.new_receiver(),
11801198
results_sender=results_channel.new_sender(),
11811199
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1212,6 +1230,7 @@ async def test_not_all_batteries_are_working(self, mocker: MockerFixture) -> Non
12121230

12131231
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
12141232
async with PowerDistributingActor(
1233+
component_category=ComponentCategory.BATTERY,
12151234
requests_receiver=requests_channel.new_receiver(),
12161235
results_sender=results_channel.new_sender(),
12171236
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1262,6 +1281,7 @@ async def test_partial_failure_result(self, mocker: MockerFixture) -> None:
12621281

12631282
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
12641283
async with PowerDistributingActor(
1284+
component_category=ComponentCategory.BATTERY,
12651285
requests_receiver=requests_channel.new_receiver(),
12661286
results_sender=results_channel.new_sender(),
12671287
component_pool_status_sender=battery_status_channel.new_sender(),

0 commit comments

Comments
 (0)