Frequenz-sdk

Latest version: v0.25.2

Safety actively analyzes 642283 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 2 of 5

1.0.0rc2

Frequenz Python SDK Release Notes

Summary

This version ships an experimental version of the **Power Manager** and includes user documentation.

Upgrading

- `microgrid.battery_pool()` method now accepts a priority value.

- `BatteryPool`'s control methods

* Original methods `{set_power/charge/discharge}` are now replaced by `propose_{power/charge/discharge}`
* The `propose_*` methods send power proposals to the `PowerManagingActor`, where it can be overridden by proposals from other actors.
* They no longer have the `adjust_power` flag, because the `PowerManagingActor` will always adjust power to fit within the available bounds.

- `BatteryPool`'s reporting methods

* `power_bounds` is replaced by `power_status`
* The `power_status` method streams objects containing:
+ bounds adjusted to the actor's priorities
+ the latest target power for the set of batteries
+ the results from the power distributor for the last request

New Features

- New and improved documentation.

* A new *User Guide* section was added, with:

+ A glossary.
+ An introduction to actors.

* A new *Tutorials* section was added, with:

+ A getting started tutorial.

- In `OrderedRingBuffer`:
- Rename `datetime_to_index` to `to_internal_index` to avoid confusion between the internal index and the external index.
- Add `index_to_datetime` method to convert external index to corresponding datetime.
- Remove `__setitem__` method to enforce usage of dedicated `update` method only.
- In `OrderedRingBuffer` and `MovingWindow`:
- Support for integer indices is added.
- Add `count_covered` method to count the number of elements covered by the used time range.
- Add `fill_value` option to window method to impute missing values. By default missing values are imputed with `NaN`.
- Add `at` method to `MovingWindow` to access a single element and use it in `__getitem__` magic to fully support single element access.

- The PowerDistributingActor now supports n:m relations between inverters and batteries.

This means that one or more inverters can be connected to one or more batteries.

- A `PowerManagingActor` implementation

Bug Fixes

- Fix rendering of diagrams in the documentation.
- The `__getitem__` magic of the `MovingWindow` is fixed to support the same functionality that the `window` method provides.
- Fixes incorrect implementation of single element access in `__getitem__` magic of `MovingWindow`.


What's Changed
* Clear the release notes by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/675
* Bump the optional group with 9 updates by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/683
* Bump docker/setup-buildx-action from 2 to 3 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/680
* Bump docker/setup-qemu-action from 2 to 3 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/681
* Bump docker/build-push-action from 4 to 5 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/682
* Add mkdocs-macros plugin by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/667
* docs: Add an introduction to actors by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/679
* mkdocs: Fix numbered code annotations by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/684
* Add getting started tutorial and tutorial section by matthias-wende-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/656
* Remove setitem magic from ring buffer by cwasicki in https://github.com/frequenz-floss/frequenz-sdk-python/pull/670
* Allow using macros in docstrings by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/687
* Rename datetime_to_index to to_internal_index by cwasicki in https://github.com/frequenz-floss/frequenz-sdk-python/pull/686
* Fix mermaid diagrams custom renderer by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/690
* Update obsolete comment about networkx-stubs by daniel-zullo-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/685
* Move Actors documentation to the `actor` module by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/688
* Don't use generics unnecessarily by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/698
* Improve Actors documentation by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/689
* Increment port in microgrid API client tests by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/699
* Support int indices and slice index behavior in ring buffer and moving window by cwasicki in https://github.com/frequenz-floss/frequenz-sdk-python/pull/668
* Fix single element access for moving window by cwasicki in https://github.com/frequenz-floss/frequenz-sdk-python/pull/672
* Rename `Introduction` to `User Guide` and move `Tutorials` next to it by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/701
* Bump types-pytz from 2023.3.1.0 to 2023.3.1.1 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/695
* Bump types-protobuf from 4.24.0.1 to 4.24.0.2 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/696
* Bump types-pyyaml from 6.0.12.11 to 6.0.12.12 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/694
* PowerDistributing: Add support for n:m relations in invs:bats by Marenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/660
* Fix bug in how failed batteries are tracked in PowerDistributor by shsms in https://github.com/frequenz-floss/frequenz-sdk-python/pull/705
* Update pydantic to v2.3 by daniel-zullo-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/703
* Add option to impute missing values in window method for moving window by cwasicki in https://github.com/frequenz-floss/frequenz-sdk-python/pull/669
* Bump pydoclint from 0.3.2 to 0.3.3 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/710
* Implement the PowerManagingActor by shsms in https://github.com/frequenz-floss/frequenz-sdk-python/pull/692
* Prepare release notes for v1.0.0-rc2 by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/723


