Files
EOS/CHANGELOG.md
T

518 lines
24 KiB
Markdown
Raw Normal View History

# Changelog
All notable changes to the akkudoktoreos project will be documented in this file.
2026-03-17 18:40:21 +01:00
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Unreleased
### Added
- Add `FeedInTariffAkkudoktor`, using raw hourly Akkudoktor/aWATTar day-ahead market prices as
feed-in tariff data without import charges or VAT. Quarter-hour optimization holds each hourly
value constant for four slots.
- Add `FeedInTariffTibber`, using Tibber's native `QUARTER_HOURLY` spot-price component as a
strict 15-minute feed-in tariff. Hourly API responses are rejected instead of expanded.
- Flexible consumers (home appliances): schedule any number of consumers via
`devices.home_appliances`, each with a unique `device_id`. Every consumer defines its
load **either** as an explicit power profile (`load_profile_power_w` at
`load_profile_interval_seconds`, energy-preservingly resampled onto the optimization
slot grid, including the 15-minute interval and non-integer ratios such as 10→15 min)
**or** as the flat `consumption_wh` + `duration_h` fallback. A `schedule_mode` selects
`ONCE` (a single run in the horizon) or `DAILY` (one run per local calendar day that
still has a feasible full run). Allowed start times honour `time_windows` (including
weekday/date restrictions) and the horizon; ONCE without any valid start is rejected.
Results are reported per device (`result.home_appliance_energy_wh`, `appliance_starts`,
per-device solution columns and `DDBCInstruction`s emitted only on RUN/OFF transitions).
- EV Bug (wrong output in genetic.py / no senseful results)
- Direktvermarktung active / Battery discharge into grid (new state / action battery_grid_export_allowed) + (new simulation output Feed_in_tariff)
- New PV forecast providers giving operators more cloud forecast sources to choose from in
addition to Akkudoktor, VRM and Import:
- `PVForecastPVNode` — native 15-minute forecasts from the pvnode.com API.
- `PVForecastForecastSolar` — forecasts from the free Forecast.Solar API.
- `PVForecastSolcast` — forecasts from the Solcast rooftop-site API. (THX to @chloepriceless)
- 15-minute optimization interval for the genetic optimizer. `optimization.interval`
now accepts 900 (15 min) in addition to the default 3600 (1 hour), letting the
optimizer schedule on a quarter-hour grid for 15-minute dynamic electricity
tariffs. Device power caps and the solution/plan serializers are slot-aware; the
default 3600 s interval keeps the previous hourly behaviour. The new sub-hourly PV
providers (pvnode, Forecast.Solar, Solcast) feed their native resolution straight
into the quarter-hour grid.
- Legacy hourly API inputs are normalized onto the quarter-hour grid: PV/load energy
is distributed across four slots, prices are held constant, and hourly warm-start
solutions are expanded to slot controls. Native slot arrays are preserved and
ambiguous lengths are rejected.
- Home-appliance (flexible consumer) scheduling now runs on the same slot grid and
supports the 15-minute interval (see the flexible consumers entry below).
- The Tibber electricity price provider now requests native 15-minute exchange prices
(`priceInfoRange(resolution: QUARTER_HOURLY)`) and stores them at their native
resolution, so both the hourly and the 15-minute optimizer are fed the correct
grid. The seasonal price extrapolation is resolution-agnostic and stays identical
at the default hourly resolution.
- Separate battery economics into two independent settings: battery
`levelized_cost_of_storage_kwh` is now charged once on delivered DC energy, while
`optimization.terminal_value_euro_per_kwh` values usable battery energy left at the end of the
optimization horizon. LCOS applies to both local battery supply and battery-to-grid export and is
included in hourly and total costs.
- Model direct PV-to-load consumption probabilistically from the bundled conditional minute-load
table. The expected direct flow is used consistently for PV bypass, residual load, battery
charging, and grid export on hourly and 15-minute optimization grids.
2026-07-15 09:21:02 +02:00
- Add a dynamic `FeedInTariffEnergyCharts` forecast for direct marketing. Published Energy-Charts
day-ahead market prices are retained at their native hourly or quarter-hourly resolution and
missing slots at the end of the optimization horizon are extended with weekly or daily seasonal
ETS forecasts. A median fallback is used when the available history is too short for ETS.
### Changed
2026-07-16 09:56:50 +02:00
- Seed genetic optimization runs with ten exact warm-start copies, twenty locally mutated
warm-start neighbours, and diverse domain-informed battery, direct-marketing, EV, and flexible
appliance schedules to improve early convergence without discarding the previous solution.
- `max_home_appliances` is now purely an upper bound. No demo appliance is created when
no `home_appliances` are configured, and the number is no longer used as an on/off switch.
### Deprecated
- The single-appliance genetic optimization input `dishwasher` is deprecated in favour of
the `home_appliances` list; a lone `dishwasher` is mapped to a one-element list, and
setting both at once is rejected. In the solution, `washingstart` (start slot of a single
hourly appliance) and `result.Home_appliance_wh_per_hour` (aggregate over all appliances)
are deprecated in favour of `appliance_starts` and `result.home_appliance_energy_wh`.
### Fixed
2026-07-16 09:56:50 +02:00
- Re-simulate genetic candidates after removing EV charging genes from slots that begin at full
SoC, keeping the repaired genome and its assigned fitness consistent.
- FeedInTariffEnergyCharts no longer aborts the whole prediction/optimization when the
Energy-Charts API is briefly unreachable: transient timeouts/connection errors are
retried (with a (connect, read) timeout of (5, 60) s), and if a fetch still fails while
historical data exists, the existing history is kept and the remaining slots are
extrapolated via ETS instead of failing. A genuine cold start (no data at all) still
fails.
- The deprecated `/gesamtlast` endpoint no longer forces a full provider refresh on every
call. Forcing bypassed the provider caches and hammered external APIs, so a single flaky
provider could 404 the whole load prediction. It now defaults to a cache-aware update and
accepts an optional `force_update` flag in the request body for callers that still want
to force.
2026-03-17 18:40:21 +01:00
## 0.3.0 (2026-03-17)
Akkudoktor-EOS can now be run as Home Assistant add-on and standalone.
As Home Assistant add-on EOS uses ingress to fully integrate the EOSdash dashboard
in Home Assistant.
2026-03-17 18:40:21 +01:00
Adapters for Home Assistant and NodeRed integration are added. These adapters
provide a simplified interface to these HEMS besides the standard REST interface.
The prediction and measurement data can now be backed by a database. The database allows
to keep historic prediction data and measurement data for long time without keeping
it in memory. The database supports backend selection, compression, incremental data load,
automatic data saving to storage, automatic vacuum and compaction. Two database backends
are integrated and can be configured, LMDB and SQLight3.
2026-03-17 18:40:21 +01:00
New prediction providers allow to access OpenMeteo weather data and to define fixed
electricity prices for configurable time windows.
An anoying bug in the genetic algorithm that created unfeasable battery charge and
discharge amounts is now hopefully fixed.
In addition, bugs were fixed and new features were added.
### Feat
2026-03-17 18:40:21 +01:00
- add inverter AC/DC efficiency and break-even penalty
- add database support for measurements and historic prediction data.
The prediction and measurement data can now be backed by a database. The database allows
to keep historic prediction data and measurement data for long time without keeping
it in memory. Two database backends are integrated and can be configured, LMDB and SQLight3.
- add adapters for integrations
Adapters for Home Assistant and NodeRED integration are added.
Akkudoktor-EOS can now be run as Home Assistant add-on and standalone.
As Home Assistant add-on EOS uses ingress to fully integrate the EOSdash dashboard
in Home Assistant.
- add make repeated task function
make_repeated_task allows to wrap a function to be repeated cyclically.
- allow eos to be started with root permissions and drop priviledges
Home assistant starts all add-ons with root permissions. Eos now drops
root permissions if an applicable user is defined by paramter --run_as_user.
The docker image defines the user eos to be used.
2026-03-17 18:40:21 +01:00
- make home assistant add-on run optimization by default
When running as Home Assistant add-on the only viable usage is running with
cyclic optimization. Make this the default to als propvide a better experience
for first time users. The optimization will start with demo data, which also
helps to configure Akkudoktor-EOS to the personal usage.
- make eos supervise and monitor EOSdash
Eos now not only starts EOSdash but also monitors EOSdash during runtime
and restarts EOSdash on fault. EOSdash logging is captured by EOS
and forwarded to the EOS log to provide better visibility.
2026-03-17 18:40:21 +01:00
- add openmeteo weather provider
- add fixed electricity prediction with time window support
- add duration to string conversion
Make to_duration to also return the duration as string on request.
### Fixed
2026-03-17 18:40:21 +01:00
- genetic optimizer charge rates and soc accuracy
- energy charts bidding zone in request
- prevent exception when load prediction data is missing
- eosdash startup
Ensure that EOSdash is only started after EOS configuration is available.
- config eos test setup
Make the config_eos fixture generate a new instance of the config_eos singleton.
Use correct env names to setup data folder path.
- startup with no config
Make cache and measurements complain about missing data path configuration but
do not bail out.
- soc data preparation and usage for genetic optimization.
Search for soc measurments 48 hours around the optimization start time.
Only clamp soc to maximum in battery device simulation.
- dashboard bailout on zero value solution display
Do not use zero values to calculate the chart values adjustment for display.
- openapi generation script
Make the script also replace data_folder_path and data_output_path to hide
real (test) environment pathes.
- development version scheme
The development versioning scheme is adaptet to fit to docker and
home assistant expectations. The new scheme is x.y.z and x.y.z.dev'date''hash'.
Hash is only digits as expected by home assistant. Development version
is appended by .dev as expected by docker.
- use mean value in interval on resampling for array
When downsampling data use the mean value of all values within the new
sampling interval.
- default battery ev soc and appliance wh
Make the genetic simulation return default values for the
battery SoC, electric vehicle SoC and appliance load if these
assets are not used.
- import json string
Strip outer quotes from JSON strings on import to be compliant to json.loads()
expectation.
- default interval definition for import data
Default interval must be defined in lowercase human definition to
be accepted by pendulum.
- clearoutside schema change
### Chore
- removed index based data sequence access
Index based data sequence access does not make sense as the sequence can be backed
by the database. The sequence is now purely time series data.
- refactor eos startup to avoid module import startup
Avoid module import initialisation expecially of the EOS configuration.
Config mutation, singleton initialization, logging setup, argparse parsing,
background task definitions depending on config and environment-dependent behavior
is now done at function startup.
- introduce retention manager
A single long-running background task that owns the scheduling of all periodic
server-maintenance jobs (cache cleanup, DB autosave, …)
2026-03-17 18:40:21 +01:00
- guard against visualization errors in genetic optimization
- improve provider update error handling and add VRM provider settings validation
- canonicalize timezone name for UTC
Timezone names that are semantically identical to UTC are canonicalized to UTC.
- extend config file migration for default value handling
- extend datetime util test cases
- make version test check for untracked files
Check for files that are not tracked by git. Version calculation will be
wrong if these files will not be commited.
- bump pandas to 3.0.0
Pandas 3.0 now performs inference on the appropriate resolution (a.k.a. unit)
for the output dtype which may become datetime64[us] (before it was ns). Also
numeric dtype detection is now more strict which needs a different detection for
numerics.
- bump pydantic-settings to 2.12.0
pydantic-settings 2.12.0 under pytest creates a different behaviour. The tests
were adapted and a workaround was introduced. Also ConfigEOS was adapted
to allow for fine grain initialization control to be able to switch
off certain settings such as file settings during test.
- remove sci learn kit from dependencies
The sci learn kit is not strictly necessary as long as we have scipy.
- add documentation mode guarding for sphinx autosummary
Sphinx autosummary excecutes functions. Prevent exceptions in case of pure doc
mode.
- adapt docker-build CI workflow to stricter GitHub handling
2026-03-17 18:40:21 +01:00
- add CodeQL analysis workflow to CI
- Use info logging to report missing optimization parameters
In parameter preparation for automatic optimization an error was logged for missing paramters.
Log is now down using the info level.
- make EOSdash use the EOS data directory for file import/ export
EOSdash use the EOS data directory for file import/ export by default.
This allows to use the configuration import/ export function also
within docker images.
- improve EOSdash config tab display
Improve display of JSON code and add more forms for config value update.
- make docker image file system layout similar to home assistant
Only use /data directory for persistent data. This is handled as a
docker volume. The /data volume is mapped to ~/.local/share/net.akkudoktor.eos
if using docker compose.
- add home assistant add-on development environment
Add VSCode devcontainer and task definition for home assistant add-on
development.
- Use uv to manage the virtual environment for development.
This enormously increases dependency updates.
- improve documentation
2025-11-09 09:07:04 +01:00
## 0.2.0 (2025-11-09)
2025-11-09 09:07:04 +01:00
The most important new feature is **automatic optimization**.
EOS can now independently perform optimization at regular intervals.
This is based on the configured system parameters and forecasts, and also uses supplied
measurement data, such as the current battery SoC.
The result is an energy-management plan as well as the optimization output.
The existing optimization interface using `POST /optimize` remains available and can still
be used as before.
2025-11-09 09:07:04 +01:00
In addition, bugs were fixed and new features were added:
- Automatic optimization creates a **default configuration** if none is provided.
This is intended to make it easier to create a custom configuration by adapting the default.
- The parameters of the genetic optimization algorithm (number of generations, etc.) are now
configurable.
- For home appliances, start windows can now be specified (experimental).
- Configuration files from previous versions are converted to the current format on first launch.
- There are now measurement keys that are permanently assigned to a specific device simulation.
This simplifies providing measurement values for device simulations (e.g. battery SoC).
- The infrastructure and first applications for **feed-in tariff forecasting**
(currently only fixed tariffs) are now integrated.
- EOSdash has been expanded with new tabs for displaying the **energy-management plan**
and **predictions**.
- The documentation has been updated and expanded in many places.
### Feat
- Energy-management plan generation based on S2 standard instructions
- Feed-in-tariff prediction support (incl. tests & docs)
- `LoadAkkudoktorAdjusted` load prediction variant
- Standardized measurement keys for battery/EV SoC
- Measurement keys configurable via EOS configuration
- Setup default device configuration for automatic optimization
- Health endpoints show version + last optimization timestamps
- Configuration of genetic algorithm parameters
- Configuration options for home-appliance time windows
- Mitigation of legacy configuration
- Config backup enhancements:
- Timestamp-based backup IDs
- API to list backups
- API to revert to a specific backup
- EOSdash Admin tab integration
- Pendulum date types via `pydantic_extra_types.pendulum_dt`
- `Time`, `TimeWindow`, `TimeWindowSequence`, and `to_time` helpers in `datetimeutil`
- Extended `DataRecord` with configurable field-like semantics
- EOSdash: Solution view now displays genetic optimization results and aggregated totals
- EOSdash UI:
- Plan tab
- Predictions tab
- Cache management in Admin tab
- About tab
- Pydantic merge model tests
- Developer profiling entry in Makefile
- Changelog & docs updated for commitizen release flow
- Developer documentation updated
- Improved install & development documentation
### Changed
- Battery simulation
- Performance improvements
- Charge + start times now reflect realistic simulation
- Appliance simulation:
- Time windows may roll over to next day
- Revised load prediction by splitting original `LoadAkkudoktor` into:
- `LoadAkkudoktor`
- `LoadAkkudoktorAdjusted`
### Fixed
- Correct URL/path for Akkudoktor forum in README
- Automatic optimization:
- Reuses previous start solution
- Interval execution + locking + new endpoints
- Properly loads required data
- EV charge-rate migration for proper availability
- Genetic common settings consistently available
- Config markdown generation
- Recognize environment variables on EOS server startup
- Remove `0.0.0.0 → localhost` translation on Windows
- Allow hostnames as well as IPs
- Access Pydantic model fields via class instead of instance
- Down-sampling in `key_to_array`
- `/v1/admin/cache/clear` clears all cache files; added `/clear-expired`
- Use `tzfpy` instead of timezonefinder for more accurate EU timezones
- Explicit provider settings in config instead of union
2025-10-28 02:50:31 +01:00
- ClearOutside weather prediction irradiance calculation
2025-11-09 09:07:04 +01:00
- Test config file priority without `config_eos` fixture
- Complete optimization sample-request documentation
- Replace gitlint with commitizen
- Synchronize pre-commit config with real dependencies
- Add missing `babel` to requirements
- Fix documentation, tests, and implementation around optimization + predictions
2025-11-09 09:07:04 +01:00
### Chore
2025-10-28 02:50:31 +01:00
2025-11-09 09:07:04 +01:00
- Use memory cache for inverter interpolation
- Refactor genetic modules (split config, remove device singleton)
- Rename memory cache to `CacheEnergyManagementStore`
- Use class properties for config/EMS/prediction mixins
- Skip matplotlib debug logs
- Auto-sync Bokeh JS CDN version
- Rename `hello.py``about.py` in EOSdash
- Remove EOSdash demo page
- Split server test from system test
- Move doc utils to `generate_config_md.py`
- Improve documentation for pydantic merge models
- Remove pendulum warning from README
- Drop GitHub Discussions from contributing docs
- Rename or reorganize files / classes during refactors
2025-10-28 02:50:31 +01:00
2025-11-09 09:07:04 +01:00
### BREAKING CHANGES
2025-10-28 02:50:31 +01:00
2025-11-09 09:07:04 +01:00
EOS configuration + v1 API have changed:
- `available_charge_rates_percent` removed → replaced by `charge_rate`
- Optimization parameter `hours` → renamed to `horizon_hours`
- Device config must explicitly list devices + properties
- Prediction providers now explicit (instead of union)
- Measurement keys provided as lists
- Feed-in-tariff providers must be explicitly configured
- `/v1/measurement/loadxxx` endpoints removed → use generic measurement endpoints
- `/v1/admin/cache/clear` now clears **all*- cache files;
`/v1/admin/cache/clear-expired` only clears expired entries
2025-10-28 02:50:31 +01:00
## v0.1.0 (2025-09-30)
### Feat
- added Changelog for 0.0.0 and 0.1.0
## v0.0.0 (2025-09-30)
This version represents one year of development of EOS (Energy Optimization System). From this point forward, release management will be introduced.
2025-10-28 02:50:31 +01:00
### Feat
#### Core Features
2025-10-28 02:50:31 +01:00
- energy Management System (EMS) with battery optimization
- PV (Photovoltaic) forecast integration with multiple providers
2025-10-28 02:50:31 +01:00
- load prediction and forecasting capabilities
- electricity price integration
- VRM API integration for load and PV forecasting
2025-10-28 02:50:31 +01:00
- battery State of Charge (SoC) prediction and optimization
- inverter class with AC/DC charging logic
- electric vehicle (EV) charging optimization with configurable currents
- home appliance scheduling optimization
- horizon validation for shading calculations
#### API & Server
2025-10-28 02:50:31 +01:00
- migration from Flask to FastAPI
- RESTful API with comprehensive endpoints
- EOSdash web interface for configuration and visualization
- Docker support with multi-architecture builds
2025-10-28 02:50:31 +01:00
- web-based visualization with interactive charts
- OpenAPI/Swagger documentation
2025-10-28 02:50:31 +01:00
- configurable server settings (port, host)
#### Configuration & Data Management
- JSON-based configuration system with nested support
2025-10-28 02:50:31 +01:00
- configuration validation with Pydantic
- device registry for managing multiple devices
- persistent caching for predictions and prices
- manual prediction updates
- timezone support with automatic detection
- configurable VAT rates for electricity prices
#### Optimization
- DEAP-based genetic algorithm optimization
2025-10-28 02:50:31 +01:00
- multi-objective optimization (cost, battery usage, self-consumption)
- 48-hour prediction and optimization window
- AC/DC charging decision optimization
2025-10-28 02:50:31 +01:00
- discharge hour optimization
- start solution enforcement
- fitness visualization with violin plots
- self-consumption probability interpolator
#### Testing & Quality
2025-10-28 02:50:31 +01:00
- comprehensive test suite with pytest
- unit tests for major components (EMS, battery, inverter, load, optimization)
- integration tests for server endpoints
- pre-commit hooks for code quality
- type checking with mypy
- code formatting with ruff and isort
- markdown linting
#### Documentation
2025-10-28 02:50:31 +01:00
- conceptual documentation
- API documentation with Sphinx
- ReadTheDocs integration
- Docker setup instructions
2025-10-28 02:50:31 +01:00
- contributing guidelines
- English README translation
#### Providers & Integrations
- PVForecast.Akkudoktor provider
- BrightSky weather provider
- ClearOutside weather provider
2025-10-28 02:50:31 +01:00
- electricity price provider
2025-10-28 02:50:31 +01:00
### Refactor
- optimized Inverter class for improved SCR calculation performance
- improved caching mechanisms for better performance
- enhanced visualization with proper timestamp handling
- updated dependency management with automatic Dependabot updates
- restructured code into logical submodules
- package directory structure reorganization
- improved error handling and logging
- Windows compatibility improvements
2025-10-28 02:50:31 +01:00
### Fix
- cross-site scripting (XSS) vulnerabilities
- ReDoS vulnerability in duration parsing
2025-10-28 02:50:31 +01:00
- timezone and daylight saving time handling
- BrightSky provider with None humidity data
2025-10-28 02:50:31 +01:00
- negative values in load mean adjusted calculations
- SoC calculation bugs
- AC charge efficiency in price calculations
2025-10-28 02:50:31 +01:00
- optimization timing bugs
- Docker BuildKit compatibility
2025-10-28 02:50:31 +01:00
- float value handling in user horizon configuration
- circular runtime import issues
- load simulation data return issues
- multiple optimization-related bugs
2025-10-28 02:50:31 +01:00
### Build
2025-10-28 02:50:31 +01:00
- Python version requirement updated to 3.10+
- added Bandit security checks
- improved credential management with environment variables
#### Dependencies
Major dependencies included in this release:
- FastAPI 0.115.14
- Pydantic 2.11.9
- NumPy 2.3.3
- Pandas 2.3.2
- Scikit-learn 1.7.2
- Uvicorn 0.36.0
- Bokeh 3.8.0
- Matplotlib 3.10.6
- PVLib 0.13.1
- Python-FastHTML 0.12.29
2025-10-28 02:50:31 +01:00
### Notes
#### Development Notes
This version encompasses all development from the initial commit (February 16, 2024) through September 29, 2025. The project evolved from a basic energy optimization concept to a comprehensive energy management system with:
- 698+ commits
2025-10-28 02:50:31 +01:00
- multiple contributor involvement
- continuous integration/deployment setup
- automated dependency updates
- comprehensive testing infrastructure
2025-10-28 02:50:31 +01:00
#### Migration Notes
As this is the initial versioned release, no migration is required. Future releases will include migration guides as needed.