Skip to content

Releases: frequenz-floss/frequenz-sdk-python

v0.24.0

09 Aug 13:13
v0.24.0
1d45fc9

Choose a tag to compare

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 floats.

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 #520
  • Allow running release notes check in merge queues by @llucax in #566
  • Clear release notes by @llucax in #560
  • Update frequenz-api-microgrid to v0.15.1 by @shsms in #416
  • Improvements to the ConfigManagingActor by @llucax in #565
  • Bump brettcannon/check-for-changed-files from 294a99714e0d350b5083472a293d41bc91804e68 to 4170644959a21843b31f1181f2a1761d65ef4791 by @dependabot in #567
  • Bump types-protobuf from 4.23.0.2 to 4.23.0.3 by @dependabot in #568
  • Bump polars from 0.18.11 to 0.18.12 by @dependabot in #569
  • Stream exclusion bounds from the battery pool by @shsms in #537
  • Bump polars from 0.18.12 to 0.18.13 by @dependabot in #570
  • Add docs cross-linking to APIs by @llucax in #571
  • Support exclusion bounds in power distributor by @shsms in #562
  • Update release notes for the v0.24.0 release by @llucax in #573

Full Changelog: v0.23.0...v0.24.0

v0.23.0

03 Aug 08:20
v0.23.0
58ca166

Choose a tag to compare

Frequenz Python SDK Release Notes

Summary

This release ships many small improvements and bug fixes to Quantitys. It also depends on channels v0.16.0, so users must update the dependency too.

Upgrading

New Features

  • Quantities

    • Add support for the unary negative operator (negation of a quantity).
    • Add abs().
    • Add a isclose() method on quantities to compare them to other values of the same type. Because Quantity types are just wrappers around floats, direct comparison might not always be desirable.
    • Add zero() constructor (which returns a singleton) to easily get a zero value.
    • Add multiplication by Percentage types.
    • Add a new quantity class Frequency for frequency values.
    • Add a new quantity class Temperature for temperature values.
  • FormulaEngine arithmetics now supports scalar multiplication with floats and addition with Quantitys.

  • Add a new temperature method for streaming average temperature values for the battery pool.

Bug Fixes

  • Fix formatting issue for Quantity objects with zero values.
  • Fix formatting issue for Quantity when the base value fulfills math.isinf() or math.isnan().
  • Fix clamping to 100% for the battery pool SoC scaling calculation.
  • Fix indexing for empty MovingWindows (now it properly raises an IndexError).

What's Changed

New Contributors

  • @jh2007github made their first contribution in #484

Full Changelog: v0.22.0...v0.23.0

v0.22.1

11 Jul 15:52
v0.22.1
1b77adc

Choose a tag to compare

Release Notes

Bug Fixes

  • Fix formatting issue for Quantity objects with zero values.

What's Changed

  • Fix formatting bug for zero values by @shsms in #503

Full Changelog: v0.22.0...v0.22.1

v0.22.0

04 Jul 12:17
v0.22.0
1b7053e

Choose a tag to compare

Release Notes

Summary

New Quantity types! These types can have units (power, current, voltage, etc.) and are type- and unit-safe in the sense that users can't accidentally sum a power with a voltage, or a power in kW with a power in W.

Upgrading

  • Sample objects no longer hold floats, but rather Quantity or one of its subclasses, like Power, Current, Energy, etc. based on the type of values being streamed.

    sample: Sample[Power] = await battery_pool.power.new_receiver().receive()
    power: float = sample.value.as_watts()
  • BatteryPool.soc now streams values of type Sample[Quantity], and BatteryPool.capacity now streams values of type Sample[Energy].

    battery_pool = microgrid.battery_pool()
    soc_sample: Sample[Quantity] = await battery_pool.soc.new_receiver().receive()
    soc: float = soc_sample.value.base_value
    
    capacity_sample: Sample[Energy] = await battery_pool.capacity.new_receiver().receive()
    capacity: float = soc_sample.value.as_watt_hours()
  • MicrogridApiClient.set_power no longer returns a protobuf.Empty result, but a None. This won't affect you unless you are using the low level APIs of the SDK.

New Features

  • The logical meter has a new method that returns producer power, that is the sum of all energy producers.

  • Quantity types (Power, Current, Energy, Voltage) for providing type- and unit-safety when dealing with physical quantities.

Bug Fixes

  • Two bugs in the ring buffer which is used by the MovingWindow class were fixed:

    • len(buffer) was not considering potentially existing gaps (areas without elements) in the buffer.
    • A off-by-one error in the gap calculation logic was fixed that recorded a gap when there was none if an element with a future timestamp was added that would create a gap of exactly 1.
  • A formula engine lifetime issue, when creating higher order formula receivers without holding on to a reference to the engine, was fixed.

What's Changed

New Contributors

Full Changelog: v0.21.1...v0.22.0

v0.16.2

03 Jul 12:43
v0.16.2
3fa4c14

Choose a tag to compare

Release Notes

Bug Fixes

  • Ping pypantic version to < 2.

