Changelog

Planned features in Backlog.

* breaking change.

0.25.2 (2026-07-06)

Non-breaking changes

  • Importer bugfix for recalculation of average yearly inflow.

  • Importer adds inflow for defined historical period (on LtmSystem.xml)

0.25.1 (2026-06-28)

Non-breaking changes

  • Importer supports loads categories 6 and 7.

  • Importer supports market_steps categories 10, 11, 12, 13, 14, 20 and 40. (kjøp tidsserie, salg tidsserie, kjøp sportmarket prisrekke, salg sportmarket prisrekke, gjenkjøp tidsserie, Flomkraft, Rasjonering).

  • the method import_directory() now has five importer options which allows for skipping importer steps: import_market_steps, import_loads, recalculate_average_yearly_inflow, import_detailed_hydro, import_wind with default value true.

  • Added uncontrollable_generation and uncontrollable_generation_series as alternative to solar and wind. This allows for scaling and referencing the uncontrollable_generation_series for multiple uncontrollable_generation objects.

  • Deprecation warning for: solar and wind. Use uncontrollable_generation.

0.25.0 (2026-06-24)

Breaking changes

  • Updated pyltm datetime-internals. The change should not affect any user code, except datetime-handling in Windows should support timestamps before 1970.

Non-breaking changes

  • Implemented reader for wind and solar data from the ENMD file

  • Re-added periodic_lower_bound and periodic_upper_bound constants.

  • Added helpers make_txy, make_constant_txy, make_volume_curve, make_pq_curve.

  • pyltm.validate_model() has been changed to return a list of validation errors.

  • Python API-objects can be edited, added and removed from the model. It is possible to search for and get API objects from the Python LtmApi model object with methods find, get and remove.

  • Python LtmApi model object exposes member variable discrepancies for easier access to model discrepancies.

  • Average regulated and unregulated yearly inflow will be automatically recalculated when using import_directory(). Can be disabled with recalculate_average_yearly_inflow = False.

  • Main price series workaround for EOPS. After genpris, the API will automatically rename exogenous_prices.h5 to exogenous_prices.h5.renamed.h5.

  • The API will enforce minimum simulation period for EOPS, which is 52 weeks.

  • A prototype of a LTMAPI C-interface is exposed.

  • Bugfix: Result series sum_power_used_for_pumping did point to sum_pumped_power. It has been fixed to point to power used for pumping.

  • Bugfix: Hydraulic coupling group number must be between 0 and 10000, for hydraulic couplings of type 200 and 300. Default group number is starting from 1223 (the 200th prime). When using command line applications, the group number will be formatted wrongly in the DETD files if it’s over 10000.

0.24.0 (2026.05.21)

Breaking changes

  • Renamed busbars to areas

  • Renamed method for extracting model areas from busbars() to areas()

0.23.0 (2026.05.13)

Breaking changes

  • Reservoirs connected to pumps must both have volume_curve.

  • Moved gross_head and tailrace_elevation from Plant to Reservoir

  • Moved average_energy_equivalent from Reservoir to Plant

  • Added unknown_key_policy to global settings. Possible modes are strict, strict_ignore_underscore and ignore_all. If there are unknown keys in the JSON-model, LTM-API will complain if mode is not ignore_all. Can be controlled with global_settings.estimate_pq_curve_from_energy_equivalent.

Non-breaking changes

  • Plants without PQ-curves and a non-zero energy equivalent will use a calculated PQ-curve

  • More detailed error messages for some range-based timeseries, replacing “Internal error with make_sluttuke_from_txy::create_range”

  • Forecast: The API will throw an error if forecast period is before the beginning of the data period.

  • Forecast: It is possible to disable forecast by using "scenarios": [[0,0]] in the forecast period, without removing forecast from the model.

  • Forecast: Better error messages when mixing 1D and 2D forecasts.

  • Price series: Price series can start at simulation start. No further need to insert dummy data starting from data period start for price series.

  • LTM Core crash: LTM-API will create a valid DETD-file with repeatable PQ-curves and a short data period (52 weeks). The API wrote invalid DETD-files when repeatable PQ-curves and with a data period of 52 weeks. This caused the LTM core to segfault.

