@@ -89,11 +89,13 @@ class PowerDistributingActor:
8989 printed.
9090
9191 Example:
92- ``` python
92+ ```python
9393 import grpc.aio as grpcaio
9494
95- from frequenz.sdk.microgrid.graph import _MicrogridComponentGraph
95+ from frequenz.sdk.microgrid._graph import _MicrogridComponentGraph
96+ from frequenz.sdk import microgrid
9697 from frequenz.sdk.microgrid.component import ComponentCategory
98+ from frequenz.sdk.actor import ResamplerConfig
9799 from frequenz.sdk.actor.power_distributing import (
98100 PowerDistributingActor,
99101 Request,
@@ -103,42 +105,60 @@ class PowerDistributingActor:
103105 PartialFailure,
104106 Ignored,
105107 )
108+ from frequenz.channels import Bidirectional, Broadcast, Receiver, Sender
109+ from datetime import timedelta
110+ from frequenz.sdk import actor
111+
112+ HOST = "localhost"
113+ PORT = 50051
114+
115+ async def main() -> None:
116+ await microgrid.initialize(
117+ HOST,
118+ PORT,
119+ ResamplerConfig(resampling_period=timedelta(seconds=1))
120+ )
121+
122+ graph = microgrid.connection_manager.get().component_graph
106123
124+ batteries = graph.components(component_category={ComponentCategory.BATTERY})
125+ batteries_ids = {c.component_id for c in batteries}
107126
108- target = f"{host}:{port}"
109- grpc_channel = grpcaio.insecure_channel(target)
110- api = MicrogridGrpcClient(grpc_channel, target)
127+ battery_status_channel = Broadcast[BatteryStatus]("battery-status")
111128
112- graph = _MicrogridComponentGraph()
113- await graph.refresh_from_api(api)
129+ channel = Bidirectional[Request, Result]("user1", "power_distributor")
130+ power_distributor = PowerDistributingActor(
131+ users_channels={"user1": channel.service_handle},
132+ battery_status_sender=battery_status_channel.new_sender(),
133+ )
114134
115- batteries = graph.components(component_category={ComponentCategory.BATTERY})
116- batteries_ids = {c.component_id for c in batteries}
135+ # Start the actor
136+ await actor.run(power_distributor)
117137
118- channel = Bidirectional[Request, Result]("user1", "power_distributor")
119- power_distributor = PowerDistributingActor(
120- mock_api, component_graph, {"user1": channel.service_handle}
121- )
138+ client_handle = channel.client_handle
122139
123- client_handle = channel.client_handle
124-
125- # Set power 1200W to given batteries.
126- request = Request(power=1200.0, batteries=batteries_ids, request_timeout_sec=10.0)
127- await client_handle.send(request)
128-
129- # It is recommended to use timeout when waiting for the response!
130- result: Result = await asyncio.wait_for(client_handle.receive(), timeout=10)
131-
132- if isinstance(result, Success):
133- print("Command succeed")
134- elif isinstance(result, PartialFailure):
135- print(
136- f"Batteries {result.failed_batteries} failed, total failed power" \
137- f"{result.failed_power}")
138- elif isinstance(result, Ignored):
139- print(f"Request was ignored, because of newer request")
140- elif isinstance(result, Error):
141- print(f"Request failed with error: {result.msg}")
140+ # Set power 1200W to given batteries.
141+ request = Request(power=1200.0, batteries=batteries_ids, request_timeout_sec=10.0)
142+ await client_handle.send(request)
143+
144+ # Set power 1200W to given batteries.
145+ request = Request(power=1200, batteries=batteries_ids, request_timeout_sec=10.0)
146+ await client_handle.send(request)
147+
148+ # It is recommended to use timeout when waiting for the response!
149+ result: Result = await asyncio.wait_for(client_handle.receive(), timeout=10)
150+
151+ if isinstance(result, Success):
152+ print("Command succeed")
153+ elif isinstance(result, PartialFailure):
154+ print(
155+ f"Batteries {result.failed_batteries} failed, total failed power" \
156+ f"{result.failed_power}"
157+ )
158+ elif isinstance(result, Ignored):
159+ print("Request was ignored, because of newer request")
160+ elif isinstance(result, Error):
161+ print(f"Request failed with error: {result.msg}")
142162 ```
143163 """
144164
0 commit comments