**Full Changelog**: https://github.com/frequenz-floss/frequenz-sdk-python/compare/v1.0.0-rc1...v1.0.0-rc2

1.0.0rc1

Frequenz Python SDK Release Notes

Summary

The most notable changes are the addition of `microgrid.grid` and `microgrid.frequency()`, as the many improvements to the `MovingWindow`.

Upgrading

- The battery pool metric methods no longer return `None` when no batteries are available. Instead, the value of the `Sample` or `PowerMetric` is set to `None`.

- The power distribution `Result` is now a union of all different types of results rather than a base class. This means we can now also use `match` to check for result types instead of only using `isinstance()`. The following example shows how `Result` can be used for matching power distribution results:

python
from typing import assert_never
result: Result = some_operation()
match result:
case Success() as success:
print(f"Power request was successful: {success}")
case PartialFailure() as partial_failure:
print(f"Power request was partially successful: {partial_failure}")
case OutOfBounds() as out_of_bounds:
print(f"Power request was out of bounds: {out_of_bounds}")
case Error() as error:
print(f"Power request failed: {error}")
case _ as unreachable:
assert_never(unreachable)


- `Averager` was removed from `FormulaEngine`.

New Features

- Calling `microgrid.initialize()` now also initializes the microgrid's grid connection point as a singleton object of a newly added type `Grid`. This object can be obtained by calling `microgrid.grid.get()`. This object exposes the max current that can course through the grid connection point, which is useful for the power distribution algorithm. The max current is provided by the Microgrid API, and can be obtained by calling `microgrid.grid.get().fuse.max_current`.

Note that a microgrid is allowed to have zero or one grid connection point. Microgrids configured as islands will have zero grid connection points, and microgrids configured as grid-connected will have one grid connection point.

- A new method `microgrid.frequeny()` was added to allow easy access to the current frequency of the grid.

- A new class `Fuse` has been added to represent fuses. This class has a member variable `max_current` which represents the maximum current that can course through the fuse. If the current flowing through a fuse is greater than this limit, then the fuse will break the circuit.

- `MovingWindow` and `OrderedRingBuffer`:
- NaN values are treated as missing when gaps are determined in the `OrderedRingBuffer`.
- Provide access to `capacity` (maximum number of elements) in `MovingWindow`.
- Methods to retrieve oldest and newest timestamp of valid samples are added to both.
- `MovingWindow` exposes underlying buffers `window` method.
- `len(window)` and `len(buffer)` should be replaced with `window.count_valid()` and `buffer.count_valid()`, respectively.
- `OrderedRingBuffer.window`:
- By default returns a copy.
- Can also return a view if the window contains `None` values and if `force_copy` is set to `True`.

- Now when printing `FormulaEngine` for debugging purposes the the formula will be shown in infix notation, which should be easier to read.

- The CI now runs cross-arch tests on `arm64` architectures.

- The `min` and `max` functions in the `FormulaEngine` are now public. Note that the same functions have been public in the builder.

Bug Fixes

- `OrderedRingBuffer.window`:
- Fixed `force_copy` option for specific case.
- Removed buggy enforcement of copies when None values in queried window.
- Fixed behavior for start equals end case.


