The optimizer treated the end of `optimization.horizon_hours` as the end of the world: energy left in the battery there was worth a single configured price per kWh, so it either dumped the battery into the last hours or hoarded it, depending on that one number. The horizon is now two spans. `horizon_hours` still receives every control command. The new `optimization.tail_horizon_hours` (default 48 h) is a pure lookahead that never produces a command. In AUTO terminal-value mode a deterministic dynamic program solves that tail backwards on a 101-point SoC grid using the production battery and inverter models - SoC bounds, power caps, conversion losses, configured charge and export rates, direct-marketing permission and LCOS on delivered DC energy - and the existing AUTO proxy supplies the continuation value at the tail end. Genetic fitness reads the resulting curve. `tail_horizon_hours: 0` restores the plain proxy at the control end, FIXED is unchanged. The forecast budget is reported, never enforced by refusal: a tail that does not fit is shortened to what the forecast covers and reported as `effective_tail_hours`, and a control horizon that does not fit is warned about at configuration time and rejected by the optimizer at run time, which knows which series ran out. `prediction.hours` defaults to 72 so the new defaults fit out of the box; existing shorter configurations keep starting. Control arrays and warm-start genomes now begin at the run timestamp rather than midnight, flagged by `controls_start_at_now` so the adapters still read older solutions. `forecast_interval_seconds` declares the resolution of shortened native quarter-hour inputs. Required forecasts are no longer silently replaced by demo providers. A missing PV, price, load, feed-in or weather forecast used to rewrite the configured provider and retry, so a run could quietly optimize against invented data. Missing values now stay missing, and provider values are held only within their own source interval instead of being extended indefinitely. Also fixes a config update that could leave EOS half-updated: the merged candidate is validated before the singleton is reinitialized. Four provider tests that hard-coded the old 48 h prediction default are rewritten to derive their expectations from the configured horizon.
Build optimized energy management plans for your home automation
AkkudoktorEOS is a comprehensive solution for simulating and optimizing energy systems based on renewable sources. Optimize your photovoltaic systems, battery storage, load management, and electric vehicles while considering real-time electricity pricing.
Why use AkkudoktorEOS?
AkkudoktorEOS can be used to build energy management plans that are optimized for your specific setup of PV system, battery, electric vehicle, household load and electricity pricing. It can be integrated into home automation systems such as NodeRED, Home Assistant, EVCC.
🏘️ Community
We are an open-source community-driven project and we love to hear from you. Here are some ways to get involved:
-
GitHub Issue Tracker: discuss ideas and features, and report bugs.
-
Akkudoktor Forum: get direct suppport from the community.
What do people build with AkkudoktorEOS
The community uses AkkudoktorEOS to minimize grid energy consumption and to maximize the revenue from grid energy feed in with their home automation system.
- Andreas Schmitz, the Akkudoktor, uses EOS integrated in his NodeRED home automation system for OpenSource Energieoptimierung.
- Jörg, meintechblog, uses EOS for day-ahead optimization for time-variable energy prices. See: So installiere ich EOS von Andreas Schmitz
Why not use AkkudoktorEOS?
AkkudoktorEOS does not control your home automation assets. It must be integrated into a home automation system. If you do not use a home automation system or you feel uncomfortable with the configuration effort needed for the integration you should better use other solutions.
Quick Start
Run EOS with Docker (access dashboard at http://localhost:8504):
docker run -d \
--name akkudoktoreos \
-p 8503:8503 \
-p 8504:8504 \
-e OPENBLAS_NUM_THREADS=1 \
-e OMP_NUM_THREADS=1 \
-e MKL_NUM_THREADS=1 \
-e EOS_SERVER__HOST=0.0.0.0 \
-e EOS_SERVER__EOSDASH_HOST=0.0.0.0 \
-e EOS_SERVER__EOSDASH_PORT=8504 \
--ulimit nproc=65535:65535 \
--ulimit nofile=65535:65535 \
--security-opt seccomp=unconfined \
akkudoktor/eos:latest
System Requirements
- Python: 3.11 or higher
- Architecture: amd64, aarch64 (armv8)
- OS: Linux, Windows, macOS
Note
: Other architectures (armv6, armv7) require manual compilation of dependencies with Rust and GCC.
Installation
Home Assistant add-on
To install the Akkudoktor-EOS add-on in Home Assistant:
-
Add the repository URL:
In Home Assistant, go to:
Settings → Add-ons → Add-on Store → ⋮ (top-right menu) → Repositoriesand enter the URL of this Git repository:
https://github.com/Akkudoktor-EOS/EOS -
Install the add-on:
After adding the repository, the add-on will appear in the Add-on Store. Click Install.
-
Start the add-on:
Once installed, click Start in the add-on panel.
-
Access the dashboard:
Click Open Web UI in the add-on panel.
-
Configure EOS (optional): In the dashboard, go to:
Config
Docker (Recommended)
docker pull akkudoktor/eos:latest
docker compose up -d
Access the API at http://localhost:8503 (docs at http://localhost:8503/docs)
From Source
git clone https://github.com/Akkudoktor-EOS/EOS.git
cd EOS
Linux:
python -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/pip install -e .
.venv/bin/python -m akkudoktoreos.server.eos
Windows:
python -m venv .venv
.venv\Scripts\pip install -r requirements.txt
.venv\Scripts\pip install -e .
.venv\Scripts\python -m akkudoktoreos.server.eos
Configuration
EOS uses EOS.config.json for configuration. If the file doesn't exist, a default configuration is
created automatically.
Custom Configuration Directory
export EOS_DIR=/path/to/your/config
Configuration Methods
- EOSdash (Recommended) - Web interface at
http://localhost:8504 - Manual - Edit
EOS.config.jsondirectly - API - Use the Server API
See the documentation for all configuration options.
Port Configuration
Default ports: 8503 (API), 8504 (Dashboard)
If running on shared systems (e.g., Synology NAS), these ports may conflict with system services. Reconfigure port mappings as needed:
docker run -p 8505:8503 -p 8506:8504 ...
API Documentation
Interactive API docs available at:
- Swagger UI:
http://localhost:8503/docs - OpenAPI Spec: View Online
Resources
Contributing
We welcome contributions! See CONTRIBUTING for guidelines.
License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

