Skip to content

Commit 4d9b491

Browse files
Add example how to use battery pool.
Signed-off-by: ela-kotulska-frequenz <[email protected]>
1 parent e0cde3c commit 4d9b491

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

examples/battery_pool.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# License: MIT
2+
# Copyright © 2023 Frequenz Energy-as-a-Service GmbH
3+
4+
"""Script with an example how to use BatteryPool."""
5+
6+
from __future__ import annotations
7+
8+
import asyncio
9+
import logging
10+
from datetime import timedelta
11+
from typing import Any, Dict
12+
13+
from frequenz.channels import Broadcast, Receiver
14+
from frequenz.channels.util import MergeNamed
15+
16+
from frequenz.sdk import microgrid
17+
from frequenz.sdk.actor import (
18+
ChannelRegistry,
19+
ComponentMetricRequest,
20+
DataSourcingActor,
21+
)
22+
from frequenz.sdk.actor.power_distributing import PowerDistributingActor
23+
from frequenz.sdk.actor.power_distributing._battery_pool_status import BatteryStatus
24+
from frequenz.sdk.microgrid.component import ComponentCategory
25+
from frequenz.sdk.timeseries.battery_pool import BatteryPool
26+
27+
HOST = "microgrid.sandbox.api.frequenz.io" # it should be the host name.
28+
PORT = 61060
29+
30+
31+
def create_battery_pool() -> BatteryPool:
32+
"""Create battery pool.
33+
34+
It needs many instance to be created before.
35+
36+
Returns:
37+
BatteryPool instance ready to use.
38+
"""
39+
channel_registry = ChannelRegistry(name="data-registry")
40+
41+
# Create a channels for sending/receiving subscription requests
42+
data_source_request_channel = Broadcast[ComponentMetricRequest](
43+
"data-source", resend_latest=True
44+
)
45+
46+
# Instantiate a data sourcing actor
47+
_ = DataSourcingActor(
48+
request_receiver=data_source_request_channel.new_receiver(
49+
"data_sourcing_receiver"
50+
),
51+
registry=channel_registry,
52+
)
53+
54+
battery_status_channel = Broadcast[BatteryStatus]("batteries-status")
55+
_ = PowerDistributingActor(
56+
users_channels={},
57+
battery_status_sender=battery_status_channel.new_sender(),
58+
)
59+
60+
batteries = microgrid.get().component_graph.components(
61+
component_category={ComponentCategory.BATTERY}
62+
)
63+
64+
return BatteryPool(
65+
batteries_id=set(battery.component_id for battery in batteries),
66+
batteries_status_receiver=battery_status_channel.new_receiver(
67+
name="battery_pool", maxsize=1
68+
),
69+
min_update_interval=timedelta(seconds=0.2),
70+
)
71+
72+
73+
async def main() -> None:
74+
"""Create the battery pool, activate all formulas and listen for any update."""
75+
logging.basicConfig(
76+
level=logging.DEBUG, format="%(asctime)s %(name)s %(levelname)s:%(message)s"
77+
)
78+
await microgrid.initialize(host=HOST, port=PORT)
79+
80+
battery_pool = create_battery_pool()
81+
receivers: Dict[str, Receiver[Any]] = {
82+
"soc": await battery_pool.soc(maxsize=1),
83+
"capacity": await battery_pool.capacity(maxsize=1),
84+
"power_bounds": await battery_pool.power_bounds(maxsize=1),
85+
}
86+
87+
merged_channel = MergeNamed[Any](**receivers)
88+
async for metric_name, metric in merged_channel:
89+
print(f"Received new {metric_name}: {metric}")
90+
91+
92+
asyncio.run(main())

0 commit comments

Comments
 (0)