0.22.0 (2026.04.29)

Breaking changes

  • Renamed busbar results method (sum_production_from_market_steps) for extraction of net traded price elastic power (sum generation - sum consumption) to net_trade_on_market_steps

  • Renamed the model attribute average_spill_energy_equivalent to average_energy_equivalent

Non-breaking changes

  • Added method results and have_results on market_step for extracting detailed results for price elastic power (SAMRES.h5)

  • Added method have_pump_results on busbar to avoid extracting pumping results for busbars without any pumps (timeseries with only zeros)

  • Attributes upper_reservoir_reference_curve and lower_reservoir_reference_curve on pumps are no longer required. They will default to 100% and 0% if they are omitted from the input model.

  • Implemented support for market steps of type buyback.

  • Fixed a bug where market steps is missing values for price.

0.21.2 (2026.04.08)

Breaking changes

Non-breaking changes

  • Coefficients on price series on market steps is available through Python stubs

  • Added global_settings.estimate_pq_curve_from_energy_equivalent to enable/disable automatic calculation of PQ-curve from energy equivalent.

  • When dumping a model to JSON, attributes with default values are not exported.

0.21.0 (2026.03.24)

Breaking changes

  • Updated stubs and docstrings for Python API object and attributes. Some Python objects have changes in name and what namespace they belongs to.

  • Updated stubs and docstrings for methods on Python API objects.
    • Attribute HydraulicCoupling::is_station_joined has been renamed to HydraulicCoupling::station_joined

    • Attribute HydraulicCoupling::have_hydraulic_flow_results has been changed into a method have_hydraulic_flow_results()

    • Reservoir result method discharge() has an alias, drawdown(). The alias has been removed.

    • busbar.reservoirs() does not include station joined hydraulic couplings anymore. Use busbar.hydraulic_couplings().

Non-breaking changes

0.20.3 (2026.03.06)

Non-breaking changes

  • Keys ltm_core_linear_interpolation and is_periodic are allowed when importing Txy from JSON.

  • Removed attributes periodic_lower_bound and periodic_upper_bound from pyltm.util. They were causing problems on Windows.

0.20.2 (2026.03.03)

Breaking changes

  • Changed base year for cyclic curves from year 0000 to year 1703. Added is_periodic to TxyLin.

  • Added support for cyclic PQ-curves. From JSON use weeks-notation (ie: W01 up to W52), for Python use DateTime with 1703 as year.

Non-breaking changes

  • Relaxed requirements for TxyLin curves. Invalid curves will not result in a hard stop, but a validation discrepancy. Validation discrepancies can be ignore by setting allow_validation_failures to true.

0.20.1 (2026.02.02)

Non-breaking changes

  • Attributes is now a compile time tuple/list for each object.

  • Added support for cyclic TxyLin curves that will automatically repeat for each year in the data period.

  • Import: Do not print ‘Hydraulic coupling 0 not handled for reservoir [reservoir name]’ when hydraulic coupling code is 0.

0.20.0 (2026.01.21) *

Breaking changes

  • Added energy equivalent validation checks. Validation will fail if those two energy equivalents are not approximately the same, +-5% range is allowed.

  • Extra TxyLin checks for curves that will be linearized in LTM Core.

  • Extra TxyLin checks for curves that will be linearized in LTM Core. Time dependent constraints for minimum and maximum discharge, bypass and reservoir volume are checked for invalid data, the minimum values are not allowed to be higher than maximum values at any point

  • Validation of correctly specified pump_capacity for pumping head and pumped discharge

Non-breaking changes

  • Improved error messages.

0.19.5 (2026.01.12)

Non-breaking changes

  • metadata attribute is working as expected again.

0.19.4 (2026.01.12)

Internal release.

0.19.3 (2026.01.12)

Non-breaking changes

  • DETD modules with no production will no longer have any PQ-curves

  • added txylin datatype for time dependent reservoir reference curve, min/max reservoir volume curve, min/max bypass curve and min/max discharge where the name of the datatype “txylin” reflects to the users that the values are linearisation in the LTM-core.

  • added control of concurrent presence of min/max constraints and tests