What's Changed
* Clear release notes by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/617
* Initialize a `Grid` object with a given `Fuse` limit by tiyash-basu-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/610
* Upgrade to repo-config v0.6.1 by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/620
* Bump polars from 0.18.15 to 0.19.1 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/626
* Bump the optional group with 4 updates by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/634
* Bump types-setuptools from 68.1.0.0 to 68.1.0.1 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/635
* Don't return `None` from battery pool methods by stefan-brus-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/612
* Clarify documentation of BatteryPool soc and capacity methods by stefan-brus-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/637
* Document class and module attributes by daniel-zullo-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/618
* Add microgrid.frequency() by Marenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/579
* Treat NaN as gap in ring buffer by cwasicki in https://github.com/frequenz-floss/frequenz-sdk-python/pull/641
* Replace obsolete types by daniel-zullo-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/644
* Move "fake_time" fixture to conftest.py by stefan-brus-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/639
* Improve formula formatting to use infix notation by christianparpart in https://github.com/frequenz-floss/frequenz-sdk-python/pull/613
* Merge v0.25.1 by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/652
* Add a glossary to the documentation by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/647
* Add capacity, oldest and newest timestamp to moving window by cwasicki in https://github.com/frequenz-floss/frequenz-sdk-python/pull/598
* [ci] Add tests for non-native architectures by tiyash-basu-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/622
* Bump actions/checkout from 3 to 4 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/655
* ci: Fix publishing of documentation on push by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/657
* Add a job to join the `nox` matrix jobs by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/661
* Add more formula tests for min and max functions by matthias-wende-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/623
* Fixes on copy behavior in ring buffer window method by cwasicki in https://github.com/frequenz-floss/frequenz-sdk-python/pull/638
* Drop formula step Averager by christianparpart in https://github.com/frequenz-floss/frequenz-sdk-python/pull/645
* Refactor power distribution Result by daniel-zullo-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/659
* Adjust the glossary to 80 columns by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/666
* Replace len magic with count_valid method in ring buffer and moving window by cwasicki in https://github.com/frequenz-floss/frequenz-sdk-python/pull/664
* Prepare release notes for the 1.0.0-rc1 release by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/674

New Contributors
* stefan-brus-frequenz made their first contribution in https://github.com/frequenz-floss/frequenz-sdk-python/pull/612

**Full Changelog**: https://github.com/frequenz-floss/frequenz-sdk-python/compare/v0.25.1...v1.0.0-rc1

0.25.2

Frequenz Python SDK Release Notes

Bug Fixes

- The resampler now properly handles sending zero values.

A bug made the resampler interpret zero values as `None` when generating new samples, so if the result of the resampling is zero, the resampler would just produce `None` values.


What's Changed
* Reset release notes by matthias-wende-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/653
* Fix the resampler handling of output zeros by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/812


**Full Changelog**: https://github.com/frequenz-floss/frequenz-sdk-python/compare/v0.25.1...v0.25.2

0.25.1

Frequenz Python SDK Release Notes

Bug Fixes

- Fix the **API Reference** link in the documentation website navigation bar.

- Fix the consumer power formula


What's Changed
* Fix mkdocs navigation bar API link by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/642
* Fix consumer power formula by matthias-wende-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/649


**Full Changelog**: https://github.com/frequenz-floss/frequenz-sdk-python/compare/v0.25.0...v0.25.1

0.25.0

Frequenz Python SDK Release Notes

Summary

This release replaces the `actor` decorator with a new `Actor` class.

Upgrading


- The `frequenz.sdk.power` package contained the power distribution algorithm, which is for internal use in the sdk, and is no longer part of the public API.

- `PowerDistributingActor`'s result type `OutOfBound` has been renamed to `OutOfBounds`, and its member variable `bound` has been renamed to `bounds`.

- The `actor` decorator was replaced by the new `Actor` class. The main differences between the new class and the old decorator are:

* It doesn't start automatically, `start()` needs to be called to start an actor (using the `frequenz.sdk.actor.run()` function is recommended).
* The method to implement the main logic was renamed from `run()` to `_run()`, as it is not intended to be run externally.
* Actors can have an optional `name` (useful for debugging/logging purposes).
* The actor will only be restarted if an unhandled `Exception` is raised by `_run()`. It will not be restarted if the `_run()` method finishes normally. If an unhandled `BaseException` is raised instead, it will be re-raised. For normal cancellation the `_run()` method should handle `asyncio.CancelledError` if the cancellation shouldn't be propagated (this is the same as with the decorator).
* The `_stop()` method is public (`stop()`) and will `cancel()` and `await` for the task to finish, catching the `asyncio.CancelledError`.
* The `join()` method is renamed to `wait()`, but they can also be awaited directly ( `await actor`).
* For deterministic cleanup, actors can now be used as `async` context managers.

