Releases: frequenz-floss/frequenz-sdk-python
v0.16.2
Release Notes
Bug Fixes
- Ping
pypantic
version to< 2
.
What's Changed
Full Changelog: v0.16.1...v0.16.2
v0.21.1
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 forsoc
,capacity
andpower_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 theinclude_broken_batteries
attribute to be explicitly set in the request. -
Now
float
is used everywhere for representing power (before power metrics werefloat
but setting power was done usingint
).frequenz.sdk.actor.power_distributing
: thepower
attribute of theRequest
class has been updated fromint
to afloat
.frequenz.sdk.microgrid
: theset_power()
method of both theMicrogridApiClient
andMicrogridGrpcClient
classes now expect afloat
value for thepower_w
parameter instead ofint
.
-
The
LogicalMeter
no longer takes acomponent_graph
parameter. -
Now
frequenz.sdk.timeseries.Sample
uses a more sensible comparison. Before this releaseSample
s were compared only based on thetimestamp
. 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 andSample
s are compared using bothtimestamp
andvalue
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 methodscharge()
,discharge()
, andset_power()
.
Bug Fixes
- Fixed many examples in the documentation.
What's Changed
- ci: Fix building of tags by @leandro-lucarella-frequenz in #426
Full Changelog: v0.21.0...v0.21.1
v0.20.0
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 theBatteryPool
(#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 betweenSuccess
andPartialFailure
:- The
Success.used_batteries
property was renamed tosucceeded_batteries
. - The
PartialFailure.success_batteries
property was renamed tosucceeded_batteries
. - The
succeed_power
property was renamed tosucceeded_power
for bothSuccess
andPartialFailure
.
- The
-
MovingWindow
-
The class is now publicly available in the
frequenz.sdk.timeseries
package. -
Accept the
size
parameter astimedelta
instead ofint
(#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 toinput_sampling_period
to better distinguish it from the sampling period parameter in theresampler_config
. -
Rename the constructor argument
window_alignment
toalign_to
and change the default toUNIX_EPOCH
. This is to make it more consistent with theResamplerConfig
.
-
-
Resampler
-
The
ResamplerConfig
class is now publicly available in thefrequenz.sdk.timeseries
package. -
The
ResamplerConfig
now takes the resampling period as atimedelta
. The configuration was renamed fromresampling_period_s
toresampling_period
accordingly. -
The
SourceProperties
of the resampler now uses atimedelta
for the input sampling period. The attribute was renamed fromsampling_period_s
tosampling_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 theResamplerConfig
.
-
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 thePowerDistributingActor
are nowdataclass
es, so logging them will produce a more detailed output. -
The
Resampler
can now can align the resampling period to an arbitrarydatetime
.This can be configured via the new
align_to
option in theResamplerConfig
. By default the resampling period is aligned to theUNIX_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 thelen()
function so that it returns a value equal to or greater than zero, as expected (#274)
What's Changed
- Power Distributing: Documentation enhancements by @mathias-baumann-frequenz in #257
- Clean release notes by @ela-kotulska-frequenz in #271
- Check battery capacity in BatteryStatus by @ela-kotulska-frequenz in #263
- Use all batteries when none are working in PowerDistributor by @ela-kotulska-frequenz in #258
- Configure dependabot to automated version updates by @daniel-zullo-frequenz in #268
- Bump pylint from 2.17.0 to 2.17.1 by @dependabot in #288
- Bump mypy from 1.0.1 to 1.1.1 by @dependabot in #286
- Bump actions/labeler from 4.0.1 to 4.0.3 by @dependabot in #279
- Bump pytest from 7.2.1 to 7.2.2 by @dependabot in #287
- Bump black from 23.1.0 to 23.3.0 by @dependabot in #284
- Update channels dependency to v0.14.0 by @mathias-baumann-frequenz in #295
- Various small fixes by @mathias-baumann-frequenz in #277
- Fix len() of the OrderedRingBuffer by @daniel-zullo-frequenz in #274
- Bump pytest-asyncio from 0.20.3 to 0.21.0 by @dependabot in #281
- Bump mkdocstrings[python] from 0.19.1 to 0.20.0 by @dependabot in #283
- Update networkx requirement from <3,>=2.8 to >=2.8,<4 by @dependabot in #282
- Bump mkdocs-material from 8.5.11 to 9.1.5 by @dependabot in #298
- Add a
DataPipeline
implementation by @shsms in #270 - Bump pylint from 2.17.1 to 2.17.2 by @dependabot in #300
- Use a bigger request receiver buffer size in data pipeline actors by @shsms in #302
- Refactor power distributor's
Result
s by @leandro-lucarella-frequenz in #305 - Bump mkdocstrings[python] from 0.20.0 to 0.21.1 by @dependabot in #308
- Add
component_data
method to EVChargerPool by @shsms in #266 - benchmark data sourcing actor by @mathias-baumann-frequenz in #211
- Add ringbuffer memory benchmark by @mathias-baumann-frequenz in #278
- Update MovingWindow to add resampler by @daniel-zullo-frequenz in #272
- Bump mkdocs-material from 9.1.5 to 9.1.6 by @dependabot in #312
- Add a
EVChargerPool.set_bounds
method for setting current bounds by @shsms in #297 - Bump mkdocstrings[python] from 0.21.1 to 0.21.2 by @dependabot in #309
- Bump pytest from 7.2.2 to 7.3.0 by @dependabot in #313
- Bump mypy from 1.1.1 to 1.2.0 by @dependabot in #310
- Add BatteryPool and PowerDistributingActor to the DataPipeline by @sahas-subramanian-frequenz in #317
- Expose BatteryPool and PowerDistributingHandle from
sdk.microgrid
by @sahas-subramanian-frequenz in #323 - Fix ring buffer benchmarks by @daniel-zullo-frequenz in #324
- Make interface for serializing a ringbuffer more flexible. by @mathias-baumann-frequenz in #326
- Ringbuffer: Moved files into a package by @mathias-baumann-frequenz in #329
- Update
BatteryPool
tests, examples to usemicrogrid.battery_pool()
by @sahas-subramanian-frequenz in #336 - Bump pytest from 7.3.0 to 7.3.1 by @dependabot in #339
- Make the resampler use timedelta for periods by @leandro-lucarella-frequenz in #334
- Bump frequenz-floss/setup-git-user from 1 to 2 by @dependabot in #345
- Make FormulaEngine instances composable, instead of FormulaReceivers by @sahas-subramanian-frequenz in #327
- Add
power
formula toBatteryPool
by @sahas-subramanian-frequenz in https://github.com/fr...
v0.19.0
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 theOrderedRingBuffer
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
- Serializing Ringbuffer by @mathias-baumann-frequenz in #167
- Rename microgrid.Microgrid to microgrid.ConnectionManager and its Insecure-companion by @christianparpart in #208
- Add EV power and current streams to
EVChargerPool
by @shsms in #201 - Change battery status when component stopped sending data by @ela-kotulska-frequenz in #207
- Remove deprecated code by @ela-kotulska-frequenz in #232
- Fix mypy invocation in noxfile by @leandro-lucarella-frequenz in #219
- Add wrappers for the component data in unit tests by @ela-kotulska-frequenz in #231
- Fix flaky LogicalMeter test_soc by @ela-kotulska-frequenz in #235
- Update MockMicrogrid for use with datasourcing benchmark by @mathias-baumann-frequenz in #224
- Change few resampler logs from info to debug by @ela-kotulska-frequenz in #238
- Add a run() method to run/wait for actors completion by @daniel-zullo-frequenz in #200
- Add & use close channel method in the registry by @mathias-baumann-frequenz in #225
- Add BatteryPool implementation for aggregating battery-inverter data by @ela-kotulska-frequenz in #205
- Remove
_soc
formula from the LogicalMeter by @ela-kotulska-frequenz in #248 - Increase sampling rate in the flaky formula test by @ela-kotulska-frequenz in #251
- Make resampling window size constant by @leandro-lucarella-frequenz in #236
- Change PowerDistributor to ignore components with NaN metrics by @ela-kotulska-frequenz in #247
- Update release notes by @ela-kotulska-frequenz in #252
- Pin dev/test dependencies by @daniel-zullo-frequenz in #256
- Fix resampler behaviour when resampling is to late by @ela-kotulska-frequenz in #255
- Change BatteryPool to send metrics only when they change by @ela-kotulska-frequenz in #254
- Remove pandas(-stubs) dependencies by @daniel-zullo-frequenz in #261
New Contributors
- @christianparpart made their first contribution in #208
Full Changelog: v0.18.0...v0.19.0
v0.16.1
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
- Fix bug in battery status by @ela-kotulska-frequenz in #237
- Update release notes by @ela-kotulska-frequenz in #244
Full Changelog: v0.16.0...v0.16.1
v0.18.0
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 anOrderedRingBuffer
. - Add EVChargerPool implementation. It has only streaming state changes for ev chargers, now.
- Add 3-phase current formulas:
3-phase grid_current
and3-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
- Clean release notes by @ela-kotulska-frequenz in #179
- Add 3-phase current formulas by @shsms in #164
- Sorted Ringbuffer by @mathias-baumann-frequenz in #139
- Use MockMicrogridClient instead of a MockMicrogridServer in LogicalMeter tests by @shsms in #180
- Battery status with channel communication by @ela-kotulska-frequenz in #171
- Update code to pass newly-released
black v23.1.0
by @shsms in #192 - Update to work with newly-release
pylint v2.16
by @shsms in #193 - Use
Sample
type with the RingBuffer by @mathias-baumann-frequenz in #186 - Add logical meter formula generator for EV power by @daniel-zullo-frequenz in #185
- Add an
EVChargerPool
implementation by @shsms in #194 - Add 3.11 to the supported Python versions by @leandro-lucarella-frequenz in #195
- Add a Moving Window Class by @matthias-wende-frequenz in #190
- Move dev dependencies to pyproject.toml by @leandro-lucarella-frequenz in #199
- Add COMPONENT_STATE_DISCHARGING to valid inverter states by @ela-kotulska-frequenz in #202
New Contributors
- @matthias-wende-frequenz made their first contribution in #190
Full Changelog: v0.17.0...v0.18.0
v0.17.0
Broken version
This version has a major bug in the power distributor, and it is recommended not to be used. Please upgrade to v0.18.0, there are no breaking changes so updating should be trivial.
Release Notes
Summary
Upgrading
-
The resampler now takes a
name
argument foradd_timeseries()
. This is only used for logging purposes. -
The resampler and resampling actor now takes a
ResamplerConfig
object in the constructor instead of the individual values. -
The resampler and resampling actor can emit errors or warnings if the buffer needed to resample is too big. If it is bigger than
ResamplingConfig.max_buffer_len
, the buffer will be truncated to that length, so the resampling can lose accuracy. -
The
ResamplingFunction
now takes different arguments:resampling_period_s
was removed.resampler_config
is the configuration of the resampler calling the resampling function.source_properties
is the properties of the source being resampled.
-
Update frequenz-channel-python dependency to the latest release v0.12.0
-
The
MetricFetcher
now propagates NaN to handle None values whenNone
are not treated from the stream as0
s. Then anyFormulaStep
can compute the results without checking for None on each value involved. However the final result is written asNone
rather than NaN/INF in theFormulaEngine
.
New Features
-
The resampler and resampling actor can now take a few new options via the new
ResamplerConfig
object:warn_buffer_len
: The minimum length of the resampling buffer that will emit a warning.max_buffer_len
: The maximum length of the resampling buffer.
-
The resampler now infers the input sampling rate of sources and use a buffer size according to it.
This information can be consulted via
resampler.get_source_properties(source)
. The buffer size is now calculated so it can store all the needed samples requested via the combination ofresampling_period_s
,max_data_age_in_periods
and the calculatedinput_sampling_period_s
.If we are upsampling, one sample could be enough for back-filling, but we store
max_data_age_in_periods
usinginput_sampling_period_s
as period, so the resampling functions can do more complex inter/extrapolation if they need to.If we are downsampling, we want a buffer that can hold
max_data_age_in_periods * resampling_period_s
seconds of data, and we have one sample everyinput_sampling_period_s
, so we use a buffer length of:max_data_age_in_periods * resampling_period_s / input_sampling_period_s
Bug Fixes
-
Fixed logger creationg for some modules.
Some modules didn't create the logger properly so there was no way to configure them using the standard logger configuration system. Because of this, it might have happened that some log messages were never showed, or some message that the user didn't want to get were emitted anyway.
-
When automatically generating formulas for calculating grid power, include measurements from EV chargers if any are directly connected to the grid.
What's Changed
- Clear release notes by @ela-kotulska-frequenz in #158
- Make resampler infer the input sampling period and buffer length by @leandro-lucarella-frequenz in #136
- Handle
NaN
values in FormulaEngine by @daniel-zullo-frequenz in #99 - Use stricter typing for
eval_stack
used by the FormulaEngine by @shsms in #162 - Fix minimum requirements test by @daniel-zullo-frequenz in #163
- Add documentation and usage instructions for noxfile by @shsms in #166
- Move code in
util
package to_internal
by @shsms in #168 - Add mock microgrid implementation by @ela-kotulska-frequenz in #169
- Define way to create object with async constructor by @ela-kotulska-frequenz in #145
- Use measurements from EV chargers when calculating grid power by @shsms in #172
- Update frequenz-channel-python to the latest release v0.12.0 by @ela-kotulska-frequenz in #173
- Add missing entry to the current release notes by @daniel-zullo-frequenz in #174
- Update RELEASE NOTES about logical meter bugfix by @shsms in #176
- Update release notes before release by @ela-kotulska-frequenz in #178
New Contributors
- @daniel-zullo-frequenz made their first contribution in #99
Full Changelog: v0.16.0...v0.17.0
v0.16.0
Release Notes
Summary
The Frequenz SDK now supports Python 3.11.
New Features
-
Upgrade PowerDistributingActor to track if batteries are working
#117 -
Simplify
Resampler
by moving configuration to its own classResamplerConfig
#131 -
Add
initial_buffer_len
to the ResamplerConfig. This means thatResampler
will store at least this number of arguments. OtherResampler
behaviour won't change
#131 -
Ability to compose formula outputs into higher-order formulas:
#133 -
Add a formula generator for SoC in the LogicalMeter
#137
Bug Fixes
-
Formulas with repeated operators like
#1 - #2 - #3
were getting
calculated incorrectly as#1 - (#2 - #3)
. This has been fixed in
#141 -
Remove
microgrid_api
andcomponent_graph
arguments from PowerDistributingActor constructor
#156
What's Changed
- Clear release notes by @ela-kotulska-frequenz in #129
- Improve resampler buffer and config by @leandro-lucarella-frequenz in #131
- README: Fix build status badge by @leandro-lucarella-frequenz in #134
- Add a formula generator for SoC in the LogicalMeter by @shsms in #137
- Track status of the batteries by @ela-kotulska-frequenz in #117
- Fix formula precedence bug in the
FormulaEngine
by @shsms in #141 - Add
FormulaChannel
s for composing formula outputs by @shsms in #133 - Update release notes by @ela-kotulska-frequenz in #146
- Add a delay for the mock server to start, before creating a client by @shsms in #150
- Wait for a short time after starting the test actors by @shsms in #153
- Send 0 values from power formulas for non-existant component types by @shsms in #151
- Update power distributor to use frequenz.sdk.microgrid by @ela-kotulska-frequenz in #156
- Support python 3.11 by @shsms in #157
Full Changelog: v0.15.0...v0.16.0
v0.15.0
Release Notes
Summary
Upgrading
- Add fine-grained Result types for the PowerDistributingActor. Previously Result was one class with many fields. Now each type of the result has its own class that derives from Result parent class.
New Features
- Add inverter type to the Component data. Inverter type tells what kind of inverter it is (Battery, Solar etc).
- Add
FormulaGenerator
class for generating formulas from the component graph. - Add formulas for:
grid_power
,battery_power
,PV power
.
Bug Fixes
- Fix ComponentMetricResamplingActor, to not subscribe twice to the same source.
What's Changed
- Clear release notes by @leandro-lucarella-frequenz in #111
- Add missing dependencies in documentation by @mathias-baumann-frequenz in #114
- Add fine-grained
Result
types for thePowerDistributingActor
by @ela-kotulska-frequenz in #104 - Generate formulas automatically from the component graph by @shsms in #103
- resampling: Don't subscribe twice to the same source by @leandro-lucarella-frequenz in #123
- Fix warnings in unit tests by @ela-kotulska-frequenz in #125
- Update release notes by @ela-kotulska-frequenz in #127
New Contributors
- @mathias-baumann-frequenz made their first contribution in #114
Full Changelog: v0.14.0...v0.15.0
v0.14.0
Release Notes
Summary
This release improves the performance of the ComponentMetricsResamplingActor
, and fixes a bug in the LogicalMeter
that was causing it to crash.
Upgrading
frequenz.sdk.timseries
:- The resample classes (
GroupResampler
,Resampler
,ResamplingFunction
) where removed and the replacement classes are hidden for now, as they are going through a rewrite.
- The resample classes (
Bug Fixes
- The Resampling actor sends None values out when there is no data from a component. The logical meter used to raise an exception if it saw a
None
value from any of its streams. The logical meter is now able to handleNone
values by propagating theNone
values, or treating them as0
s.
What's Changed
- Support handling
None
values in LogicalMeter/FormulaEngine by @shsms in #95 - Clear release notes by @leandro-lucarella-frequenz in #98
- Fix the disable_actor_auto_restart fixture by @leandro-lucarella-frequenz in #97
- Split the formula execution logic from the formula building logic by @shsms in #96
- Prevent LogicalMeter from crashing on formula application failure by @shsms in #105
- Handle
asyncio.CancelledError
separately in theLogicalMeter
by @shsms in #106 - Rewrite the resampler class to be more reusable by @leandro-lucarella-frequenz in #101
- Update release notes for v0.14.0 by @leandro-lucarella-frequenz in #109
Full Changelog: v0.13.0...v0.14.0