Bugfixes

  • fix for letter casing in method getting area results from detsimres.h5

  • DETD-writer with no PQ-curves will write a correctly formatted entry. It was -1, 0.00, now it is 0, 0.00.

  • DETD-parser will correctly parse modules with 0 PQ-curves.

  • When shutting down pyltm, it will no longer give an error.

  • DETD-writer: Will throw an error if FALLHOYDE/gross_head is 0.0.

  • DETD import: Will set gross_head and tailrace_elevation on Plant and not Reservoir if Plant exists in the same system.

0.19.2 (2025.11.27)

Changes:

  • ENMD parser will complain with filename if trying to import a dataset with manually adjusted water value weights.

  • Fixed bug when getting hydraulic couplings for a busbar, saying dataset HydUtveksling is not available.

  • Added hc.production() and hc.discharge() for station joined hydraulic connections.

  • Fixed hydraulic exchange flow results.

  • Updated pyltm.pyi stub file

0.19.1 (2025.11.20)

Added:

  • LTM files written by the API will be encoded in ISO-8859-1. Using nordic characters for area/busbar names is highly discouraged.

  • import_directory will import DCLines from MASKENETT.DATA. Variable capacity is read from Cap_file.h5 and constant capacity is read from MASKENETT.DATA. Variable capacity on MASKENETT.DATA is not, and will not be supported.

  • Import will not output both mutually exclusive attributes max_volume and volume_curve Reservoirs.

  • Strings written to DETD and ENMD files is consistently in ISO-8859-1.

  • Bug with calculating time periods when importing data is fixed.

0.19.0 (2025.11.14)

Added:

  • First prototype for EMPS import directory functionality, with focus on DETD-topology and LtmApi model dump. session.import_directory and session.dump_model.

  • Updated DETD topology plots.

  • Added: Make missing return statements in non-void methods a compiler error with compiler flags “-Wreturn-type -Werror=return-type”

0.18.3 (2025.11.11)

  • Fixed: Station joined hydraulic connections did not connect to downstream reservoirs.

  • Bugfix: Detailed hydro results - reservoir volume unit

0.18.3-rc1 (2025.10.17)

  • Added:

    • Experimental methods import_directory and dump_model.

0.18.2 (2025.09.29) *

  • Added:

    • Support for outage/breakdown period (HAVARI.STAS) with attribute breakdown_unavailable_capacity on Plants and Pumps.

    • Results from hydraulic couplings type 200 and 300 if they are available through EMPS/EOPS license.

0.18.0 (2025.09.18) *

  • Change: Renamed some attributes to make them more consistent.

    • aggregated_hydro_mdule.regulated_energy_inflow -> aggregated_hydro_mdule.regulated_power_inflow

    • aggregated_hydro_mdule.unregulated_energy_inflow -> aggregated_hydro_mdule.unregulated_power_inflow

  • Change: Renamed some result series.

    • aggregated_hydro_module.sum_hydro_energy_production -> aggregated_hydro_module.sum_hydro_power_production

    • battery_module.sum_energy_production -> battery_module.sum_power_production

    • busbar.sum_pumped_energy -> busbar.sum_pumped_power

    • busbar.sum_energy_used_for_pumping -> busbar.sum_power_used_for_pumping

Unit for sum_pumped_power and sum_power_used_for_pumping is changed to MW from GWh.

Change:

  • Simplified the use of Txy timeseries.

Added:
  • Added reservoir.reservoir_type. Valid values are buffer and regulation.

Removed:

  • Txy attribute values in timeseries is removed and the API will generate an error if that key is used.

0.17.0 (2025.09.01) *

Warning

  • It is highly recommended to avoid using the attribute busbar.water_value_weights unless you know how to use it.

Warning

  • Energy inflow series for aggregated hydro modules has been changed from MWh to MW.

