Skip to content

Commit cc4246c

Browse files
committed
Pass ComponentType as arguments to PowerManager and PowerDistributor
This is necessary to identify if an inverter is a PV inverter or not. Signed-off-by: Sahas Subramanian <[email protected]>
1 parent 353247d commit cc4246c

File tree

6 files changed

+43
-6
lines changed

6 files changed

+43
-6
lines changed

benchmarks/power_distribution/power_distributor.py

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

src/frequenz/sdk/actor/_power_managing/_power_managing_actor.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from frequenz.channels import Receiver, Sender, select, selected_from
1414
from frequenz.channels.timer import SkipMissedAndDrift, Timer
15-
from frequenz.client.microgrid import ComponentCategory
15+
from frequenz.client.microgrid import ComponentCategory, ComponentType
1616
from typing_extensions import override
1717

1818
from ...timeseries._base_types import SystemBounds
@@ -33,6 +33,7 @@ class PowerManagingActor(Actor):
3333
def __init__( # pylint: disable=too-many-arguments
3434
self,
3535
component_category: ComponentCategory,
36+
component_type: ComponentType | None,
3637
proposals_receiver: Receiver[Proposal],
3738
bounds_subscription_receiver: Receiver[ReportRequest],
3839
power_distributing_requests_sender: Sender[power_distributing.Request],
@@ -47,6 +48,8 @@ def __init__( # pylint: disable=too-many-arguments
4748
Args:
4849
component_category: The category of the component this power manager
4950
instance is going to support.
51+
component_type: The type of the component of the given category that this
52+
actor is responsible for.
5053
proposals_receiver: The receiver for proposals.
5154
bounds_subscription_receiver: The receiver for bounds subscriptions.
5255
power_distributing_requests_sender: The sender for power distribution
@@ -65,6 +68,7 @@ def __init__( # pylint: disable=too-many-arguments
6568
)
6669

6770
self._component_category = component_category
71+
self._component_type = component_type
6872
self._bounds_subscription_receiver = bounds_subscription_receiver
6973
self._power_distributing_requests_sender = power_distributing_requests_sender
7074
self._power_distributing_results_receiver = power_distributing_results_receiver

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import asyncio
1616

1717
from frequenz.channels import Receiver, Sender
18-
from frequenz.client.microgrid import ComponentCategory
18+
from frequenz.client.microgrid import ComponentCategory, ComponentType
1919

2020
from ...actor._actor import Actor
2121
from ._component_managers import BatteryManager, ComponentManager, EVChargerManager
@@ -53,6 +53,7 @@ class PowerDistributingActor(Actor):
5353
def __init__( # pylint: disable=too-many-arguments
5454
self,
5555
component_category: ComponentCategory,
56+
component_type: ComponentType | None,
5657
requests_receiver: Receiver[Request],
5758
results_sender: Sender[Result],
5859
component_pool_status_sender: Sender[ComponentPoolStatus],
@@ -65,6 +66,8 @@ def __init__( # pylint: disable=too-many-arguments
6566
Args:
6667
component_category: The category of the components that this actor is
6768
responsible for.
69+
component_type: The type of the component of the given category that this
70+
actor is responsible for.
6871
requests_receiver: Receiver for receiving power requests from the power
6972
manager.
7073
results_sender: Sender for sending results to the power manager.
@@ -80,6 +83,7 @@ def __init__( # pylint: disable=too-many-arguments
8083
"""
8184
super().__init__(name=name)
8285
self._component_category = component_category
86+
self._component_type = component_type
8387
self._requests_receiver = requests_receiver
8488
self._result_sender = results_sender
8589
self._wait_for_data_sec = wait_for_data_sec

src/frequenz/sdk/microgrid/_data_pipeline.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ def __init__(
9696
self._resampling_actor: _ActorInfo | None = None
9797

9898
self._battery_power_wrapper = PowerWrapper(
99-
ComponentCategory.BATTERY, self._channel_registry
99+
ComponentCategory.BATTERY, None, self._channel_registry
100100
)
101101
self._ev_power_wrapper = PowerWrapper(
102-
ComponentCategory.EV_CHARGER, self._channel_registry
102+
ComponentCategory.EV_CHARGER, None, self._channel_registry
103103
)
104104

105105
self._logical_meter: LogicalMeter | None = None

src/frequenz/sdk/microgrid/_power_wrapper.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# pylint seems to think this is a cyclic import, but it is not.
1414
#
1515
# pylint: disable=cyclic-import
16-
from frequenz.client.microgrid import ComponentCategory
16+
from frequenz.client.microgrid import ComponentCategory, ComponentType
1717

1818
# A number of imports had to be done inside functions where they are used, to break
1919
# import cycles.
@@ -37,16 +37,22 @@ class PowerWrapper:
3737
"""Wrapper around the power managing and power distributing actors."""
3838

3939
def __init__(
40-
self, component_category: ComponentCategory, channel_registry: ChannelRegistry
40+
self,
41+
component_category: ComponentCategory,
42+
component_type: ComponentType | None,
43+
channel_registry: ChannelRegistry,
4144
):
4245
"""Initialize the power control.
4346
4447
Args:
4548
component_category: The category of the components that actors started by
4649
this instance of the PowerWrapper will be responsible for.
50+
component_type: The type of the component of the given category that this
51+
actor is responsible for.
4752
channel_registry: A channel registry for use in the actors.
4853
"""
4954
self._component_category = component_category
55+
self._component_type = component_type
5056
self._channel_registry = channel_registry
5157

5258
self.status_channel: Broadcast[ComponentPoolStatus] = Broadcast(
@@ -95,6 +101,7 @@ def _start_power_managing_actor(self) -> None:
95101

96102
self._power_managing_actor = PowerManagingActor(
97103
component_category=self._component_category,
104+
component_type=self._component_type,
98105
proposals_receiver=self.proposal_channel.new_receiver(),
99106
bounds_subscription_receiver=(
100107
self.bounds_subscription_channel.new_receiver()
@@ -134,6 +141,7 @@ def _start_power_distributing_actor(self) -> None:
134141
# will not be available in the high level interface.
135142
self._power_distributing_actor = PowerDistributingActor(
136143
component_category=self._component_category,
144+
component_type=self._component_type,
137145
requests_receiver=self._power_distribution_requests_channel.new_receiver(),
138146
results_sender=self._power_distribution_results_channel.new_sender(),
139147
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
@@ -108,6 +108,7 @@ async def test_constructor_with_grid_meter(self, mocker: MockerFixture) -> None:
108108
)
109109
async with PowerDistributingActor(
110110
component_category=ComponentCategory.BATTERY,
111+
component_type=None,
111112
requests_receiver=requests_channel.new_receiver(),
112113
results_sender=results_channel.new_sender(),
113114
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -139,6 +140,7 @@ async def test_constructor_without_grid_meter(self, mocker: MockerFixture) -> No
139140
)
140141
async with PowerDistributingActor(
141142
component_category=ComponentCategory.BATTERY,
143+
component_type=None,
142144
requests_receiver=requests_channel.new_receiver(),
143145
results_sender=results_channel.new_sender(),
144146
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -204,6 +206,7 @@ async def test_power_distributor_one_user(self, mocker: MockerFixture) -> None:
204206
battery_status_channel = Broadcast[ComponentPoolStatus](name="battery_status")
205207
async with PowerDistributingActor(
206208
component_category=ComponentCategory.BATTERY,
209+
component_type=None,
207210
requests_receiver=requests_channel.new_receiver(),
208211
results_sender=results_channel.new_sender(),
209212
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -264,6 +267,7 @@ async def test_power_distributor_exclusion_bounds(
264267
)
265268
async with PowerDistributingActor(
266269
component_category=ComponentCategory.BATTERY,
270+
component_type=None,
267271
requests_receiver=requests_channel.new_receiver(),
268272
results_sender=results_channel.new_sender(),
269273
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -366,6 +370,7 @@ async def test_two_batteries_one_inverters(self, mocker: MockerFixture) -> None:
366370

367371
async with PowerDistributingActor(
368372
component_category=ComponentCategory.BATTERY,
373+
component_type=None,
369374
requests_receiver=requests_channel.new_receiver(),
370375
component_pool_status_sender=battery_status_channel.new_sender(),
371376
results_sender=results_channel.new_sender(),
@@ -445,6 +450,7 @@ async def test_two_batteries_one_broken_one_inverters(
445450

446451
async with PowerDistributingActor(
447452
component_category=ComponentCategory.BATTERY,
453+
component_type=None,
448454
requests_receiver=requests_channel.new_receiver(),
449455
component_pool_status_sender=battery_status_channel.new_sender(),
450456
results_sender=results_channel.new_sender(),
@@ -500,6 +506,7 @@ async def test_battery_two_inverters(self, mocker: MockerFixture) -> None:
500506

501507
async with PowerDistributingActor(
502508
component_category=ComponentCategory.BATTERY,
509+
component_type=None,
503510
requests_receiver=requests_channel.new_receiver(),
504511
component_pool_status_sender=battery_status_channel.new_sender(),
505512
results_sender=results_channel.new_sender(),
@@ -551,6 +558,7 @@ async def test_two_batteries_three_inverters(self, mocker: MockerFixture) -> Non
551558

552559
async with PowerDistributingActor(
553560
component_category=ComponentCategory.BATTERY,
561+
component_type=None,
554562
requests_receiver=requests_channel.new_receiver(),
555563
component_pool_status_sender=battery_status_channel.new_sender(),
556564
results_sender=results_channel.new_sender(),
@@ -636,6 +644,7 @@ async def test_two_batteries_one_inverter_different_exclusion_bounds_2(
636644

637645
async with PowerDistributingActor(
638646
component_category=ComponentCategory.BATTERY,
647+
component_type=None,
639648
requests_receiver=requests_channel.new_receiver(),
640649
component_pool_status_sender=battery_status_channel.new_sender(),
641650
results_sender=results_channel.new_sender(),
@@ -722,6 +731,7 @@ async def test_two_batteries_one_inverter_different_exclusion_bounds(
722731

723732
async with PowerDistributingActor(
724733
component_category=ComponentCategory.BATTERY,
734+
component_type=None,
725735
requests_receiver=requests_channel.new_receiver(),
726736
component_pool_status_sender=battery_status_channel.new_sender(),
727737
results_sender=results_channel.new_sender(),
@@ -787,6 +797,7 @@ async def test_connected_but_not_requested_batteries(
787797

788798
async with PowerDistributingActor(
789799
component_category=ComponentCategory.BATTERY,
800+
component_type=None,
790801
requests_receiver=requests_channel.new_receiver(),
791802
component_pool_status_sender=battery_status_channel.new_sender(),
792803
results_sender=results_channel.new_sender(),
@@ -844,6 +855,7 @@ async def test_battery_soc_nan(self, mocker: MockerFixture) -> None:
844855
)
845856
async with PowerDistributingActor(
846857
component_category=ComponentCategory.BATTERY,
858+
component_type=None,
847859
requests_receiver=requests_channel.new_receiver(),
848860
results_sender=results_channel.new_sender(),
849861
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -898,6 +910,7 @@ async def test_battery_capacity_nan(self, mocker: MockerFixture) -> None:
898910
)
899911
async with PowerDistributingActor(
900912
component_category=ComponentCategory.BATTERY,
913+
component_type=None,
901914
requests_receiver=requests_channel.new_receiver(),
902915
results_sender=results_channel.new_sender(),
903916
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -971,6 +984,7 @@ async def test_battery_power_bounds_nan(self, mocker: MockerFixture) -> None:
971984
)
972985
async with PowerDistributingActor(
973986
component_category=ComponentCategory.BATTERY,
987+
component_type=None,
974988
requests_receiver=requests_channel.new_receiver(),
975989
results_sender=results_channel.new_sender(),
976990
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1016,6 +1030,7 @@ async def test_power_distributor_invalid_battery_id(
10161030
)
10171031
async with PowerDistributingActor(
10181032
component_category=ComponentCategory.BATTERY,
1033+
component_type=None,
10191034
requests_receiver=requests_channel.new_receiver(),
10201035
results_sender=results_channel.new_sender(),
10211036
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1060,6 +1075,7 @@ async def test_power_distributor_one_user_adjust_power_consume(
10601075
)
10611076
async with PowerDistributingActor(
10621077
component_category=ComponentCategory.BATTERY,
1078+
component_type=None,
10631079
requests_receiver=requests_channel.new_receiver(),
10641080
results_sender=results_channel.new_sender(),
10651081
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1106,6 +1122,7 @@ async def test_power_distributor_one_user_adjust_power_supply(
11061122
)
11071123
async with PowerDistributingActor(
11081124
component_category=ComponentCategory.BATTERY,
1125+
component_type=None,
11091126
requests_receiver=requests_channel.new_receiver(),
11101127
results_sender=results_channel.new_sender(),
11111128
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1152,6 +1169,7 @@ async def test_power_distributor_one_user_adjust_power_success(
11521169
)
11531170
async with PowerDistributingActor(
11541171
component_category=ComponentCategory.BATTERY,
1172+
component_type=None,
11551173
requests_receiver=requests_channel.new_receiver(),
11561174
results_sender=results_channel.new_sender(),
11571175
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1191,6 +1209,7 @@ async def test_not_all_batteries_are_working(self, mocker: MockerFixture) -> Non
11911209
)
11921210
async with PowerDistributingActor(
11931211
component_category=ComponentCategory.BATTERY,
1212+
component_type=None,
11941213
requests_receiver=requests_channel.new_receiver(),
11951214
results_sender=results_channel.new_sender(),
11961215
component_pool_status_sender=battery_status_channel.new_sender(),
@@ -1244,6 +1263,7 @@ async def test_partial_failure_result(self, mocker: MockerFixture) -> None:
12441263
)
12451264
async with PowerDistributingActor(
12461265
component_category=ComponentCategory.BATTERY,
1266+
component_type=None,
12471267
requests_receiver=requests_channel.new_receiver(),
12481268
results_sender=results_channel.new_sender(),
12491269
component_pool_status_sender=battery_status_channel.new_sender(),

0 commit comments

Comments
 (0)