Skip to content

Releases: frequenz-floss/frequenz-sdk-python

v1.0.0-rc800

22 Aug 08:54
v1.0.0-rc800
9b36f97
Compare
Choose a tag to compare
v1.0.0-rc800 Pre-release
Pre-release

Frequenz Python SDK Release Notes

Summary

This release makes some breaking changes to the SDK's public interface aimed at improving clarity and correctness. It also includes several bug fixes in core components like the resampler, the power distributor, and the moving window.

Upgrading

  • The frequenz.sdk.microgrid.*_pool methods have been renamed to new_*_pool, to make it explicit that they create new instances of the pool classes.

    • battery_pool -> new_battery_pool
    • ev_charger_pool -> new_ev_charger_pool
    • pv_pool -> new_pv_pool
  • The following component metric streams have been renamed to clarify that they stream per-phase values:

    • frequenz.sdk.microgrid.
      • voltage -> voltage_per_phase
      • grid.current -> grid.current_per_phase
      • ev_charger_pool.current -> ev_charger_pool.current_per_phase
  • Passing a request_timeout in calls to *_pool.propose_power is no longer supported. It may be specified at application startup, through the new optional api_power_request_timeout parameter in the microgrid.initialize() method.

  • Power distribution results are no longer available through the power_status streams in the *Pools. They can now be accessed as a stream from a separate property power_distribution_results, which is available from all the *Pools.

  • The ConfigManagingActor now uses collections.abc.Mapping as the output sender type. This change indicates that the broadcasted configuration is intended to be read-only.

  • The ConfigManagingActor has moved from frequenz.sdk.actor to frequenz.sdk.config.

  • The following core actors are no longer part of the public API:

    • PowerDistributingActor
    • ComponentMetricsResamplingActor
    • DataSourcingActor
  • The following two types which are used for communicating with the data sourcing and resampling actors are also no longer part of the public API:

    • ComponentMetricId
    • ComponentMetricRequest
  • The ChannelRegistry is no longer part of the public API.

  • The Result types for the power distribution results are now exposed through the frequenz.sdk.microgrid.battery_pool module.

New Features

  • Classes Bounds and SystemBounds now implement the __contains__ method, allowing the use of the in operator to check whether a value falls within the bounds or not.

Enhancements

  • The resampler now shows an error message where it is easier to identify the component and metric when it can't find relevant data for the current resampling window.

Bug Fixes

  • Fixed a typing issue that occurs in some cases when composing formulas with constants.
  • Fixed a bug where sending tasks in the data sourcing actor might not have been awaited.
  • Updated the logical meter documentation to reflect the latest changes.
  • Fixed a bug in the code examples in the getting-started tutorial.
  • Fixed a bug in ConfigManagingActor that was not properly comparing the event path to the config file path when the config file is a relative path.
  • Re-expose ComponentMetricId to the docs.
  • Fixed typing ambiguities when building composite formulas on streaming data.
  • Fixed a bug that was causing the PowerDistributor to exit if power requests to PV inverters or EV chargers timeout.
  • Fix the handling of canceled tasks in the data sourcing and resampling actor.
  • Fix a bug in PV power distribution by excluding inverters that haven't sent any data since startup.
  • Prevent stacking of power requests to avoid delays in processing when the power request frequency exceeds the processing time.
  • Fixes a bug in the ring buffer in case the updated value is missing and creates a gap in time.

What's Changed

Full Changelog: v1.0.0rc700...v1.0.0-rc800

v1.0.0-rc603

09 Aug 15:51
v1.0.0-rc603
956823f
Compare
Choose a tag to compare
v1.0.0-rc603 Pre-release
Pre-release

Frequenz Python SDK Release Notes

Bug Fixes

  • Fixes a bug in the ring buffer in case the updated value is missing and creates a gap in time.

  • Fixed a bug that was causing the PowerDistributor to exit if power requests to PV inverters or EV chargers timeout.

What's Changed

  • Fix gap in ring buffer when updating missing values by @cwasicki in #1034
  • Fix exit-on-timeout issue in PowerDistributor by @shsms in #1035

Full Changelog: v1.0.0-rc602...v1.0.0-rc603

v1.0.0-rc602

31 Jul 21:18
v1.0.0-rc602
c9115e0
Compare
Choose a tag to compare
v1.0.0-rc602 Pre-release
Pre-release

Frequenz Python SDK Release Notes

Bug Fixes

  • Fix PV power distribution excluding inverters that haven't sent any data since the application started.