Warning

  • Attributes spill_cost and load_penalty have been changed to scalars. If they are omitted, default price for spill cost is 0.01 and default price for load penalty is 3000.0.

  • Change: Renamed some attributes in the JSON model and Python interface.

    • Result attribute busbar.water_value -> busbar.water_value_results

    • Input attribute busbar.water_value -> busbar.water_value_weights

    • busbar.reservoir -> busbar.sum_reservoir

  • Added result series:

    • aggregated_hydro_module.sum_hydro_energy_production

    • aggregated_hydro_module.sum_hydro_energy

    • battery_module.sum_energy_production

    • battery_module.sum_energy

    • busbar.sum_pumped_energy

    • busbar.sum_energy_used_for_pumping

  • Removed:

    • global_settings.reservoir_pts

  • Added: Default currency unit/energy unit is EUR/MWh.

  • Change: Regulated and unregulated energy inflow for aggregated hydro modules and batteries have changed unit from MWh to MW. In the the same change, the API will now correctly sum up any variations within the week in case of hourly resolutions. The requirements for input series has been relaxed. It no longer strictly necessary to have the input series as a 2D matrix where the extra dimension is number of scenarios (historical years). When the input series is a 1D vector, the API will build a 2D series from the 1D input vector.

  • Added: Environment variable LTM_ARCHIVE is always set to API.

  • Added: global_settings.default_spill_cost and global_settings.default_load_penalty price series. If no spill cost/load penalty are defined on a busbar, they will use the default from global settings.

  • Change: spill_cost, load_penalty, default_spill_cost and default_load_penalty have been changed to a scalar data type (double).

  • Change: If water_value_weights is specified, number of weights must be exactly 7.

0.16.3 (2025.08.07)

  • Added: session.build_busbar_graph() for drawing dot graphs with busbars and connected DCLines

0.16.2 (2025.07.31)

  • Bugfix: Performance problem when fetching detailed hydro results with large result sets fixed.

0.16.1 (2025.07.29)

  • Bugfix: Disallow reassigning market steps, loads, +++, to other busbars if they already has been connected to a busbar.

0.16.0 (2025.07.28)

  • Added: Results from FBMC

  • Bugfix: Inflow series for hydraulic couplings

0.15.0 (2025.06.25)

  • Bugfix: Reservoir reference curve week bugfix. Week was offset by 1 week.

  • Added: Forecast and forecast period. Forecast.

  • Added: global_settings/historical_type.

0.14.2 (2025.06.04)

  • Bugfix: Some features were wrongly disabled when using license file. Some features are always on and will not be disabled when running with license file or enviroment passwords.

0.14.1 (2025.06.04)

  • Added: Support for EMPS/serial simulation.

  • Added: Support for specifying timestamps in ISO-week notation, ie. 2024-W01. iso-week-time-label

  • Bugfix: Aggregated hydro modules no longer requires upper/lower production/reservoir limits. Improved error message.

0.14.0 (2025.05.21)

  • Major: Flow based market coupling

  • Added: Generate LtmSystem.XML / EmpsSystem.XML

  • Major: Arbitrary start and end week for simulation. calc_water_value_flag is now simulation_period. *

  • Bugfix: Aggregated hydro modules used wrong unit in results. Correct units are MW and MWh, where GW and GWh was used previously. *

  • Added: More unit testing

  • Added: Fetching results from EOPS simulations

  • Added: Secondary price series

  • Added: Sum load and sum production from market steps aggregate results. *

  • Added: Results with time axis. *

  • Bugfix: Battery time series with relaxed requirements for time series. *

  • Added: Simplified price segment requirements and use.

  • Added: More detailed errors from H5.

  • Added: Interest rate

  • Bugfix: Aggregated hydro modules energy inflow used wrong unit when writing LTM data files. Energy inflow is correctly converting from MWh to GWh. *

  • Added: Market steps with exogenous prices.

  • Cosmetic: Attribute table displays the default value.

  • Added: Separate default precision and iterations for busbars with batteries.

  • Added: Specify precision and iterations per busbar.

  • Added: Specify feedback factors per busbar.

  • Bugfix: Interpolate volume restrictions (min/max volume) for all reservoirs for every week in the data period.

0.13.0 (2025.02.07)

  • Minimal EOPS simulation.

  • Revisions/unavailable capacity on pumps. *

  • Batteries included (again). *

  • V10Converter for exogenous prices

  • nt_inflow removed from water value result matrix. *

