Skip to content

Commit 36385bc

Browse files
Update BatteryPool tests, examples to use microgrid.battery_pool() (#336)
... instead of creating their own `BatteryPool` instances.
2 parents c565ddf + 19aacb9 commit 36385bc

File tree

6 files changed

+57
-158
lines changed

6 files changed

+57
-158
lines changed

examples/battery_pool.py

Lines changed: 3 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -7,71 +7,18 @@
77

88
import asyncio
99
import logging
10-
from datetime import timedelta
1110
from typing import Any, Dict
1211

13-
from frequenz.channels import Broadcast, Receiver
12+
from frequenz.channels import Receiver
1413
from frequenz.channels.util import MergeNamed
1514

1615
from frequenz.sdk import microgrid
17-
from frequenz.sdk.actor import (
18-
ChannelRegistry,
19-
ComponentMetricRequest,
20-
DataSourcingActor,
21-
ResamplerConfig,
22-
)
23-
from frequenz.sdk.actor.power_distributing import PowerDistributingActor
24-
from frequenz.sdk.actor.power_distributing._battery_pool_status import BatteryStatus
25-
from frequenz.sdk.microgrid import connection_manager
26-
from frequenz.sdk.microgrid.component import ComponentCategory
27-
from frequenz.sdk.timeseries.battery_pool import BatteryPool
16+
from frequenz.sdk.actor import ResamplerConfig
2817

2918
HOST = "microgrid.sandbox.api.frequenz.io" # it should be the host name.
3019
PORT = 61060
3120

3221

33-
def create_battery_pool() -> BatteryPool:
34-
"""Create battery pool.
35-
36-
It needs many instance to be created before.
37-
38-
Returns:
39-
BatteryPool instance ready to use.
40-
"""
41-
channel_registry = ChannelRegistry(name="data-registry")
42-
43-
# Create a channels for sending/receiving subscription requests
44-
data_source_request_channel = Broadcast[ComponentMetricRequest](
45-
"data-source", resend_latest=True
46-
)
47-
48-
# Instantiate a data sourcing actor
49-
_ = DataSourcingActor(
50-
request_receiver=data_source_request_channel.new_receiver(
51-
"data_sourcing_receiver"
52-
),
53-
registry=channel_registry,
54-
)
55-
56-
battery_status_channel = Broadcast[BatteryStatus]("batteries-status")
57-
_ = PowerDistributingActor(
58-
users_channels={},
59-
battery_status_sender=battery_status_channel.new_sender(),
60-
)
61-
62-
batteries = connection_manager.get().component_graph.components(
63-
component_category={ComponentCategory.BATTERY}
64-
)
65-
66-
return BatteryPool(
67-
batteries_id=set(battery.component_id for battery in batteries),
68-
batteries_status_receiver=battery_status_channel.new_receiver(
69-
name="battery_pool", maxsize=1
70-
),
71-
min_update_interval=timedelta(seconds=0.2),
72-
)
73-
74-
7522
async def main() -> None:
7623
"""Create the battery pool, activate all formulas and listen for any update."""
7724
logging.basicConfig(
@@ -81,7 +28,7 @@ async def main() -> None:
8128
host=HOST, port=PORT, resampler_config=ResamplerConfig(resampling_period_s=1.0)
8229
)
8330

84-
battery_pool = create_battery_pool()
31+
battery_pool = microgrid.battery_pool()
8532
receivers: Dict[str, Receiver[Any]] = {
8633
"soc": await battery_pool.soc(maxsize=1),
8734
"capacity": await battery_pool.capacity(maxsize=1),

src/frequenz/sdk/microgrid/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from ..actor import ResamplerConfig
1111
from . import _data_pipeline, client, component, connection_manager
12-
from ._data_pipeline import ev_charger_pool, logical_meter
12+
from ._data_pipeline import battery_pool, ev_charger_pool, logical_meter
1313
from ._graph import ComponentGraph
1414

1515

@@ -30,6 +30,7 @@ async def initialize(host: str, port: int, resampler_config: ResamplerConfig) ->
3030
"initialize",
3131
"client",
3232
"component",
33+
"battery_pool",
3334
"ev_charger_pool",
3435
"logical_meter",
3536
]

src/frequenz/sdk/microgrid/_data_pipeline.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ def __init__(
8181
self._data_sourcing_actor: _ActorInfo | None = None
8282
self._resampling_actor: _ActorInfo | None = None
8383

84-
self._battery_status_channel = Broadcast["BatteryStatus"]("battery-status")
84+
self._battery_status_channel = Broadcast["BatteryStatus"](
85+
"battery-status", resend_latest=True
86+
)
8587
self._power_distribution_channel = Bidirectional["Request", "Result"](
8688
"Default", "Power Distributing Actor"
8789
)
@@ -170,7 +172,9 @@ def battery_pool(
170172

171173
if key not in self._battery_pools:
172174
self._battery_pools[key] = BatteryPool(
173-
batteries_status_receiver=self._battery_status_channel.new_receiver(),
175+
batteries_status_receiver=self._battery_status_channel.new_receiver(
176+
maxsize=1
177+
),
174178
min_update_interval=timedelta(
175179
seconds=self._resampler_config.resampling_period_s
176180
),

tests/timeseries/_battery_pool/test_battery_pool.py

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,20 @@
88
import dataclasses
99
import logging
1010
from dataclasses import dataclass, is_dataclass, replace
11-
from datetime import datetime, timedelta, timezone
11+
from datetime import datetime, timezone
1212
from typing import Any, AsyncIterator, Generic, Iterator, TypeVar
1313

1414
import async_solipsism
1515
import pytest
16-
from frequenz.channels import Broadcast, Receiver, Sender
16+
from frequenz.channels import Receiver, Sender
1717
from pytest_mock import MockerFixture
1818

19+
from frequenz.sdk import microgrid
1920
from frequenz.sdk._internal._constants import (
2021
MAX_BATTERY_DATA_AGE_SEC,
2122
WAIT_FOR_COMPONENT_DATA_SEC,
2223
)
24+
from frequenz.sdk.actor import ResamplerConfig
2325
from frequenz.sdk.actor.power_distributing import BatteryStatus
2426
from frequenz.sdk.microgrid.component import ComponentCategory
2527
from frequenz.sdk.timeseries.battery_pool import (
@@ -40,7 +42,6 @@
4042
create_component_graph_structure,
4143
)
4244
from ...utils.mock_microgrid_client import MockMicrogridClient
43-
from ...utils.sdk_interface import SdkInterface
4445

4546
_logger = logging.getLogger(__name__)
4647

@@ -130,27 +131,37 @@ async def setup_all_batteries(mocker: MockerFixture) -> AsyncIterator[SetupArgs]
130131
mock_microgrid = create_mock_microgrid(
131132
mocker, ComponentGraphConfig(batteries_num=2)
132133
)
133-
sdk = SdkInterface(resampling_period_s=1)
134+
min_update_interval: float = 0.2
135+
# pylint: disable=protected-access
136+
microgrid._data_pipeline._DATA_PIPELINE = None
137+
microgrid._data_pipeline.initialize(ResamplerConfig(min_update_interval))
134138
streamer = MockComponentDataStreamer(mock_microgrid)
135139

136140
# We don't use status channel from the sdk interface to limit
137141
# the scope of this tests. This tests should cover BatteryPool only.
138142
# We use our own battery status channel, where we easily control set of working
139143
# batteries.
140-
battery_status_channel = Broadcast[BatteryStatus]("bat_status", resend_latest=True)
141-
sender_channel = battery_status_channel.new_sender()
142-
min_update_interval: float = 0.2
143-
battery_pool = BatteryPool(
144-
batteries_status_receiver=battery_status_channel.new_receiver(maxsize=1),
145-
min_update_interval=timedelta(seconds=min_update_interval),
146-
)
144+
battery_pool = microgrid.battery_pool()
145+
146+
assert microgrid._data_pipeline._DATA_PIPELINE is not None
147147

148148
args = SetupArgs(
149-
battery_pool, min_update_interval, mock_microgrid, streamer, sender_channel
149+
battery_pool,
150+
min_update_interval,
151+
mock_microgrid,
152+
streamer,
153+
microgrid._data_pipeline._DATA_PIPELINE._battery_status_channel.new_sender(),
150154
)
151155

152156
yield args
153-
await asyncio.gather(*[sdk.stop(), battery_pool.stop(), streamer.stop()])
157+
await asyncio.gather(
158+
*[
159+
microgrid._data_pipeline._DATA_PIPELINE._stop(),
160+
battery_pool.stop(),
161+
streamer.stop(),
162+
]
163+
)
164+
# pylint: enable=protected-access
154165

155166

156167
@pytest.fixture
@@ -170,29 +181,39 @@ async def setup_batteries_pool(mocker: MockerFixture) -> AsyncIterator[SetupArgs
170181
mocker, ComponentGraphConfig(batteries_num=4)
171182
)
172183
streamer = MockComponentDataStreamer(mock_microgrid)
173-
sdk = SdkInterface(resampling_period_s=1)
184+
min_update_interval: float = 0.2
185+
# pylint: disable=protected-access
186+
microgrid._data_pipeline._DATA_PIPELINE = None
187+
microgrid._data_pipeline.initialize(ResamplerConfig(min_update_interval))
174188

175189
# We don't use status channel from the sdk interface to limit
176190
# the scope of this tests. This tests should cover BatteryPool only.
177191
# We use our own battery status channel, where we easily control set of working
178192
# batteries.
179-
battery_status_channel = Broadcast[BatteryStatus]("bat_status", resend_latest=True)
180-
sender_channel = battery_status_channel.new_sender()
181-
min_update_interval: float = 0.2
182193
all_batteries = list(get_components(mock_microgrid, ComponentCategory.BATTERY))
183194

184-
battery_pool = BatteryPool(
185-
batteries_id=set(all_batteries[:2]),
186-
batteries_status_receiver=battery_status_channel.new_receiver(maxsize=1),
187-
min_update_interval=timedelta(seconds=min_update_interval),
188-
)
195+
battery_pool = microgrid.battery_pool(set(all_batteries[:2]))
196+
197+
assert microgrid._data_pipeline._DATA_PIPELINE is not None
189198

190199
args = SetupArgs(
191-
battery_pool, min_update_interval, mock_microgrid, streamer, sender_channel
200+
battery_pool,
201+
min_update_interval,
202+
mock_microgrid,
203+
streamer,
204+
microgrid._data_pipeline._DATA_PIPELINE._battery_status_channel.new_sender(),
192205
)
193206

194207
yield args
195-
await asyncio.gather(*[sdk.stop(), battery_pool.stop(), streamer.stop()])
208+
209+
await asyncio.gather(
210+
*[
211+
microgrid._data_pipeline._DATA_PIPELINE._stop(),
212+
battery_pool.stop(),
213+
streamer.stop(),
214+
]
215+
)
216+
# pylint: enable=protected-access
196217

197218

198219
T = TypeVar("T")

tests/timeseries/_formula_engine/test_formula_composition.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ async def test_formula_composition( # pylint: disable=too-many-locals
2323
mocker: MockerFixture,
2424
) -> None:
2525
"""Test the composition of formulas."""
26-
mockgrid = MockMicrogrid(grid_side_meter=False, sample_rate_s=0.1)
26+
mockgrid = MockMicrogrid(grid_side_meter=False, sample_rate_s=0.15)
2727
mockgrid.add_batteries(3)
2828
mockgrid.add_solar_inverters(2)
2929
await mockgrid.start(mocker)

tests/utils/sdk_interface.py

Lines changed: 0 additions & 74 deletions
This file was deleted.

0 commit comments

Comments
 (0)