Skip to content

Commit ea5e28c

Browse files
committed
Allow None values in PowerManager reporting streams
Signed-off-by: Sahas Subramanian <[email protected]>
1 parent 18d68c3 commit ea5e28c

File tree

4 files changed

+18
-20
lines changed

4 files changed

+18
-20
lines changed

src/frequenz/sdk/actor/_power_managing/_base_classes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ class Bounds:
5555
class Report:
5656
"""Current PowerManager report for a set of batteries."""
5757

58-
target_power: Power
58+
target_power: Power | None
5959
"""The currently set power for the batteries."""
6060

61-
inclusion_bounds: Bounds
61+
inclusion_bounds: Bounds | None
6262
"""The available inclusion bounds for the batteries, for the actor's priority.
6363
6464
These bounds are adjusted to any restrictions placed by actors with higher

src/frequenz/sdk/actor/_power_managing/_matryoshka.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -152,16 +152,13 @@ def get_status(
152152
The target power and the available bounds for the given batteries, for
153153
the given priority.
154154
"""
155-
lower_bound = (
156-
system_bounds.inclusion_bounds.lower
157-
if system_bounds.inclusion_bounds
158-
else Power.zero() # in the absence of system bounds, block all requests.
159-
)
160-
upper_bound = (
161-
system_bounds.inclusion_bounds.upper
162-
if system_bounds.inclusion_bounds
163-
else Power.zero()
164-
)
155+
target_power = self._target_power.get(battery_ids)
156+
if system_bounds.inclusion_bounds is None:
157+
return Report(target_power, None)
158+
159+
lower_bound = system_bounds.inclusion_bounds.lower
160+
upper_bound = system_bounds.inclusion_bounds.upper
161+
165162
for next_proposal in reversed(self._battery_buckets.get(battery_ids, [])):
166163
if next_proposal.priority <= priority:
167164
break
@@ -175,6 +172,6 @@ def get_status(
175172
break
176173

177174
return Report(
178-
target_power=self._target_power.get(battery_ids, Power.zero()),
175+
target_power,
179176
inclusion_bounds=Bounds(lower=lower_bound, upper=upper_bound),
180177
)

tests/actor/_power_managing/test_matryoshka.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ def test_bounds(
5454
priority: int, expected_power: float, expected_bounds: tuple[float, float]
5555
) -> None:
5656
report = algorithm.get_status(batteries, priority, system_bounds)
57+
assert report.target_power is not None and report.inclusion_bounds is not None
5758
assert report.target_power.as_watts() == expected_power
5859
assert report.inclusion_bounds.lower.as_watts() == expected_bounds[0]
5960
assert report.inclusion_bounds.upper.as_watts() == expected_bounds[1]

tests/timeseries/_battery_pool/test_battery_pool_control_methods.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,10 @@ async def _init_data_for_inverters(self, mocks: Mocks) -> None:
137137
)
138138

139139
def _make_report(
140-
self, *, power: float, lower: float, upper: float
140+
self, *, power: float | None, lower: float, upper: float
141141
) -> _power_managing.Report:
142142
return _power_managing.Report(
143-
target_power=Power.from_watts(power),
143+
target_power=Power.from_watts(power) if power is not None else None,
144144
inclusion_bounds=_power_managing.Bounds(
145145
lower=Power.from_watts(lower),
146146
upper=Power.from_watts(upper),
@@ -175,7 +175,7 @@ async def test_case_1(
175175
bounds_rx = battery_pool.power_bounds().new_receiver()
176176

177177
assert await bounds_rx.receive() == self._make_report(
178-
power=0.0, lower=-4000.0, upper=4000.0
178+
power=None, lower=-4000.0, upper=4000.0
179179
)
180180

181181
await battery_pool.set_power(Power.from_watts(1000.0))
@@ -210,10 +210,10 @@ async def test_case_2(self, mocks: Mocks, mocker: MockerFixture) -> None:
210210
bounds_2_rx = battery_pool_2.power_bounds().new_receiver()
211211

212212
assert await bounds_1_rx.receive() == self._make_report(
213-
power=0.0, lower=-2000.0, upper=2000.0
213+
power=None, lower=-2000.0, upper=2000.0
214214
)
215215
assert await bounds_2_rx.receive() == self._make_report(
216-
power=0.0, lower=-2000.0, upper=2000.0
216+
power=None, lower=-2000.0, upper=2000.0
217217
)
218218
await battery_pool_1.set_power(Power.from_watts(1000.0))
219219
assert await bounds_1_rx.receive() == self._make_report(
@@ -256,10 +256,10 @@ async def test_case_3(self, mocks: Mocks, mocker: MockerFixture) -> None:
256256
bounds_2_rx = battery_pool_2.power_bounds(1).new_receiver()
257257

258258
assert await bounds_1_rx.receive() == self._make_report(
259-
power=0.0, lower=-4000.0, upper=4000.0
259+
power=None, lower=-4000.0, upper=4000.0
260260
)
261261
assert await bounds_2_rx.receive() == self._make_report(
262-
power=0.0, lower=-4000.0, upper=4000.0
262+
power=None, lower=-4000.0, upper=4000.0
263263
)
264264
await battery_pool_1.set_power(
265265
Power.from_watts(-1000.0),

0 commit comments

Comments
 (0)