0.12.3 (2025.01.17)

  • Bugfix: Spot price market step

0.12.1 (2025.01.14)

  • Bugfix: Spot price market step

0.12.0 (2025.01.10)

  • Spot price market step

0.11.0 (2024.12.19)

  • Exogenous price writer, but not usable from the API.

  • Added 2 attributes to global settings, model_type and simulation_type.

  • Hydraulic couplings. Hydraulic Couplings

  • Live LTM.

0.10.5 (2024.12.12)

  • Bugfix: Wind can be unlocked with password.

0.10.4 (2024.12.09)

  • Bugfix: Multiple DCLines between busbar is supported, while using Cap_file.

0.10.3 (2024.12.06)

  • Bugfix: Id and TS_name added to TidsserieData.h5 file when using loads with hourly resolution.

0.10.2 (2024.12.05)

  • Bugfix: Detailed hydro module, spill.

  • Added scenario dependent loads (TidsserieData.h5).

0.10.1 (2024.12.02)

  • Bugfix: Fetching detsimres results from the API is not slow anymore.

0.10.0 (2024.11.29)

Known issues:

  • Batteries does not work.

0.9.1 (2024.11.20)

  • Major: Pumps. Pumps in the LtmApi.

  • Added: Restriction 9 on plants, gross head max discharge.

  • Minor: Bugfixes on pumps.

  • Minor: Bugfixes when using external timeseries for some timeseries.

0.9.0 (2024.11.13)

  • Major: Detailed hydro modules has been reworked and previous models will not work. Detailed hydro modules.

  • Added: Utility-method for converting Historical.h5 series to LTM-API data series. V10 Dataset Converter.

  • Added: Writer for reservoir.star. Initial reservoir volumes for detailed and aggregated hydro modules.

  • Added: Writer for revisjonsplan.stas. This file contains planned station outages.

0.8.1 (2024.10.25)

  • Fixed some bugs with TidsserieData.h5 and ENMD.

  • Added “stop words”. LTM-API will scan the contents of the produced log files and stop execution if any of the defined “stop words” are present. Ignore by setting global_settings.ignore_stopwords to true.

  • More properties and attributes on API objects in Python are defined and exposed.

0.8.0 (2024.10.24)

  • Dynamic attributes for Python API objects.

  • Loads are using a local index per busbar, allowing for more than 100 total loads in the simulation. Each busbar is still limited up to 100 loads.

  • The way the LTM core applications are launched have been changed.

  • Batteries included. Documentation: Battery functionality.

  • Reader for price segments.

  • Reader/writer for LASTPROFIL.ARCH and EFFEKTPROFIL.ARCH.

  • External timeseries for CSV and SQLite. External data.

  • DCLines with hourly resolution. Constant capacity is written to MASKENETT.DATA, any varying values goes to Cap_file.h5.

  • Very early prototypes of next iteration of DETD object included, not usable in this version.

  • Loads and market steps with hourly resolution is written to TidsserieData.h5. Constant values goes to {BUSBAR}.ENMD.

0.7.0 (2024.08.08)

  • Added the use of license file. License.

  • Reworked how attributes are defined for the API model.

  • Bugfix: Use globally unique names for solar and wind series.

  • Bugfix: Suppressed some H5-warnings.

0.6.1 (2024.06.25)

  • Bugfix: Expanded data buffer when writing string data to historical and wind/solar H5 data files.

0.6 (2024.06.17)

  • Residual loads and negative residual loads check. Residual loads.

  • Ability to set User-callback for all LTM Core application invokations. set_execute_callback.

  • Bugfix where some LTM Core option environment variables had wrong value.

0.5.2 (2024.06.07)

  • Export of results. Exporting of results.

  • Implemented Wind and Solar. Uncontrollable generation.

  • Explicit handling of environment variables for LTM Core.

  • Sequence numbers for market steps in busbar is incremented per busbar, and not globally.

0.5.1 (2024.05.22)

  • Bugfix when having multiple DCLines (maskenett) fixed.

  • More lenient requirements with energy inflow series.

0.5 (2024.05.22)