1414import logging
1515from datetime import datetime , timedelta , timezone
1616from 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
2121from 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
3824from frequenz .sdk .timeseries import Sample
39- from frequenz .sdk .timeseries .logical_meter import LogicalMeter
4025
4126_logger = logging .getLogger (__name__ )
4227HOST = "microgrid.sandbox.api.frequenz.io" # it should be the host name.
4732class 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
239161asyncio .run (run ())
0 commit comments