Most actors can be migrated following these steps:

1. Remove the decorator
2. Add `Actor` as a base class
3. Rename `run()` to `_run()`
4. Forward the `name` argument (optional but recommended)

For example, this old actor:

python
from frequenz.sdk.actor import actor

actor
class TheActor:
def __init__(self, actor_args) -> None:
init code

def run(self) -> None:
run code


Can be migrated as:

python
import asyncio
from frequenz.sdk.actor import Actor

class TheActor(Actor):
def __init__(self, actor_args,
*,
name: str | None = None,
) -> None:
super().__init__(name=name)
init code

def _run(self) -> None:
run code


Then you can instantiate all your actors first and then run them using:

python
from frequenz.sdk.actor import run
Init code
actor = TheActor()
other_actor = OtherActor()
more setup
await run(actor, other_actor) Start and await for all the actors


- The `MovingWindow` is now a `BackgroundService`, so it needs to be started manually with `window.start()`. It is recommended to use it as an `async` context manager if possible though:

python
async with MovingWindow(...) as window:
The moving windows is started here
use(window)
The moving window is stopped here


- The base actors (`ConfigManagingActor`, `ComponentMetricsResamplingActor`, `DataSourcingActor`, `PowerDistributingActor`) now inherit from the new `Actor` class, if you are using them directly, you need to start them manually with `actor.start()` and you might need to do some other adjustments.

- The `BatteryPool.power_distribution_results` method has been enhanced to provide power distribution results in the form of `Power` objects, replacing the previous use of `float` values.

- In the `Request` class:
* The attribute `request_timeout_sec` has been updated and is now named `request_timeout` and it is represented by a `timedelta` object rather than a `float`.
* The attribute `power` is now presented as a `Power` object, as opposed to a `float`.

- Within the `EVChargerPool.set_bounds` method, the parameter `max_amps` has been redefined as `max_current`, and it is now represented using a `Current` object instead of a `float`.

- The argument `nones_are_zeros` in `FormulaEngine` and related classes and methods is now a keyword-only argument.

New Features

- Added `DFS` to the component graph

- `BackgroundService`: This new abstract base class can be used to write other classes that runs one or more tasks in the background. It provides a consistent API to start and stop these services and also takes care of the handling of the background tasks. It can also work as an `async` context manager, giving the service a deterministic lifetime and guaranteed cleanup.

All classes spawning tasks that are expected to run for an indeterminate amount of time are likely good candidates to use this as a base class.

- `Actor`: This new class inherits from `BackgroundService` and it replaces the `actor` decorator.

- Newly added `min` and `max` functions for Formulas. They can be used as follows:

python
formula1.min(formula2)


Bug Fixes

- Fixes a bug in the ring buffer updating the end timestamp of gaps when they are outdated.

- Properly handles PV configurations with no or only some meters before the PV component.

So far we only had configurations like this: `Meter -> Inverter -> PV`. However the scenario with `Inverter -> PV` is also possible and now handled correctly.

- Fix `consumer_power()` not working certain configurations.

In microgrids without consumers and no main meter, the formula would never return any values.

- Fix `pv_power` not working in setups with 2 grid meters by using a new reliable function to search for components in the components graph

- Fix `consumer_power` and `producer_power` similar to `pv_power`

- Zero value requests received by the `PowerDistributingActor` will now always be accepted, even when there are non-zero exclusion bounds.

- Hold on to a reference to all streaming tasks in the microgrid API client, so they don't get garbage collected.