What's Changed

Full Changelog: v1.0.0-rc601...v1.0.0-rc602

v1.0.0rc701

25 Jul 10:13
v1.0.0rc701
a385257
Compare
Choose a tag to compare
v1.0.0rc701 Pre-release
Pre-release

Frequenz Python SDK Release Notes

Bug Fixes

  • Bump the grpclib dependency to pull a fix for using IPv6 addresses.

What's Changed

Full Changelog: v1.0.0rc700...v1.0.0rc701

v1.0.0rc700

21 Jun 12:02
v1.0.0rc700
7563587
Compare
Choose a tag to compare
v1.0.0rc700 Pre-release
Pre-release

Frequenz Python SDK Release Notes

Upgrading

  • The frequenz-client-microgrid dependency was bumped to v0.4.0. If you are using the client directly in your code, you will need to upgrade too.

  • Calls to microgrid.*_pool methods now always need to specified a priority value, corresponding to the requirements/priority of the actor making the call.

  • The microgrid.*_pool methods would only accept keyword arguments from now on.

  • The microgrid.initialize() method now takes a server_url instead of a host and port.

    The following format is expected: grpc://hostname{:port}{?ssl=ssl}, where the port should be an int between 0 and 65535 (defaulting to 9090) and ssl should be a boolean (defaulting to false). For example: grpc://localhost or grpc://localhost:1090?ssl=true.

    The default was also removed, so you always need to specify the server URL.

    This applies to the ConnectionManager as well, which also now doesn't expose the host and port attributes, only the server_url. If you need to extract the host or port from the server_url, you can use the standard Python urllib.parse.urlparse() function.

  • The Config class was removed and the ConfigManagingActor now sends a plain dictionary rather than a Config object.

New Features

  • Calls to microgrid.*_pool methods now accept an optional set_operating_point parameter, for setting an operating point for the other actors. This would shift the target power by the operating point before actually applying it to the components.

Bug Fixes

  • When the PowerDistributor receives a zero power request for PV inverters, it now correctly sets zero power to the inverters, and no longer crashes.

What's Changed

  • Clear release notes by @llucax in #931
  • Always require a priority argument in calls to microgrid.*_pool methods by @shsms in #944
  • Set zero power for PV inverters not neccessary to reach target power by @shsms in #946
  • Update protobuf requirement from <5,>=4.21.6 to >=4.21.6,<6 by @dependabot in #936
  • Code quality improvements in the DataPipeline and *Pool classes by @shsms in #948
  • Bump types-protobuf from 4.24.0.20240129 to 5.26.0.20240422 by @dependabot in #937
  • Add support for Python 3.12 by @daniel-zullo-frequenz in #947
  • Miscelaneous improvements and fixes by @llucax in #953
  • Bump types-setuptools from 69.5.0.20240423 to 70.0.0.20240524 by @dependabot in #959
  • Improve code comment in power distribution to PV inverters by @shsms in #960
  • Support power requests from shifting actors in the PowerManager by @shsms in #957
  • Upgrade to microgrid client v0.4.0 by @llucax in #955
  • Bump the required group across 1 directory with 8 updates by @dependabot in #964
  • Update ConfigManagingActor to send a dictionary by @daniel-zullo-frequenz in #969
  • Don't sleep on PowerDistributor startup by @shsms in #971
  • Stop using a deprecated way to replace the event loop in tests by @llucax in #976
  • Rename parameter in_shifting_groupset_operating_point by @shsms in #970
  • Make some minor improvements for LastValueCache by @llucax in #974
  • Prepare release notes for v1.0.0rc700 by @llucax in #977

Full Changelog: v1.0.0-rc601...v1.0.0rc700

v1.0.0-rc601

02 May 12:58
v1.0.0-rc601
9c54f8d
Compare
Choose a tag to compare
v1.0.0-rc601 Pre-release
Pre-release

Frequenz Python SDK Release Notes

In this release we have changed the versioning scheme for pre-releases. rc601 means rc6.1, which we can't use due to limitations on the Python version specification. From now on rc versions will have 3 digits, so next rc will be rc700, and then rc800 etc, so we have some room to make patch releases in case it is necessary (which will be named rc701, rc702, etc.).

Bug Fixes

  • Fix getting reactive power from meters, inverters and EV chargers.

What's Changed

Read more

v1.0.0-rc6

12 Apr 14:25
v1.0.0-rc6
57337df
Compare
Choose a tag to compare
v1.0.0-rc6 Pre-release
Pre-release

