Skip to content

Commit 61672f5

Browse files
committed
Rename ComponentStatusComponentPoolStatus
It is actually a dataclass for holding the status of a pool of components, so this name is more accurate. Also move it to a separate `_component_status.py` sub-module. Signed-off-by: Sahas Subramanian <[email protected]>
1 parent 278b0b9 commit 61672f5

File tree

11 files changed

+92
-76
lines changed

11 files changed

+92
-76
lines changed

benchmarks/power_distribution/power_distributor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from frequenz.sdk import microgrid
1717
from frequenz.sdk.actor import ResamplerConfig
1818
from frequenz.sdk.actor.power_distributing import (
19-
ComponentStatus,
19+
ComponentPoolStatus,
2020
Error,
2121
OutOfBounds,
2222
PartialFailure,
@@ -112,7 +112,7 @@ async def run_test( # pylint: disable=too-many-locals
112112
start = timeit.default_timer()
113113

114114
power_request_channel = Broadcast[Request]("power-request")
115-
battery_status_channel = Broadcast[ComponentStatus]("battery-status")
115+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery-status")
116116
power_result_channel = Broadcast[Result]("power-result")
117117
async with PowerDistributingActor(
118118
requests_receiver=power_request_channel.new_receiver(),

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
PowerDistributingActor and send requests for charging or discharging power.
1111
"""
1212

13-
from ._component_pool_status_tracker import ComponentStatus
13+
from ._component_status import ComponentPoolStatus
1414
from .power_distributing import PowerDistributingActor
1515
from .request import Request
1616
from .result import Error, OutOfBounds, PartialFailure, Result, Success
@@ -23,5 +23,5 @@
2323
"Success",
2424
"OutOfBounds",
2525
"PartialFailure",
26-
"ComponentStatus",
26+
"ComponentPoolStatus",
2727
]

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

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,35 +14,11 @@
1414

1515
from ..._internal._asyncio import cancel_and_await
1616
from ._battery_status import BatteryStatusTracker, SetPowerResult, Status
17+
from ._component_status import ComponentPoolStatus
1718

1819
_logger = logging.getLogger(__name__)
1920

2021

21-
@dataclass
22-
class ComponentStatus:
23-
"""Status of all components of a certain category in the microgrid."""
24-
25-
working: set[int]
26-
"""Set of working component ids."""
27-
28-
uncertain: set[int]
29-
"""Set of components to be used only when there are none known to be working."""
30-
31-
def get_working_components(self, components: abc.Set[int]) -> set[int]:
32-
"""From the given set of components return the working ones.
33-
34-
Args:
35-
components: Set of components.
36-
37-
Returns:
38-
Subset with working components.
39-
"""
40-
working = self.working.intersection(components)
41-
if len(working) > 0:
42-
return working
43-
return self.uncertain.intersection(components)
44-
45-
4622
@dataclass
4723
class _ComponentStatusChannelHelper:
4824
"""Helper class to create component status channel.
@@ -73,7 +49,7 @@ class ComponentPoolStatusTracker:
7349
def __init__( # noqa: DOC502 (RuntimeError raised from BatteryStatusTracker)
7450
self,
7551
component_ids: set[int],
76-
component_status_sender: Sender[ComponentStatus],
52+
component_status_sender: Sender[ComponentPoolStatus],
7753
max_data_age_sec: float,
7854
max_blocking_duration_sec: float,
7955
) -> None:
@@ -96,7 +72,7 @@ def __init__( # noqa: DOC502 (RuntimeError raised from BatteryStatusTracker)
9672
"""
9773
# At first no component is working, we will get notification when they start
9874
# working.
99-
self._current_status = ComponentStatus(working=set(), uncertain=set())
75+
self._current_status = ComponentPoolStatus(working=set(), uncertain=set())
10076

10177
# Channel for sending results of requests to the components.
10278
set_power_result_channel = Broadcast[SetPowerResult]("component_request_status")
@@ -147,7 +123,7 @@ async def stop(self) -> None:
147123
)
148124
await self._component_status_channel.stop()
149125

150-
async def _run(self, component_status_sender: Sender[ComponentStatus]) -> None:
126+
async def _run(self, component_status_sender: Sender[ComponentPoolStatus]) -> None:
151127
"""Start tracking component status.
152128
153129
Args:
@@ -163,7 +139,7 @@ async def _run(self, component_status_sender: Sender[ComponentStatus]) -> None:
163139
)
164140

165141
async def _update_status(
166-
self, component_status_sender: Sender[ComponentStatus]
142+
self, component_status_sender: Sender[ComponentPoolStatus]
167143
) -> None:
168144
"""Wait for any component to change status and update status.
169145
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# License: MIT
2+
# Copyright © 2023 Frequenz Energy-as-a-Service GmbH
3+
4+
"""Classes to track the status of components in the microgrid."""
5+
6+
7+
from collections import abc
8+
from dataclasses import dataclass
9+
10+
11+
@dataclass
12+
class ComponentPoolStatus:
13+
"""Status of all components of a certain category in the microgrid."""
14+
15+
working: set[int]
16+
"""Set of working component ids."""
17+
18+
uncertain: set[int]
19+
"""Set of components to be used only when there are none known to be working."""
20+
21+
def get_working_components(self, components: abc.Set[int]) -> set[int]:
22+
"""From the given set of components return the working ones.
23+
24+
Args:
25+
components: Set of components.
26+
27+
Returns:
28+
Subset with working components.
29+
"""
30+
working = self.working.intersection(components)
31+
if len(working) > 0:
32+
return working
33+
return self.uncertain.intersection(components)

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
ComponentCategory,
3737
InverterData,
3838
)
39-
from ._component_pool_status_tracker import ComponentPoolStatusTracker, ComponentStatus
39+
from ._component_pool_status_tracker import ComponentPoolStatusTracker
40+
from ._component_status import ComponentPoolStatus
4041
from ._distribution_algorithm import (
4142
AggregatedBatteryData,
4243
DistributionAlgorithm,
@@ -164,7 +165,7 @@ def __init__(
164165
self,
165166
requests_receiver: Receiver[Request],
166167
results_sender: Sender[Result],
167-
battery_status_sender: Sender[ComponentStatus],
168+
battery_status_sender: Sender[ComponentPoolStatus],
168169
wait_for_data_sec: float = 2,
169170
*,
170171
name: str | None = None,

src/frequenz/sdk/microgrid/_data_pipeline.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
if typing.TYPE_CHECKING:
3737
from ..actor import ComponentMetricRequest, ResamplerConfig, _power_managing
3838
from ..actor.power_distributing import ( # noqa: F401 (imports used by string type hints)
39-
ComponentStatus,
39+
ComponentPoolStatus,
4040
PowerDistributingActor,
4141
Request,
4242
Result,
@@ -94,7 +94,7 @@ def __init__(
9494
self._data_sourcing_actor: _ActorInfo | None = None
9595
self._resampling_actor: _ActorInfo | None = None
9696

97-
self._battery_status_channel: Broadcast[ComponentStatus] = Broadcast(
97+
self._battery_status_channel: Broadcast[ComponentPoolStatus] = Broadcast(
9898
"battery-status", resend_latest=True
9999
)
100100
self._power_distribution_requests_channel: Broadcast[Request] = Broadcast(

src/frequenz/sdk/timeseries/battery_pool/_battery_pool_reference_store.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from ..._internal._asyncio import cancel_and_await
1616
from ...actor import ComponentMetricRequest, _channel_registry, _power_managing
17-
from ...actor.power_distributing._component_pool_status_tracker import ComponentStatus
17+
from ...actor.power_distributing._component_status import ComponentPoolStatus
1818
from ...microgrid import connection_manager
1919
from ...microgrid.component import ComponentCategory
2020
from ..formula_engine._formula_engine_pool import FormulaEnginePool
@@ -38,7 +38,7 @@ def __init__( # pylint: disable=too-many-arguments
3838
self,
3939
channel_registry: _channel_registry.ChannelRegistry,
4040
resampler_subscription_sender: Sender[ComponentMetricRequest],
41-
batteries_status_receiver: Receiver[ComponentStatus],
41+
batteries_status_receiver: Receiver[ComponentPoolStatus],
4242
power_manager_requests_sender: Sender[_power_managing.Proposal],
4343
power_manager_bounds_subscription_sender: Sender[_power_managing.ReportRequest],
4444
min_update_interval: timedelta,
@@ -131,7 +131,9 @@ def _get_all_batteries(self) -> frozenset[int]:
131131
}
132132
)
133133

134-
async def _update_battery_status(self, receiver: Receiver[ComponentStatus]) -> None:
134+
async def _update_battery_status(
135+
self, receiver: Receiver[ComponentPoolStatus]
136+
) -> None:
135137
async for status in receiver:
136138
self._working_batteries = status.get_working_components(self._batteries)
137139
for item in self._active_methods.values():

tests/actor/power_distributing/test_power_distributing.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
from frequenz.sdk import microgrid
1818
from frequenz.sdk.actor.power_distributing import (
19-
ComponentStatus,
19+
ComponentPoolStatus,
2020
PowerDistributingActor,
2121
Request,
2222
)
@@ -58,7 +58,7 @@ async def test_constructor(self, mocker: MockerFixture) -> None:
5858

5959
requests_channel = Broadcast[Request]("power_distributor requests")
6060
results_channel = Broadcast[Result]("power_distributor results")
61-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
61+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
6262
async with PowerDistributingActor(
6363
requests_receiver=requests_channel.new_receiver(),
6464
results_sender=results_channel.new_sender(),
@@ -130,7 +130,7 @@ async def test_power_distributor_one_user(self, mocker: MockerFixture) -> None:
130130
)
131131

132132
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
133-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
133+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
134134
async with PowerDistributingActor(
135135
requests_receiver=requests_channel.new_receiver(),
136136
results_sender=results_channel.new_sender(),
@@ -193,7 +193,7 @@ async def test_power_distributor_exclusion_bounds(
193193
)
194194

195195
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
196-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
196+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
197197
async with PowerDistributingActor(
198198
requests_receiver=requests_channel.new_receiver(),
199199
results_sender=results_channel.new_sender(),
@@ -294,7 +294,7 @@ async def test_two_batteries_one_inverters(self, mocker: MockerFixture) -> None:
294294
)
295295

296296
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
297-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
297+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
298298

299299
async with PowerDistributingActor(
300300
requests_receiver=requests_channel.new_receiver(),
@@ -376,7 +376,7 @@ async def test_two_batteries_one_broken_one_inverters(
376376
)
377377

378378
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
379-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
379+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
380380

381381
async with PowerDistributingActor(
382382
requests_receiver=requests_channel.new_receiver(),
@@ -450,7 +450,7 @@ async def test_battery_two_inverters(self, mocker: MockerFixture) -> None:
450450
)
451451

452452
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
453-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
453+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
454454

455455
async with PowerDistributingActor(
456456
requests_receiver=requests_channel.new_receiver(),
@@ -528,7 +528,7 @@ async def test_two_batteries_three_inverters(self, mocker: MockerFixture) -> Non
528528
)
529529

530530
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
531-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
531+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
532532

533533
async with PowerDistributingActor(
534534
requests_receiver=requests_channel.new_receiver(),
@@ -617,7 +617,7 @@ async def test_two_batteries_one_inverter_different_exclusion_bounds_2(
617617
)
618618

619619
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
620-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
620+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
621621

622622
async with PowerDistributingActor(
623623
requests_receiver=requests_channel.new_receiver(),
@@ -705,7 +705,7 @@ async def test_two_batteries_one_inverter_different_exclusion_bounds(
705705
)
706706

707707
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
708-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
708+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
709709

710710
async with PowerDistributingActor(
711711
requests_receiver=requests_channel.new_receiver(),
@@ -776,7 +776,7 @@ async def test_connected_but_not_requested_batteries(
776776
)
777777

778778
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
779-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
779+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
780780

781781
async with PowerDistributingActor(
782782
requests_receiver=requests_channel.new_receiver(),
@@ -838,7 +838,7 @@ async def test_battery_soc_nan(self, mocker: MockerFixture) -> None:
838838
)
839839

840840
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
841-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
841+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
842842
async with PowerDistributingActor(
843843
requests_receiver=requests_channel.new_receiver(),
844844
results_sender=results_channel.new_sender(),
@@ -902,7 +902,7 @@ async def test_battery_capacity_nan(self, mocker: MockerFixture) -> None:
902902
)
903903

904904
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
905-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
905+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
906906
async with PowerDistributingActor(
907907
requests_receiver=requests_channel.new_receiver(),
908908
results_sender=results_channel.new_sender(),
@@ -974,7 +974,7 @@ async def test_battery_power_bounds_nan(self, mocker: MockerFixture) -> None:
974974
)
975975

976976
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
977-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
977+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
978978
async with PowerDistributingActor(
979979
requests_receiver=requests_channel.new_receiver(),
980980
results_sender=results_channel.new_sender(),
@@ -1024,7 +1024,7 @@ async def test_power_distributor_invalid_battery_id(
10241024
)
10251025
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
10261026

1027-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
1027+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
10281028
async with PowerDistributingActor(
10291029
requests_receiver=requests_channel.new_receiver(),
10301030
results_sender=results_channel.new_sender(),
@@ -1074,7 +1074,7 @@ async def test_power_distributor_one_user_adjust_power_consume(
10741074

10751075
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
10761076

1077-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
1077+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
10781078
async with PowerDistributingActor(
10791079
requests_receiver=requests_channel.new_receiver(),
10801080
results_sender=results_channel.new_sender(),
@@ -1126,7 +1126,7 @@ async def test_power_distributor_one_user_adjust_power_supply(
11261126

11271127
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
11281128

1129-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
1129+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
11301130
async with PowerDistributingActor(
11311131
requests_receiver=requests_channel.new_receiver(),
11321132
results_sender=results_channel.new_sender(),
@@ -1178,7 +1178,7 @@ async def test_power_distributor_one_user_adjust_power_success(
11781178

11791179
mocker.patch("asyncio.sleep", new_callable=AsyncMock)
11801180

1181-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
1181+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
11821182
async with PowerDistributingActor(
11831183
requests_receiver=requests_channel.new_receiver(),
11841184
results_sender=results_channel.new_sender(),
@@ -1223,7 +1223,7 @@ async def test_not_all_batteries_are_working(self, mocker: MockerFixture) -> Non
12231223
requests_channel = Broadcast[Request]("power_distributor requests")
12241224
results_channel = Broadcast[Result]("power_distributor results")
12251225

1226-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
1226+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
12271227
async with PowerDistributingActor(
12281228
requests_receiver=requests_channel.new_receiver(),
12291229
results_sender=results_channel.new_sender(),
@@ -1284,7 +1284,7 @@ async def test_partial_failure_result(self, mocker: MockerFixture) -> None:
12841284
requests_channel = Broadcast[Request]("power_distributor requests")
12851285
results_channel = Broadcast[Result]("power_distributor results")
12861286

1287-
battery_status_channel = Broadcast[ComponentStatus]("battery_status")
1287+
battery_status_channel = Broadcast[ComponentPoolStatus]("battery_status")
12881288
async with PowerDistributingActor(
12891289
requests_receiver=requests_channel.new_receiver(),
12901290
results_sender=results_channel.new_sender(),

0 commit comments

Comments
 (0)