What's Changed

Full Changelog: v0.16.1...v0.16.2

v0.21.1

06 Jun 17:46
783874f

Choose a tag to compare

Release Notes

Note

Please note that even when there is a v0.21.0 tag in the project's repository, there is no public release for v0.21.0 in GitHub or pypi.

This is due to a bug in the automation to create releases for new tags in v0.21.0. This release is exactly the same as v0.21.0 but with that bug fixed, so the full changes introduced by v0.21.0 are included here.

Summary

This release mainly introduces the new PeriodicFeatureExtractor, the control interface to the BatteryPool, and a new naming scheme for retrieving LogicalMeter and BatteryPool metrics. It also drops support for Python versions older than 3.11.

Upgrading

  • Now Python 3.11 is the minimum supported version. All users must upgrade to Python 3.11 (including virtual environments used for development).

  • BatteryPool metric streaming interfaces have changed for soc, capacity and power_bounds:

    soc_rx = battery_pool.soc()    # old
    
    soc_rx = battery_pool.soc.new_receiver()    # new
  • Formulas now follow the new naming scheme.

    • BatteryPool.{power, production_power, consumption_power}
    • EVChargerPool.{power, production_power, consumption_power}
    • LogicalMeter:
      • consumer_power
      • grid_power
      • grid_production_power
      • grid_consumption_power
      • chp_power
      • chp_production_power
      • chp_consumption_power
  • A power request can now be forced by setting the include_broken_batteries attribute. This is especially helpful as a safety measure when components appear to be failing, such as when battery metrics are unavailable. Note that applications previously relying on automatic fallback to all batteries when none of them was working will now require the include_broken_batteries attribute to be explicitly set in the request.

  • Now float is used everywhere for representing power (before power metrics were float but setting power was done using int).

    • frequenz.sdk.actor.power_distributing: the power attribute of the Request class has been updated from int to a float.
    • frequenz.sdk.microgrid: the set_power() method of both the MicrogridApiClient and MicrogridGrpcClient classes now expect a float value for the power_w parameter instead of int.
  • The LogicalMeter no longer takes a component_graph parameter.

  • Now frequenz.sdk.timeseries.Sample uses a more sensible comparison. Before this release Samples were compared only based on the timestamp. This was due to a limitation in Python versions earlier than 3.10. Now that the minimum supported version is 3.11 this hack is not needed anymore and Samples are compared using both timestamp and value as most people probably expects.

  • The dependency to sympy was unused and thus removed from the SDK. If you used it indirectly without declaring the dependency in your project you should do it now.

New Features

  • The MovingWindow has new public methods that return the oldest and newest timestamp of all stored samples.

  • The PeriodicFeatureExtractor has been added.

    This is a tool to create certain profiles out of periodic reoccurring windows inside a MovingWindow.

    As an example one can create a daily profile of specific weekdays which will be returned as numpy arrays.

  • The BatteryPool can now be used to control the batteries in it via the new methods charge(), discharge(), and set_power().

Bug Fixes

  • Fixed many examples in the documentation.

What's Changed

Full Changelog: v0.21.0...v0.21.1

v0.20.0

25 Apr 14:22
v0.20.0
7c7302d

Choose a tag to compare

Release Notes

Summary

The main feature in the release is the high-level interface. Now all base pipeline actors are created automatically when the SDK is initialized, and the wrapper classes can be accessed directly via frequenz.sdk.microgrid: logical_meter(), battery_pool() and ev_charger_pool().