Frequenz Python SDK Release Notes

Summary

The most notable features for this release is the addition of the PVPool (exposed via microgrid.pv_pool()), which can be used to manage PV arrays as a single entity and the EVChargerPool (microgrid.ev_charger_pool()) learning to manage power for the whole pool (before it could only be used to control chargers individually).

Another notable change is the microgrid API client being moved to its own repository.

Upgrading

  • The SDK is now using the microgrid API client from frequenz-client-microgrid. You should update your code if you are using the microgrid API client directly.

  • The minimum required frequenz-channels version is now v1.0.0-rc1.

  • The set of battery IDs managed by a battery pool are now available through BatteryPool.component_ids, and no longer through BatteryPool.battery_ids. This is done to have a consistent interface with other *Pools.

  • The maxsize parameter in calls to BatteryPool.{soc/capacity/temperature}.new_receiver() methods have now been renamed to limit, to be consistent with the channels repository.

  • Support for per-component interaction in EVChargerPool has been removed. Please use the new propose_power() method to manage power for the whole pool. If you still need to manage power of chargers individually, you can create one pool per charger.

  • PV power is now available from microgrid.pv_pool().power, and no longer from microgrid.logical_meter().pv_power.

New Features

  • EVChargerPool/microgrid.ev_charger_pool(): New propose_power and power_status methods have been added, similar to the BatteryPool. These method interface with the PowerManager and PowerDistributor, which currently uses a first-come-first-serve algorithm to distribute power to EVs.

  • A PV pool (PVPool/microgrid.pv_pool()) was added, with propose_power, power_status and power methods similar to Battery and EV pools.

  • The microgrid API client now exposes the reactive power for inverters, meters and EV chargers.

Enhancements

  • Warning messages are logged when multiple instances of *Pools are created for the same set of batteries, with the same priority values.

  • A warning message will now be logged if no relevant samples are found in a component for resampling.

Bug Fixes

  • A bug was fixed where the grid fuse was not created properly and would end up with a max_current with type float instead of Current.

  • BatteryPool.propose_discharge now converts power values to the passive-sign convention. Earlier it was not doing this and that was causing it to charge instead of discharge.

  • Fix a bug that was causing the power managing actor to crash and restart when cleaning up old proposals.

What's Changed

Read more

v1.0.0-rc5

26 Feb 14:42
v1.0.0-rc5
9f9520c
Compare
Choose a tag to compare
v1.0.0-rc5 Pre-release
Pre-release

Frequenz Python SDK Release Notes

Summary

This is a minor non-breaking release that adds new features and fixes a few bug.

New Features

  • Allow multiplying and dividing any Quantity by a float. This just scales the Quantity value.
  • Allow dividing any Quantity by another quaintity of the same type. This just returns a ration between both quantities.
  • The battery pool power method now supports scenarios where one or more inverters can have multiple batteries connected to it and one or more batteries can have multiple inverters connected to it.

Bug Fixes

  • Fix grid current formula generator to add the operator + to the engine only when the component category is handled.
  • Fix bug where sometimes the base_value of a Quantity could be of a different type than float.

What's Changed

  • Clear release notes by @llucax in #871
  • Fetch and stream 3-phase power by @daniel-zullo-frequenz in #847
  • Remove remaining traces of darglint by @llucax in #873
  • Make sure base_value is always float by @llucax in #874
  • Remove the last reference to darglint by @llucax in #877
  • Mock resampler: Improve variable names by @llucax in #879
  • Allow multiplying Quantity by float by @llucax in #875
  • Remove unnecessary send adapter by @llucax in #878
  • Bump actions/{up,down}load-artifact from 3 to 4 by @dependabot in #833
  • Allow all quantities division by float | Self by @llucax in #876
  • Cleanup and modularization of Power Manager, Power Distributor and DataPipeline by @shsms in #881
  • More updates for n:m support - battery pool's power formula by @Marenz in #730
  • Prepare release notes for 1.0.0-rc5 by @llucax in #884

Full Changelog: v1.0.0-rc4...v1.0.0-rc5

v1.0.0-rc4

02 Feb 13:20
v1.0.0-rc4
3ef0981
Compare
Choose a tag to compare
v1.0.0-rc4 Pre-release
Pre-release

Frequenz Python SDK Release Notes

Summary

