Skip to content

Commit d2d1ca7

Browse files
committed
Make AbstractPool generic over ref store and report types.
Extract abstract base class for reports. Signed-off-by: Simon Völcker <simon.voelcker@frequenz.com>
1 parent 7060171 commit d2d1ca7

9 files changed

Lines changed: 54 additions & 14 deletions

File tree

src/frequenz/sdk/timeseries/abstract_pool/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55

66
from ._abstract_pool import AbstractPool
77
from ._abstract_pool_reference_store import AbstractPoolReferenceStore
8+
from ._abstract_pool_report import AbstractPoolReport
89

910
__all__ = [
1011
"AbstractPool",
1112
"AbstractPoolReferenceStore",
13+
"AbstractPoolReport",
1214
]

src/frequenz/sdk/timeseries/abstract_pool/_abstract_pool.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import uuid
88
from abc import ABC, abstractmethod
99
from collections import abc
10+
from typing import Generic, TypeVar, cast
1011

1112
from frequenz.client.common.microgrid.components import ComponentId
1213
from frequenz.quantities import Power
@@ -15,19 +16,22 @@
1516
from frequenz.sdk.microgrid import _power_distributing, _power_managing
1617
from frequenz.sdk.timeseries import Bounds
1718
from frequenz.sdk.timeseries._base_types import SystemBounds
18-
from frequenz.sdk.timeseries.abstract_pool._abstract_pool_reference_store import (
19-
AbstractPoolReferenceStore,
20-
)
2119
from frequenz.sdk.timeseries.formulas import Formula
2220

21+
from ._abstract_pool_reference_store import AbstractPoolReferenceStore
22+
from ._abstract_pool_report import AbstractPoolReport
2323

24-
class AbstractPool(ABC):
24+
RefStoreT = TypeVar("RefStoreT", bound=AbstractPoolReferenceStore)
25+
ReportT = TypeVar("ReportT", bound=AbstractPoolReport)
26+
27+
28+
class AbstractPool(ABC, Generic[RefStoreT, ReportT]):
2529
"""Abstract base class for component pools."""
2630

2731
def __init__( # pylint: disable=too-many-arguments
2832
self,
2933
*,
30-
pool_ref_store: AbstractPoolReferenceStore,
34+
pool_ref_store: RefStoreT,
3135
name: str | None,
3236
priority: int,
3337
) -> None:
@@ -97,7 +101,7 @@ def power(self) -> Formula[Power]:
97101
"""
98102

99103
@property
100-
def power_status(self) -> ReceiverFetcher[_power_managing._Report]:
104+
def power_status(self) -> ReceiverFetcher[ReportT]:
101105
"""Get a receiver to receive new power status reports when they change.
102106
103107
These include
@@ -124,7 +128,7 @@ def power_status(self) -> ReceiverFetcher[_power_managing._Report]:
124128
)
125129
channel.resend_latest = True
126130

127-
return channel
131+
return cast(ReceiverFetcher[ReportT], channel)
128132

129133
@property
130134
def power_distribution_results(self) -> ReceiverFetcher[_power_distributing.Result]:
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# License: MIT
2+
# Copyright © 2026 Frequenz Energy-as-a-Service GmbH
3+
4+
"""Types for exposing component pool reports."""
5+
6+
import typing
7+
8+
from frequenz.quantities import Power
9+
10+
from .._base_types import Bounds
11+
12+
13+
class AbstractPoolReport(typing.Protocol):
14+
"""A status report for a component pool."""
15+
16+
@property
17+
def target_power(self) -> Power | None:
18+
"""The currently set power for the components."""
19+
20+
@property
21+
def bounds(self) -> Bounds[Power] | None:
22+
"""The usable bounds for the components.
23+
24+
These bounds are adjusted to any restrictions placed by actors with higher
25+
priorities.
26+
"""

src/frequenz/sdk/timeseries/battery_pool/_battery_pool.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,12 @@
2828
SoCCalculator,
2929
TemperatureCalculator,
3030
)
31+
from .messages import BatteryPoolReport
3132

3233
# pylint: disable=protected-access
3334

3435

35-
class BatteryPool(AbstractPool):
36+
class BatteryPool(AbstractPool[BatteryPoolReferenceStore, BatteryPoolReport]):
3637
"""An interface for interaction with pools of batteries.
3738
3839
Provides:

src/frequenz/sdk/timeseries/battery_pool/messages.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@
1616
Success,
1717
)
1818
from .._base_types import Bounds
19+
from ..abstract_pool import AbstractPoolReport
1920

2021

2122
# This class is used to expose the generic reports from the PowerManager with specific
2223
# documentation for the battery pool.
23-
class BatteryPoolReport(typing.Protocol):
24+
class BatteryPoolReport(AbstractPoolReport, typing.Protocol):
2425
"""A status report for a battery pool."""
2526

2627
@property

src/frequenz/sdk/timeseries/ev_charger_pool/_ev_charger_pool.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010
from ...timeseries import Bounds
1111
from ..abstract_pool import AbstractPool
1212
from ..formulas import Formula, Formula3Phase
13+
from ._ev_charger_pool_reference_store import EVChargerPoolReferenceStore
14+
from ._result_types import EVChargerPoolReport
1315

1416

1517
class EVChargerPoolError(Exception):
1618
"""An error that occurred in any of the EVChargerPool methods."""
1719

1820

19-
class EVChargerPool(AbstractPool):
21+
class EVChargerPool(AbstractPool[EVChargerPoolReferenceStore, EVChargerPoolReport]):
2022
"""An interface for interaction with pools of EV Chargers.
2123
2224
Provides:

src/frequenz/sdk/timeseries/ev_charger_pool/_result_types.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77

88
from frequenz.quantities import Power
99

10-
from .._base_types import Bounds
10+
from .. import Bounds
11+
from ..abstract_pool import AbstractPoolReport
1112

1213

13-
class EVChargerPoolReport(typing.Protocol):
14+
class EVChargerPoolReport(AbstractPoolReport, typing.Protocol):
1415
"""A status report for an EV chargers pool."""
1516

1617
@property

src/frequenz/sdk/timeseries/pv_pool/_pv_pool.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@
1111
from ...timeseries import Bounds
1212
from ..abstract_pool import AbstractPool
1313
from ..formulas import Formula
14+
from ._pv_pool_reference_store import PVPoolReferenceStore
15+
from ._result_types import PVPoolReport
1416

1517

1618
class PVPoolError(Exception):
1719
"""An error that occurred in any of the PVPool methods."""
1820

1921

20-
class PVPool(AbstractPool):
22+
class PVPool(AbstractPool[PVPoolReferenceStore, PVPoolReport]):
2123
"""An interface for interaction with pools of PV inverters.
2224
2325
Provides:

src/frequenz/sdk/timeseries/pv_pool/_result_types.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88
from frequenz.quantities import Power
99

1010
from .._base_types import Bounds
11+
from ..abstract_pool import AbstractPoolReport
1112

1213

13-
class PVPoolReport(typing.Protocol):
14+
class PVPoolReport(AbstractPoolReport, typing.Protocol):
1415
"""A status report for a PV pool."""
1516

1617
@property

0 commit comments

Comments
 (0)