Upgrading

  • Battery power is no longer available through the LogicalMeter, but through the BatteryPool (#338)

    battery_power_receiver = microgrid.battery_pool().power.new_receiver()
  • Formulas composition has changed (#327)

    • Receivers from formulas are no longer composable.
    • Formula composition is now done by composing FormulaEngine instances.
    • Automatic formulas from the logical meter and *pools, are now properties, and return FormulaEngine instances, which can be composed further, or can provide a receiver to fetch values.
    grid_power_receiver = microgrid.logical_meter().grid_power.new_receiver()
    
    self._inverter_power = (
        microgrid.logical_meter().pv_power
        + microgrid.battery_pool().power
    ).build("inverter_power")
    
    inverter_power_receiver = self._inverter_power.new_receiver()
  • Update BatteryStatus to mark battery with unknown capacity as not working (#263)

  • The channels dependency was updated to v0.14.0 (#292)

  • Some properties for PowerDistributingActor results were renamed to be more consistent between Success and PartialFailure:

    • The Success.used_batteries property was renamed to succeeded_batteries.
    • The PartialFailure.success_batteries property was renamed to succeeded_batteries.
    • The succeed_power property was renamed to succeeded_power for both Success and PartialFailure.
  • MovingWindow

    • The class is now publicly available in the frequenz.sdk.timeseries package.

    • Accept the size parameter as timedelta instead of int (#269).

      This change allows users to define the time span of the moving window more intuitively, representing the duration over which samples will be stored.

    • The input data will be resampled if a resampler_config is passed (#269).

      This allows controlling the granularity of the samples to be stored in the underlying buffer.

      Note that the parameter sampling_period has been renamed to input_sampling_period to better distinguish it from the sampling period parameter in the resampler_config.

    • Rename the constructor argument window_alignment to align_to and change the default to UNIX_EPOCH. This is to make it more consistent with the ResamplerConfig.

  • Resampler

    • The ResamplerConfig class is now publicly available in the frequenz.sdk.timeseries package.

    • The ResamplerConfig now takes the resampling period as a timedelta. The configuration was renamed from resampling_period_s to resampling_period accordingly.

    • The SourceProperties of the resampler now uses a timedelta for the input sampling period. The attribute was renamed from sampling_period_s to sampling_period accordingly.

    • The periods are now aligned to the UNIX_EPOCH by default.

      To use the old behaviour (aligning to the time the resampler was created), pass align_to=None to the ResamplerConfig.

New Features

  • The core data-pipeline actors are now created automatically (#270).

    This eliminates a lot of boiler plate code and makes it much simpler to deploy apps.

    For example:

    async def run():
        await microgrid.initialize(
            host=HOST, port=PORT, resampler_config=ResamplerConfig(resampling_period_s=1.0)
        )
        grid_power = microgrid.logical_meter().grid_power()
  • The Result class (and subclasses) for the PowerDistributingActor are now dataclasses, so logging them will produce a more detailed output.

  • The Resampler can now can align the resampling period to an arbitrary datetime.

    This can be configured via the new align_to option in the ResamplerConfig. By default the resampling period is aligned to the UNIX_EPOCH.

Bug Fixes

  • Change PowerDistributor to use all batteries when none are working (#258)

  • Update the ordered ring buffer used by the MovingWindow to fix the len() function so that it returns a value equal to or greater than zero, as expected (#274)

What's Changed

Read more

v0.19.0

15 Mar 15:55
v0.19.0
d5614a8

Choose a tag to compare

Release Notes

Summary

Upgrading

  • Remove _soc formula from the LogicalMeter. This feature has been moved to the BatteryPool.
  • Upgrade PowerDistributingActor to handle components with the NaN metrics (#247):
    • if power bounds are NaN, then it tries to replace them with corresponding power bounds from adjacent component. If these components are also NaN, then it ignores battery.
    • if other metrics metrics are NaN then it ignores battery.
  • BatteryStatus to track that a component stopped sending messages. If the battery or its adjacent inverter stopped sending messages, then the battery would be considered as not working. (#207)
  • PowerDistributing to send battery status to subscribed users (#205)
  • Rename microgrid.Microgrid to microgrid.ConnectionManager (#208)
  • Change few resampler logs from info to debug, because they were polluting startup logs (#238)

New Features

  • A new class SerializableRingbuffer is now available, extending the OrderedRingBuffer class with the ability to load & dump the data to disk.
  • Add the run(*actors) function for running and synchronizing the execution of actors. This new function simplifies the way actors are managed on the client side, allowing for a cleaner and more streamlined approach. Users/apps can now run actors simply by calling run(actor1, actor2, actor3...) without the need to manually call join() and deal with linting errors.
  • The datasourcing actor now automatically closes all sending channels when the input channel closes.
  • BatteryPool implementation for aggregating battery-inverter metrics into higher level metrics. (#205)
  • Add EV power and current streams to EVChargerPool (#201)

Bug Fixes

  • The resampler now correctly produces resampling windows of exact resampling period size, which only include samples emitted during the resampling window (see #170)

Removing

  • Deprecated code (#232):
    • frequenz.sdk._data_ingestion
    • frequenz.sdk._data_handling
  • The pandas(-stubs) and pytz dependencies are no longer needed (#261).

What's Changed

New Contributors

Full Changelog: v0.18.0...v0.19.0

v0.16.1

09 Mar 19:49
v0.16.1
4890ad3

Choose a tag to compare

Release Notes

Bug Fixes

  • Fix battery status logic: inverter that was discharging was considered as not working. So it was impossible to set any command until its state changed.

What's Changed

Full Changelog: v0.16.0...v0.16.1

v0.18.0

12 Feb 13:49
v0.18.0
b4e1efe

Choose a tag to compare

Release Notes

Summary

Upgrading

New Features

  • A new class OrderedRingBuffer is now available, providing a sorted ring buffer of datetime-value pairs with tracking of any values that have not yet been written.
  • Add logical meter formula for EV power.
  • A MovingWindow class has been added that consumes a data stream from a logical meter and updates an OrderedRingBuffer.
  • Add EVChargerPool implementation. It has only streaming state changes for ev chargers, now.
  • Add 3-phase current formulas: 3-phase grid_current and 3-phase ev_charger_current to the LogicalMeter.

Bug Fixes

  • Add COMPONENT_STATE_DISCHARGING as valid state for the inverter. DISCHARGING state was missing by mistake and this caused the power distributor to error out if the inverter is already discharging.

What's Changed

New Contributors

Full Changelog: v0.17.0...v0.18.0