Skip to content

Commit 4b34d12

Browse files
committed
Use new API v0.18 methods
For non data-streaming methods, update to use the new client method names. For data-streaming methods, use the new adaptation functions in `_old_component_data.py`. Because `set_component_power_active()` can now return a the time when the command expires, we also need to update the tests we use to run them. Note that the data-streaming method in the new client version is not async (it returns a Receiver synchronously) so `await`s are also removed. For the `ComponentMetricFetcher` we also remove the `async` for the wrapper `_subscribe()` methods. The mock microgrid client was mostly rewritten to adjust it to the new unified data streaming method. Signed-off-by: Leandro Lucarella <[email protected]>
1 parent 31e822a commit 4b34d12

30 files changed

+284
-433
lines changed

src/frequenz/sdk/microgrid/_data_sourcing/microgrid_api_source.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@
1111
from frequenz.channels import Receiver, Sender
1212
from frequenz.client.common.microgrid.components import ComponentId
1313
from frequenz.client.microgrid import (
14-
BatteryData,
1514
ComponentCategory,
16-
EVChargerData,
17-
InverterData,
18-
MeterData,
1915
)
2016
from frequenz.client.microgrid.metrics import Metric
2117
from frequenz.quantities import Quantity
@@ -25,6 +21,10 @@
2521
from ...microgrid import connection_manager
2622
from ...timeseries import Sample
2723
from .._old_component_data import (
24+
BatteryData,
25+
EVChargerData,
26+
InverterData,
27+
MeterData,
2828
TransitionalMetric,
2929
)
3030
from ._component_metric_request import ComponentMetricRequest
@@ -169,7 +169,7 @@ async def _get_component_category(
169169
return self._comp_categories_cache[comp_id]
170170

171171
api = connection_manager.get().api_client
172-
for comp in await api.components():
172+
for comp in await api.list_components():
173173
self._comp_categories_cache[comp.component_id] = comp.category
174174

175175
if comp_id in self._comp_categories_cache:
@@ -198,8 +198,8 @@ async def _check_battery_request(
198198
_logger.error(err)
199199
raise ValueError(err)
200200
if comp_id not in self.comp_data_receivers:
201-
self.comp_data_receivers[comp_id] = (
202-
await connection_manager.get().api_client.battery_data(comp_id)
201+
self.comp_data_receivers[comp_id] = BatteryData.subscribe(
202+
connection_manager.get().api_client, comp_id
203203
)
204204

205205
async def _check_ev_charger_request(
@@ -223,8 +223,8 @@ async def _check_ev_charger_request(
223223
_logger.error(err)
224224
raise ValueError(err)
225225
if comp_id not in self.comp_data_receivers:
226-
self.comp_data_receivers[comp_id] = (
227-
await connection_manager.get().api_client.ev_charger_data(comp_id)
226+
self.comp_data_receivers[comp_id] = EVChargerData.subscribe(
227+
connection_manager.get().api_client, comp_id
228228
)
229229

230230
async def _check_inverter_request(
@@ -248,8 +248,8 @@ async def _check_inverter_request(
248248
_logger.error(err)
249249
raise ValueError(err)
250250
if comp_id not in self.comp_data_receivers:
251-
self.comp_data_receivers[comp_id] = (
252-
await connection_manager.get().api_client.inverter_data(comp_id)
251+
self.comp_data_receivers[comp_id] = InverterData.subscribe(
252+
connection_manager.get().api_client, comp_id
253253
)
254254

255255
async def _check_meter_request(
@@ -273,8 +273,8 @@ async def _check_meter_request(
273273
_logger.error(err)
274274
raise ValueError(err)
275275
if comp_id not in self.comp_data_receivers:
276-
self.comp_data_receivers[comp_id] = (
277-
await connection_manager.get().api_client.meter_data(comp_id)
276+
self.comp_data_receivers[comp_id] = MeterData.subscribe(
277+
connection_manager.get().api_client, comp_id
278278
)
279279

280280
async def _check_requested_component_and_metrics(

src/frequenz/sdk/microgrid/_power_distributing/_component_managers/_battery_manager.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,20 @@
88
import logging
99
import math
1010
import typing
11-
from datetime import timedelta
11+
from datetime import datetime, timedelta
1212

1313
from frequenz.channels import LatestValueCache, Receiver, Sender
1414
from frequenz.client.common.microgrid.components import ComponentId
1515
from frequenz.client.microgrid import (
1616
ApiClientError,
17-
BatteryData,
1817
ComponentCategory,
19-
InverterData,
2018
OperationOutOfRange,
2119
)
2220
from frequenz.quantities import Power
2321
from typing_extensions import override
2422

2523
from ... import connection_manager
24+
from ..._old_component_data import BatteryData, InverterData
2625
from .._component_pool_status_tracker import ComponentPoolStatusTracker
2726
from .._component_status import BatteryStatusTracker, ComponentPoolStatus
2827
from .._distribution_algorithm import (
@@ -313,14 +312,16 @@ async def _create_channels(self) -> None:
313312
api = connection_manager.get().api_client
314313
manager_id = f"{type(self).__name__}«{hex(id(self))}»"
315314
for battery_id, inverter_ids in self._bat_invs_map.items():
316-
bat_recv: Receiver[BatteryData] = await api.battery_data(battery_id)
315+
bat_recv: Receiver[BatteryData] = BatteryData.subscribe(api, battery_id)
317316
self._battery_caches[battery_id] = LatestValueCache(
318317
bat_recv,
319318
unique_id=f"{manager_id}:battery«{battery_id}»",
320319
)
321320

322321
for inverter_id in inverter_ids:
323-
inv_recv: Receiver[InverterData] = await api.inverter_data(inverter_id)
322+
inv_recv: Receiver[InverterData] = InverterData.subscribe(
323+
api, inverter_id
324+
)
324325
self._inverter_caches[inverter_id] = LatestValueCache(
325326
inv_recv, unique_id=f"{manager_id}:inverter«{inverter_id}»"
326327
)
@@ -638,7 +639,7 @@ async def _set_distributed_power(
638639

639640
tasks = {
640641
inverter_id: asyncio.create_task(
641-
api.set_power(inverter_id, power.as_watts())
642+
api.set_component_power_active(inverter_id, power.as_watts())
642643
)
643644
for inverter_id, power in distribution.distribution.items()
644645
if power != Power.zero()
@@ -681,7 +682,7 @@ async def _set_distributed_power(
681682

682683
def _parse_result(
683684
self,
684-
tasks: dict[ComponentId, asyncio.Task[None]],
685+
tasks: dict[ComponentId, asyncio.Task[datetime | None]],
685686
distribution: dict[ComponentId, Power],
686687
request_timeout: timedelta,
687688
) -> tuple[Power, set[ComponentId]]:

src/frequenz/sdk/microgrid/_power_distributing/_component_managers/_ev_charger_manager/_ev_charger_manager.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
from frequenz.client.microgrid import (
2121
ApiClientError,
2222
ComponentCategory,
23-
EVChargerData,
2423
MicrogridApiClient,
2524
)
2625
from frequenz.quantities import Power, Voltage
@@ -30,6 +29,7 @@
3029
from ....._internal._math import is_close_to_zero
3130
from .....timeseries import Sample3Phase
3231
from .... import _data_pipeline, connection_manager
32+
from ...._old_component_data import EVChargerData
3333
from ..._component_pool_status_tracker import ComponentPoolStatusTracker
3434
from ..._component_status import ComponentPoolStatus, EVChargerStatusTracker
3535
from ...request import Request
@@ -224,7 +224,7 @@ async def _run(self) -> None: # pylint: disable=too-many-locals
224224
"""Run the main event loop of the EV charger manager."""
225225
api = connection_manager.get().api_client
226226
ev_charger_data_rx = merge(
227-
*[await api.ev_charger_data(evc_id) for evc_id in self._ev_charger_ids]
227+
*(EVChargerData.subscribe(api, evc_id) for evc_id in self._ev_charger_ids)
228228
)
229229
target_power_rx = self._target_power_channel.new_receiver()
230230
latest_target_powers: dict[ComponentId, Power] = {}
@@ -309,10 +309,10 @@ async def _set_api_power(
309309
Power distribution result, corresponding to the result of the API
310310
request.
311311
"""
312-
tasks: dict[ComponentId, asyncio.Task[None]] = {}
312+
tasks: dict[ComponentId, asyncio.Task[datetime | None]] = {}
313313
for component_id, power in target_power_changes.items():
314314
tasks[component_id] = asyncio.create_task(
315-
api.set_power(component_id, power.as_watts())
315+
api.set_component_power_active(component_id, power.as_watts())
316316
)
317317
_, pending = await asyncio.wait(
318318
tasks.values(),

src/frequenz/sdk/microgrid/_power_distributing/_component_managers/_ev_charger_manager/_states.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
from typing import Iterable
1010

1111
from frequenz.client.common.microgrid.components import ComponentId
12-
from frequenz.client.microgrid import EVChargerData
1312
from frequenz.quantities import Power
1413

14+
from ...._old_component_data import EVChargerData
15+
1516

1617
@dataclass
1718
class EvcState:

src/frequenz/sdk/microgrid/_power_distributing/_component_managers/_pv_inverter_manager/_pv_inverter_manager.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@
66
import asyncio
77
import collections.abc
88
import logging
9-
from datetime import timedelta
9+
from datetime import datetime, timedelta
1010

1111
from frequenz.channels import LatestValueCache, Sender
1212
from frequenz.client.common.microgrid.components import ComponentId
1313
from frequenz.client.microgrid import (
1414
ApiClientError,
1515
ComponentCategory,
16-
InverterData,
1716
InverterType,
1817
)
1918
from frequenz.quantities import Power
2019
from typing_extensions import override
2120

2221
from ....._internal._math import is_close_to_zero
2322
from .... import connection_manager
23+
from ...._old_component_data import InverterData
2424
from ..._component_pool_status_tracker import ComponentPoolStatusTracker
2525
from ..._component_status import ComponentPoolStatus, PVInverterStatusTracker
2626
from ...request import Request
@@ -79,7 +79,7 @@ async def start(self) -> None:
7979
"""Start the PV inverter manager."""
8080
self._component_data_caches = {
8181
inv_id: LatestValueCache(
82-
await connection_manager.get().api_client.inverter_data(inv_id),
82+
InverterData.subscribe(connection_manager.get().api_client, inv_id),
8383
unique_id=f"{type(self).__name__}«{hex(id(self))}»:inverter«{inv_id}»",
8484
)
8585
for inv_id in self._pv_inverter_ids
@@ -188,10 +188,10 @@ async def _set_api_power( # pylint: disable=too-many-locals
188188
remaining_power: Power,
189189
) -> None:
190190
api_client = connection_manager.get().api_client
191-
tasks: dict[ComponentId, asyncio.Task[None]] = {}
191+
tasks: dict[ComponentId, asyncio.Task[datetime | None]] = {}
192192
for component_id, power in allocations.items():
193193
tasks[component_id] = asyncio.create_task(
194-
api_client.set_power(component_id, power.as_watts())
194+
api_client.set_component_power_active(component_id, power.as_watts())
195195
)
196196
_, pending = await asyncio.wait(
197197
tasks.values(),

src/frequenz/sdk/microgrid/_power_distributing/_component_status/_battery_status_tracker.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,18 @@
2626
from frequenz.client.common.microgrid.components import ComponentId
2727
from frequenz.client.microgrid import (
2828
BatteryComponentState,
29-
BatteryData,
3029
BatteryRelayState,
3130
ComponentCategory,
32-
ComponentData,
3331
ErrorLevel,
3432
InverterComponentState,
35-
InverterData,
3633
)
3734
from typing_extensions import override
3835

3936
from frequenz.sdk._internal._asyncio import run_forever
4037

4138
from ....actor._background_service import BackgroundService
4239
from ... import connection_manager
40+
from ..._old_component_data import BatteryData, ComponentData, InverterData
4341
from ._blocking_status import BlockingStatus
4442
from ._component_status import (
4543
ComponentStatus,
@@ -255,8 +253,10 @@ async def _run(
255253
"""
256254
api_client = connection_manager.get().api_client
257255

258-
battery_receiver = await api_client.battery_data(self._battery.component_id)
259-
inverter_receiver = await api_client.inverter_data(self._inverter.component_id)
256+
battery_receiver = BatteryData.subscribe(api_client, self._battery.component_id)
257+
inverter_receiver = InverterData.subscribe(
258+
api_client, self._inverter.component_id
259+
)
260260

261261
battery = battery_receiver
262262
battery_timer = self._battery.data_recv_timer

src/frequenz/sdk/microgrid/_power_distributing/_component_status/_ev_charger_status_tracker.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414
from frequenz.client.microgrid import (
1515
EVChargerCableState,
1616
EVChargerComponentState,
17-
EVChargerData,
1817
)
1918
from typing_extensions import override
2019

2120
from ...._internal._asyncio import run_forever
2221
from ....actor._background_service import BackgroundService
2322
from ... import connection_manager
23+
from ..._old_component_data import EVChargerData
2424
from ._blocking_status import BlockingStatus
2525
from ._component_status import (
2626
ComponentStatus,
@@ -149,8 +149,9 @@ def _handle_set_power_result(
149149

150150
async def _run(self) -> None:
151151
"""Run the status tracker."""
152-
api_client = connection_manager.get().api_client
153-
ev_data_rx = await api_client.ev_charger_data(self._component_id)
152+
ev_data_rx = EVChargerData.subscribe(
153+
connection_manager.get().api_client, self._component_id
154+
)
154155
set_power_result_rx = self._set_power_result_receiver
155156
missing_data_timer = Timer(self._max_data_age, SkipMissedAndDrift())
156157

src/frequenz/sdk/microgrid/_power_distributing/_component_status/_pv_inverter_status_tracker.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@
1010
from frequenz.channels import Receiver, Sender, select, selected_from
1111
from frequenz.channels.timer import SkipMissedAndDrift, Timer
1212
from frequenz.client.common.microgrid.components import ComponentId
13-
from frequenz.client.microgrid import InverterComponentState, InverterData
13+
from frequenz.client.microgrid import ComponentStateCode
1414
from typing_extensions import override
1515

1616
from ...._internal._asyncio import run_forever
1717
from ....actor._background_service import BackgroundService
1818
from ... import connection_manager
19+
from ..._old_component_data import InverterData
1920
from ._blocking_status import BlockingStatus
2021
from ._component_status import (
2122
ComponentStatus,
@@ -141,8 +142,9 @@ def _handle_pv_inverter_data(self, pv_data: InverterData) -> ComponentStatusEnum
141142

142143
async def _run(self) -> None:
143144
"""Run the status tracker."""
144-
api_client = connection_manager.get().api_client
145-
pv_data_rx = await api_client.inverter_data(self._component_id)
145+
pv_data_rx = InverterData.subscribe(
146+
connection_manager.get().api_client, self._component_id
147+
)
146148
set_power_result_rx = self._set_power_result_receiver
147149
missing_data_timer = Timer(self._max_data_age, SkipMissedAndDrift())
148150

src/frequenz/sdk/microgrid/_power_distributing/_distribution_algorithm/_battery_distribution_algorithm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
from typing import NamedTuple, Sequence
1010

1111
from frequenz.client.common.microgrid.components import ComponentId
12-
from frequenz.client.microgrid import BatteryData, InverterData
1312
from frequenz.quantities import Power
1413

1514
from ...._internal._math import is_close_to_zero
15+
from ..._old_component_data import BatteryData, InverterData
1616
from ..result import PowerBounds
1717

1818
_logger = logging.getLogger(__name__)

src/frequenz/sdk/microgrid/_power_distributing/power_distributing.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import asyncio
1414
import logging
15-
from datetime import timedelta
15+
from datetime import datetime, timedelta
1616

1717
from frequenz.channels import Receiver, Sender
1818
from frequenz.client.common.microgrid.components import ComponentId
@@ -101,7 +101,9 @@ def __init__( # pylint: disable=too-many-arguments
101101
self._result_sender = results_sender
102102
self._api_power_request_timeout = api_power_request_timeout
103103

104-
self._processing_tasks: dict[frozenset[ComponentId], asyncio.Task[None]] = {}
104+
self._processing_tasks: dict[
105+
frozenset[ComponentId], asyncio.Task[datetime | None]
106+
] = {}
105107
"""Track the power request tasks currently being processed."""
106108

107109
self._pending_requests: dict[frozenset[ComponentId], Request] = {}
@@ -176,7 +178,7 @@ def _handle_task_completion(
176178
self,
177179
req_id: frozenset[ComponentId],
178180
request: Request,
179-
task: asyncio.Task[None],
181+
task: asyncio.Task[datetime | None],
180182
) -> None:
181183
"""Handle the completion of a power request task.
182184

0 commit comments

Comments
 (0)