What's Changed
* Fix ring buffer gap cleanup code by matthias-wende-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/578
* Amend deficit calculation in the power distributor by daniel-zullo-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/577
* Clear release notes by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/574
* Bump types-protobuf from 4.23.0.3 to 4.24.0.0 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/576
* Bump mypy from 1.4.1 to 1.5.0 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/580
* Support PV configurations with no or only some meters by Marenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/584
* Bump mypy from 1.5.0 to 1.5.1 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/585
* Bump types-protobuf from 4.24.0.0 to 4.24.0.1 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/581
* Bump time-machine from 2.11.0 to 2.12.0 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/582
* Some very small fixes by Marenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/590
* Bump mkdocs-material from 9.1.21 to 9.2.1 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/592
* Fix `consumer_power()` not working certain configurations. by Marenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/589
* Add depth first search for components by matthias-wende-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/595
* [ci] Add test for installation in multiple architectures by tiyash-basu-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/597
* Improve formula generators by matthias-wende-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/599
* Forward zero power requests always to the microgrid API by shsms in https://github.com/frequenz-floss/frequenz-sdk-python/pull/591
* Implement BackgroundService and new Actor class by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/564
* Replace absolute imports with relative imports by tiyash-basu-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/604
* Drop example to private PowerDistributor API by christianparpart in https://github.com/frequenz-floss/frequenz-sdk-python/pull/605
* Bump mkdocs-material from 9.2.1 to 9.2.5 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/608
* Improve consumer power formula by matthias-wende-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/609
* Update high-level public interfaces to concrete types by daniel-zullo-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/607
* Make nones_are_zeros a keyword-only parameter by daniel-zullo-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/611
* Improve error message for incorrect component graphs by tiyash-basu-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/602
* DataPipeline: Fix resampling/ds/power actors not started by Marenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/603
* Bump polars from 0.18.13 to 0.18.15 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/583
* Add module to easily create component graphs by Marenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/606
* Upgrade to repo-config v0.5.2 by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/587
* Store references to streaming tasks by shsms in https://github.com/frequenz-floss/frequenz-sdk-python/pull/615
* Add min and max operations to formula engine by matthias-wende-frequenz in https://github.com/frequenz-floss/frequenz-sdk-python/pull/561

New Contributors
* tiyash-basu-frequenz made their first contribution in https://github.com/frequenz-floss/frequenz-sdk-python/pull/597

**Full Changelog**: https://github.com/frequenz-floss/frequenz-sdk-python/compare/v0.24.0...v0.25.0

0.24.0

Frequenz Python SDK Release Notes

Summary

Now the microgrid API v0.15.x is being used. The SDK can only connect to microgrids using this version of the API. Inclusion and exclusion bounds in the new API are now handled by the power distributor and battery pool.

Upgrading

- Upgrade to microgrid API v0.15.1. If you're using any of the lower level microgrid interfaces, you will need to upgrade your code.
- The argument `conf_file` of the `ConfigManagingActor` constructor was renamed to `config_path`.

- The `BatteryPool.power_bounds` method now streams inclusion/exclusion bounds. The bounds are now represented by `Power` objects and not `float`s.

New Features

- The `ConfigManagingActor` constructor now can accept a `pathlib.Path` as `config_path` too (before it accepted only a `str`).

- The `PowerDistributingActor` now considers exclusion bounds, when finding an optimal distribution for power between batteries.


What's Changed
* Use `Timer.periodic` in the `Resampler` by jh2007github in https://github.com/frequenz-floss/frequenz-sdk-python/pull/520
* Allow running release notes check in merge queues by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/566
* Clear release notes by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/560
* Update `frequenz-api-microgrid` to v0.15.1 by shsms in https://github.com/frequenz-floss/frequenz-sdk-python/pull/416
* Improvements to the `ConfigManagingActor` by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/565
* Bump brettcannon/check-for-changed-files from 294a99714e0d350b5083472a293d41bc91804e68 to 4170644959a21843b31f1181f2a1761d65ef4791 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/567
* Bump types-protobuf from 4.23.0.2 to 4.23.0.3 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/568
* Bump polars from 0.18.11 to 0.18.12 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/569
* Stream exclusion bounds from the battery pool by shsms in https://github.com/frequenz-floss/frequenz-sdk-python/pull/537
* Bump polars from 0.18.12 to 0.18.13 by dependabot in https://github.com/frequenz-floss/frequenz-sdk-python/pull/570
* Add docs cross-linking to APIs by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/571
* Support exclusion bounds in power distributor by shsms in https://github.com/frequenz-floss/frequenz-sdk-python/pull/562
* Update release notes for the v0.24.0 release by llucax in https://github.com/frequenz-floss/frequenz-sdk-python/pull/573


**Full Changelog**: https://github.com/frequenz-floss/frequenz-sdk-python/compare/v0.23.0...v0.24.0

Page 2 of 5

© 2024 Safety CLI Cybersecurity Inc. All Rights Reserved.