Skip to content

Commit 98fdb62

Browse files
committed
Update power distribution example program to work with new interface
Signed-off-by: Sahas Subramanian <[email protected]>
1 parent 9407a89 commit 98fdb62

File tree

1 file changed

+13
-91
lines changed

1 file changed

+13
-91
lines changed

examples/power_distribution.py

Lines changed: 13 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,14 @@
1414
import logging
1515
from datetime import datetime, timedelta, timezone
1616
from queue import Queue
17-
from typing import List, Optional, Set
17+
from typing import List, Optional
1818

19-
from frequenz.channels import Bidirectional, Broadcast, Receiver, Sender
19+
from frequenz.channels import Broadcast, Receiver, Sender
2020

2121
from frequenz.sdk import actor, microgrid
22-
from frequenz.sdk.actor import (
23-
ChannelRegistry,
24-
ComponentMetricRequest,
25-
ComponentMetricsResamplingActor,
26-
DataSourcingActor,
27-
ResamplerConfig,
28-
)
29-
from frequenz.sdk.actor.power_distributing import (
30-
BatteryStatus,
31-
PowerDistributingActor,
32-
Request,
33-
Result,
34-
Success,
35-
)
36-
from frequenz.sdk.microgrid import connection_manager
37-
from frequenz.sdk.microgrid.component import Component, ComponentCategory
22+
from frequenz.sdk.actor import ResamplerConfig
23+
from frequenz.sdk.actor.power_distributing import Result, Success
3824
from frequenz.sdk.timeseries import Sample
39-
from frequenz.sdk.timeseries.logical_meter import LogicalMeter
4025

4126
_logger = logging.getLogger(__name__)
4227
HOST = "microgrid.sandbox.api.frequenz.io" # it should be the host name.
@@ -47,30 +32,26 @@
4732
class DecisionMakingActor:
4833
"""Actor that receives set receives power for given batteries."""
4934

50-
def __init__( # pylint: disable=too-many-arguments
35+
def __init__(
5136
self,
5237
power_channel: Receiver[List[float]],
53-
power_distributor_handle: Bidirectional.Handle[Request, Result],
54-
batteries: Set[int],
5538
) -> None:
5639
"""Create actor instance.
5740
5841
Args:
5942
power_channel: channel where actor receives requests
60-
power_distributor_handle: Channel
61-
for communication with power distributor
62-
batteries: Batteries to charge/discharge
6343
"""
6444
self._power_channel = power_channel
65-
self._power_distributor_handle = power_distributor_handle
66-
self._batteries = batteries
6745

6846
async def run(self) -> None:
6947
"""Run actor.
7048
7149
Raises:
7250
RuntimeError: If any channel was closed unexpectedly
7351
"""
52+
battery_pool = microgrid.battery_pool()
53+
result_rx = battery_pool.power_distribution_results()
54+
7455
while True:
7556
# wait for request with blocking
7657
request: Optional[List[float]] = await self._power_channel.receive()
@@ -88,16 +69,11 @@ async def run(self) -> None:
8869
# Discharge
8970
power_to_set = -10000.0
9071

91-
await self._power_distributor_handle.send(
92-
Request(
93-
power_to_set,
94-
batteries=self._batteries,
95-
request_timeout_sec=2.0,
96-
)
97-
)
72+
await battery_pool.set_power(power_to_set)
9873
try:
9974
result: Optional[Result] = await asyncio.wait_for(
100-
self._power_distributor_handle.receive(), timeout=3
75+
result_rx.receive(),
76+
timeout=3,
10177
)
10278
except asyncio.exceptions.TimeoutError:
10379
_logger.error(
@@ -164,76 +140,22 @@ async def run() -> None:
164140
HOST, PORT, ResamplerConfig(resampling_period=timedelta(seconds=1.0))
165141
)
166142

167-
channel_registry = ChannelRegistry(name="Microgrid Channel Registry")
168-
169-
data_source_request_channel = Broadcast[ComponentMetricRequest](
170-
"Data Source Request Channel"
171-
)
172-
173-
resampling_actor_request_channel = Broadcast[ComponentMetricRequest](
174-
"Resampling Actor Request Channel"
175-
)
176-
177-
_ds_actor = DataSourcingActor(
178-
request_receiver=data_source_request_channel.new_receiver(),
179-
registry=channel_registry,
180-
)
181-
182-
_resampling_actor = ComponentMetricsResamplingActor(
183-
channel_registry=channel_registry,
184-
data_sourcing_request_sender=data_source_request_channel.new_sender(),
185-
resampling_request_receiver=resampling_actor_request_channel.new_receiver(),
186-
config=ResamplerConfig(resampling_period=timedelta(seconds=1.0)),
187-
)
188-
189-
logical_meter = LogicalMeter(
190-
channel_registry,
191-
resampling_actor_request_channel.new_sender(),
192-
)
193-
sending_actor_id: str = "SendingActor"
194-
# Bidirectional channel is used for one sender - one receiver communication
195-
power_distributor_channels = {
196-
sending_actor_id: Bidirectional[Request, Result](
197-
client_id=sending_actor_id, service_id="PowerDistributingActor"
198-
)
199-
}
200-
201-
battery_status_channel = Broadcast[BatteryStatus]("battery-status")
202-
203-
power_distributor = PowerDistributingActor(
204-
users_channels={
205-
key: channel.service_handle
206-
for key, channel in power_distributor_channels.items()
207-
},
208-
battery_status_sender=battery_status_channel.new_sender(),
209-
)
210-
143+
logical_meter = microgrid.logical_meter()
211144
# Channel to communicate between actors.
212145
power_dist_req_chan = Broadcast[List[float]](
213146
"power-distribing-req", resend_latest=True
214147
)
215148

216-
# You should get components from ComponentGraph, not from the api.
217-
# It is faster and and non blocking approach.
218-
batteries: Set[Component] = connection_manager.get().component_graph.components(
219-
# component_type=set(ComponentType.BATTERY) in v0.8.0
220-
component_category={ComponentCategory.BATTERY}
221-
)
222-
223149
service_actor = DecisionMakingActor(
224150
power_channel=power_dist_req_chan.new_receiver(),
225-
power_distributor_handle=power_distributor_channels[
226-
sending_actor_id
227-
].client_handle,
228-
batteries={battery.component_id for battery in batteries},
229151
)
230152

231153
client_actor = DataCollectingActor(
232154
request_channel=power_dist_req_chan.new_sender(),
233155
active_power_data=logical_meter.grid_power.new_receiver(),
234156
)
235157

236-
await actor.run(service_actor, client_actor, power_distributor)
158+
await actor.run(service_actor, client_actor)
237159

238160

239161
asyncio.run(run())

0 commit comments

Comments
 (0)