All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
DWDClientfor fetching weather data directly from the DWD Open Data API, replacing thewetterdienstdependency.DWDClientmulti-station merging, quality ranking, completeness report, andfor_pvlibadapter for seamless pvlib integration.HeatingRodcomponent for electrical resistance heating simulation.UserProfile.get_location_calibrated_consumerfactor()classmethod: fetches a full reference year of DWD daily observation data for a given lat/lon and computes the SigLinDe consumerfactor from station-specific temperatures, replacing the generic 2015 CSV calibration. Result is cached for 24 h byDWDClient.consumerfactorparameter onUserProfile.__init__to inject a pre-computed value and skip the automatic per-instance recalculation.Operator.assign_assets_to_busesandOperator.build_timeseries_netmethods.Environment.get_observationsnow forwardsresolutionand additional DWD kwargs.- Proper pytest test suite under
tests/with integration tests that fetch live DWD data (@pytest.mark.integration). DWDClientexported fromvpplib.__init__.- Old ad-hoc test scripts preserved as usage examples in
examples/.
- Switched
tqdmimports totqdm.autofor correct rendering in both terminals and notebooks; added descriptivedesc=labels to all progress bars. - Unified timestamp handling across all components:
value_for_timestamp()andobservations_for_timestamp()now acceptint,str,datetime.datetime, andpd.Timestampviaisinstance()dispatch. Removed reliance on the privatepd._libs.tslibs.timestamps.Timestamptype. - Replaced all
type(x) == Ycomparisons withisinstance()throughout the codebase. - Converted informal
Info / ----docstring headers to NumPy-style across all component modules. - Removed legacy
# -*- coding: utf-8 -*-file headers from all modules. - Translated remaining German comments and TODOs to English.
- Alphabetically sorted imports in
__init__.py. - All example demos migrated from 2015 CSV files to live DWD observation data.
demo_combined_heat_and_power.pyMOSMIX section usesUserProfile.get_location_calibrated_consumerfactor()for station-specific demand scaling instead of the generic 2015-CSV-derived value.
wetterdienstandmarshmallowdependencies (replaced byDWDClientusingrequests,lxml, andpytz).
tqdmprogress bars no longer produce multi-line output in Jupyter notebooks.operator.pyno longer casts timestamps tostrbefore passing tovalue_for_timestamp().TypeError: Cannot compare tz-naive and tz-aware timestampswhen runningCombinedHeatAndPower,HeatPump, orHeatingRodwith a MOSMIX environment (use_timezone_aware_time_index=True):last_ramp_up/last_ramp_downsentinels now initialize fromtimeseries.index[0]instead ofthermal_energy_demand.index[0].KeyErrorinThermalEnergyStorage.operate_storagewhen indexing with tz-aware MOSMIX data: all three thermal generator components now strip timezone info from the demand index at construction time.UserProfile.get_consumerfactor()inflating demand ~100× for short MOSMIX forecast windows: recalculation is now skipped whenself.consumerfactoris already set.- MOSMIX simulation loop in
demo_combined_heat_and_power.pyraisingKeyErrornear the end of the horizon: loop now iterates overthermal_energy_demand.index. - Tz-naive/tz-aware mismatch in
HeatPumpMOSMIX COP calculation. Environmentquality DataFrame initialized with float dtype to silence pandasFutureWarning.PySAMBatteryStateful.prepare_time_seriesandHydrogen.prepare_time_seriesnow iterate overresidual_load.indexto avoid index errors.
- Lost in progress ;)
- Optimized requirements.txt and setup.py dependencies
- Removed unnecessary dependencies that were causing installation issues
- Added specific version requirements for wetterdienst (0.89.0) and marshmallow (3.20.1) to ensure compatibility
- Added missing dependencies: pandas, numpy, and polars
- Installation failures on non-Windows platforms by removing platform-specific dependencies
- Compatibility issues with newer versions of wetterdienst
Initial public release.