This release represents 3 months of work so it includes a lot of changes. Most of them are (breaking) API changes, in the hopes to make a more consistent and easier to use SDK 1.0. There are also quite a few bug fixes and a couple of new features.

Upgrading

  • The BatteryPool.power_status method now streams objects of type BatteryPoolReport, replacing the previous Report objects.

  • Channels has been upgraded to version 1.0.0b2, for information on how to upgrade please read Channels release notes.

  • In BatteryPoolReport.distribution_result,

    • the following fields have been renamed:
      • Result.succeeded_batteriesResult.succeeded_components
      • Result.failed_batteriesResult.failed_components
      • Request.batteriesRequest.component_ids
    • and the following fields are now type-hinted as collections.abc.Set, to clearly indicate that they are read-only:
      • Result.succeeded_components
      • Result.failed_components
  • The Fuse class has been moved to the frequenz.sdk.timeseries module.

  • microgrid.grid()

    • A Grid object is always instantiated now, even if the microgrid is not connected to the grid (islanded microgrids).

    • The rated current of the grid fuse is set to Current.zero() in case of islanded microgrids.

    • The grid fuse is set to None when the grid connection component metadata lacks information about the fuse.

    • Grid power and current metrics were moved from microgrid.logical_meter() to microgrid.grid().

      Previously,

      logical_meter = microgrid.logical_meter()
      grid_power_recv = logical_meter.grid_power.new_receiver()
      grid_current_recv = logical_meter.grid_current.new_receiver()

      Now,

      grid = microgrid.grid()
      grid_power_recv = grid.power.new_receiver()
      grid_current_recv = grid.current.new_receiver()
  • Consumer and producer power formulas were moved from microgrid.logical_meter() to microgrid.consumer() and microgrid.producer(), respectively.

    Previously,

    logical_meter = microgrid.logical_meter()
    consumer_power_recv = logical_meter.consumer_power.new_receiver()
    producer_power_recv = logical_meter.producer_power.new_receiver()

    Now,

    consumer_power_recv = microgrid.consumer().power.new_receiver()
    producer_power_recv = microgrid.producer().power.new_receiver()
  • The ComponentGraph.components() parameters component_id and component_category were renamed to component_ids and component_categories, respectively.

  • The GridFrequency.component property was renamed to GridFrequency.source

  • The microgrid.frequency() method no longer supports passing the component parameter. Instead the best component is automatically selected.

  • The actor.ChannelRegistry was rewritten to be type-aware and just a container of channels. You now need to provide the type of message that will be contained by the channel and use the get_or_create() method to get a channel and the stop_and_remove() method to stop and remove a channel. Once you get a channel you can create new senders and receivers, or set channel options, as usual. Please read the docs for a full description, but in general this:

    r = registry.new_receiver(name)
    s = registry.new_sender(name)

    Should be replaced by:

    r = registry.get_or_create(T, name).new_receiver()
    s = registry.get_or_create(T, name).new_sender()
  • The ReceiverFetcher interface was slightly changed to make maxsize a keyword-only argument. This is to make it compatible with the Broadcast channel, so it can be considered a ReceiverFetcher.

New Features

  • A new method microgrid.voltage() was added to allow easy access to the phase-to-neutral 3-phase voltage of the microgrid.

  • The actor.ChannelRegistry is now type-aware.

  • A new class method Quantity.from_string() has been added to allow the creation of Quantity objects from strings.

Bug Fixes

  • 0W power requests are now not adjusted to exclusion bounds by the PowerManager and PowerDistributor, and are sent over to the microgrid API directly.

  • microgrid.frequency() / GridFrequency:

    • Fix sent samples to use Frequency objects instead of raw Quantity.
    • Handle None values in the received samples properly.
    • Convert nan values in the received samples to None.
  • 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.

  • The PowerManager no longer holds on to proposals from dead actors forever. If an actor hasn't sent a new proposal in 60 seconds, the available proposal from that actor is dropped.

  • Fix Quantity.__format__() sometimes skipping the number for very small values.

  • Not strictly a bug fix, but the microgrid API version was bumped to v0.15.3, which indirectly bumps the common API dependency to v0.5.x, so the SDK can be compatible with other APIs using a newer version of the common API.

    Downstream projects that require a frequenz-api-common v0.5.x and want to ensure proper dependency resolution should update their minimum SDK version to this release.

What's Changed

Read more

v0.25.2

11 Dec 13:51
v0.25.2
7716937
Compare
Choose a tag to compare

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

Full Changelog: v0.25.1...v0.25.2