Narrow-GA Belgium portfolio scheduling, revision, audit, and operational integration for European BESS workflows.
Project description
euroflex_bess_lab
euroflex_bess_lab is a commercial-grade benchmarking, scheduling, revision, and audit framework for European BESS workflows. It is designed to help an operator or optimizer answer one narrow but real question with a trustworthy public-core tool:
Given the information visible at decision time, how should a Belgium battery portfolio behind a shared POI be scheduled, revised, reconciled, and handed off to an operator?
From TenneT live data to operator handoff: live Dutch inputs, provenance-aware normalization, revision-aware scheduling, and operator-facing exports.
The Belgium canonical path remains the narrow GA promise: forecast inputs turn into checkpoint revisions, asset SoC movement, expected-versus-realized value bridges, and the final operator plus bid-planning handoff artifacts.
This public release is the open-core base for operator-facing benchmarking, scheduling support, revision, audit, and downstream handoff in European BESS workflows. Commercial integration, managed deployment, and market-specific adapters are available separately from the public core.
Install
python -m pip install euroflex-bess-lab
euroflex --version
PyPI installs the CLI and library surface. The promoted configs, canonical examples, notebooks, and full implementation docs live in this repository and on the docs site.
Narrow GA Promise
The first intentionally narrow GA promise is:
- Market: Belgium
- Scope: portfolio / shared POI
- Workflow:
schedule_revision - Base workflow:
da_plus_afrr - Forecast paths:
persistence,csv - Operator path:
validate-config -> validate-data -> backtest -> reconcile -> export-schedule --profile operator -> export-bids --profile bid_planning - Canonical config:
examples/configs/canonical/belgium_full_stack.yaml
Everything else is explicitly tiered:
perfect_foresight: oracle-only benchmark surfacecustom_python: stable integration point for trusted local forecast code- Netherlands: promoted stable full-stack surface, but still outside the narrow Belgium GA promise
- live submission / EMS control: out of scope
flowchart LR
A["Visible inputs at checkpoint<br/>day-ahead, reserve curves, SoC, availability"] --> B["Forecast layer<br/>persistence | csv | custom_python"]
B --> C["Pyomo optimizer<br/>Belgium portfolio + shared POI + locked aFRR commitments"]
C --> D["Operator handoff<br/>schedule exports + bid-planning exports"]
D --> E["Realized settlement<br/>reconcile, update SoC, attribute deltas"]
E --> A
Who This Is For
- BESS owners, operators, and optimizers evaluating Belgium-first scheduling and revision workflows
- flexibility aggregators and VPP teams benchmarking site or portfolio value stacking behind shared constraints
- trading, scheduling, and dispatch support teams that need operator-ready exports and bid-planning handoff
- developers, diligence teams, and revenue modelers benchmarking market-entry assumptions or private forecast models
- internal teams that want a rule-aware execution layer without rebuilding market logic from scratch
Why It Matters
- turns visible public or private forecast inputs into auditable benchmark schedules
- keeps market rules, locked commitments, portfolio constraints, and export discipline explicit
- produces operator-ready schedule and bid-planning artifacts with manifest metadata and reconciliation
- reduces the time and integration cost of rebuilding market-specific BESS workflow logic
- separates forecast IP from deterministic market-execution logic so quantitative teams can focus on forecast alpha
Where It Fits
- a public-core foundation for benchmark, scheduling support, revision, reconciliation, and audit workflows
- suitable for internal evaluation, PoCs, enterprise integration, and operator-facing support tooling
- intended to sit upstream of approval workflows, execution routers, and market-specific submission adapters
- not a turnkey all-market deployment surface without company-specific process and IT integration
5-minute Canonical Run From a Repo Checkout
These flows assume you are running from a clone of this repository, because the promoted configs and notebook assets live under examples/, notebooks/, and docs/.
git clone https://github.com/bozliu/euroflex-bess-lab.git
cd euroflex-bess-lab
Local dl environment
conda env update -f environment.yml
conda activate dl
euroflex validate-config examples/configs/canonical/belgium_full_stack.yaml
euroflex validate-data examples/configs/canonical/belgium_full_stack.yaml
euroflex backtest examples/configs/canonical/belgium_full_stack.yaml --market belgium --workflow schedule_revision
euroflex reconcile artifacts/examples/<run_id> examples/configs/canonical/belgium_full_stack.yaml
euroflex export-schedule artifacts/examples/<run_id> --profile operator
euroflex export-bids artifacts/examples/<run_id> --profile bid_planning
Docker
docker build -t euroflex-bess-lab .
docker run --rm -v "$PWD/artifacts:/app/artifacts" euroflex-bess-lab \
euroflex validate-config examples/configs/canonical/belgium_full_stack.yaml
docker run --rm -v "$PWD/artifacts:/app/artifacts" euroflex-bess-lab \
euroflex backtest examples/configs/canonical/belgium_full_stack.yaml \
--market belgium \
--workflow schedule_revision
Notebook-first
docker compose up notebooks
euroflex batch examples/batches/canonical_belgium_full_stack.yaml
Data Provenance & Sample Datasets
euroflex_bess_lab expects high-fidelity 15-minute market data for credible backtests, revision checkpoints, and operator handoff artifacts.
The examples/data/ directory contains frozen, normalized sample datasets so the quickstart, docs, CI, and public benchmarks stay deterministic without requiring API keys.
- Day-ahead prices: sourced from ENTSO-E Transparency Platform workflows
- Imbalance and reserve benchmark curves: derived from public Elia (Belgium) and TenneT (Netherlands) market publications
Bundled example data is for reproducible examples, tests, docs, and benchmarks. Bundled data is not a live operational feed or settlement-grade statement. Users are responsible for validating licensing and suitability before production use.
See the full Data provenance guide for source/operator detail, raw-vs-derived status, redistribution posture, limitations, and live-data ingestion paths.
What It Is
- A market-rule encoder for Belgium-first BESS portfolio scheduling and revision
- A shared-POI optimizer for multi-battery sites
- A checkpoint-based revision and reconciliation engine
- A human-in-the-loop export layer with
benchmark,operator,bid_planning, andsubmission_candidateprofiles - A local service wrapper and run-registry layer for human-in-the-loop operational integration
- A stable extension point for private forecast code through
custom_python
What It Is Not
- A live trading engine
- A live reserve-submission stack
- An EMS / SCADA controller
- A guarantee of realized market revenue
- A plug-and-play deployment for every market, operator, or energy company workflow
Docs
Start with:
- Quickstart
- Data provenance
- Commercial positioning
- Capability matrix
- Operator runbook
- Execution handoff
- Using TenneT live inputs
- Service API
- Run registry
- Export profiles
- Known limitations
- BYO-ML forecast provider
- Compatibility and deprecation policy
Public example surface
The curated public examples are intentionally small:
examples/configs/canonical/belgium_full_stack.yamlexamples/configs/canonical/netherlands_full_stack.yamlexamples/configs/reserve/belgium_da_plus_afrr_base.yamlexamples/configs/reserve/netherlands_da_plus_afrr_base.yamlexamples/configs/custom/belgium_full_stack_custom_python.yamlexamples/configs/basic/netherlands_da_only_base.yamlexamples/configs/basic/netherlands_da_only_live_inputs.yamlexamples/batches/canonical_belgium_full_stack.yaml
Everything else needed for tests and non-promoted scenarios lives under tests/fixtures/.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file euroflex_bess_lab-1.2.0.tar.gz.
File metadata
- Download URL: euroflex_bess_lab-1.2.0.tar.gz
- Upload date:
- Size: 141.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9abadc768ac5cd4e9cc4cca9420e9bc789417000a2bd1d86d88301e8fe13ca86
|
|
| MD5 |
c7ba4e9cff4123aea40f0ae731be60b7
|
|
| BLAKE2b-256 |
b8042b749ad808dfc268da1b2a1b7f1a02ee7bee256a4233f5959658cf2b47a2
|
File details
Details for the file euroflex_bess_lab-1.2.0-py3-none-any.whl.
File metadata
- Download URL: euroflex_bess_lab-1.2.0-py3-none-any.whl
- Upload date:
- Size: 123.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a333d4a6c3a3d0475074710c8ebe0973c55a07083ab01f240add74c3f5f3b815
|
|
| MD5 |
74446e45c35826c1508d7d7a9afd4d4c
|
|
| BLAKE2b-256 |
030146db738c8c6372890b4252e13c28f7f36bf8e755545183913f587c57383c
|