Skip to content

Smarter commodity-context defaults and Commitment commodity field#2272

Merged
Flix6x merged 168 commits into
mainfrom
feat/commodity-context-defaults
Jul 17, 2026
Merged

Smarter commodity-context defaults and Commitment commodity field#2272
Flix6x merged 168 commits into
mainfrom
feat/commodity-context-defaults

Conversation

@Flix6x

@Flix6x Flix6x commented Jul 8, 2026

Copy link
Copy Markdown
Member

Description

New in-scope features for the multi-commodity flex-context (follow-up to #2172, stacked on #2271) ahead of the v1 release.

Commitment schema commodity field

  • CommitmentSchema gets an undocumented commodity field, defaulting to electricity, for internal bookkeeping — matching a commitment to the device(s) sharing that commodity. Not the documented way for API users to associate a commitment with a commodity; that remains the multi-commodity commodities list, one context per commodity.

Smarter defaults for commodity contexts

A commodity context that omits grid-connection fields now gets sensible defaults instead of raising or leaving the grid unconstrained, based on which fields are explicitly given:

  • Nothing given (e.g. bare {"commodity": "gas"}, no grid connection): zero site-consumption-capacity and zero site-production-capacity as soft constraints, unlimited site-power-capacity.
  • Only consumption-price given: unlimited site-power-capacity and site-consumption-capacity, 0 site-production-capacity.
  • Only production-price given: unlimited site-power-capacity and site-production-capacity, 0 site-consumption-capacity.
  • Only site-consumption-capacity given: unlimited site-power-capacity, that consumption capacity, 0 consumption-price, 0 site-production-capacity (and 0 production-price).
  • Only site-production-capacity given: unlimited site-power-capacity, that production capacity, 0 production-price, 0 site-consumption-capacity (and 0 consumption-price).
  • Only site-power-capacity given: hard constraint at that capacity; site-consumption/production-capacity equal to it; 0 consumption- and production-price.

A relax-constraints: False context that ends up with a smart-defaulted 0 hard capacity now logs a warning, since this can make the schedule infeasible.

Correctness fix (found while implementing the above)

  • A commodity context with no user-given price fields was stamped with a fallback "EUR" currency, which could spuriously trip cross-commodity currency-mismatch checks against a differently-currencied portfolio. Such price-free contexts are now tagged and excluded from the mismatch check; their fallback-currency fields get re-expressed under the portfolio's real currency once it's known (from a top-level price or a sibling commodity context).
  • StorageScheduler.convert_to_commitments now logs a warning when a commitment's commodity matches zero devices (aid for catching typos).

Regression tests

7 parametrized DB-free cases for the 6 smart-default cases (+ a multi-field combination); price-free-context currency handling (top-level price sets currency, sibling context sets currency, nothing given anywhere falls back to EUR, genuine mismatches still 422).

  • Added changelog item in documentation/changelog.rst

How to test

pytest flexmeasures/data/schemas/tests/test_scheduling.py flexmeasures/data/models/planning/tests/test_commitments.py

Related Items

Stacked on #2271; follow-up to #2172; prepares #1946 for release.

Flix6x and others added 30 commits December 5, 2025 16:50
Signed-off-by: F.N. Claessen <felix@seita.nl>
Signed-off-by: F.N. Claessen <felix@seita.nl>
…ontext

Signed-off-by: F.N. Claessen <felix@seita.nl>
…formulation

Signed-off-by: F.N. Claessen <felix@seita.nl>
Signed-off-by: F.N. Claessen <felix@seita.nl>
Signed-off-by: F.N. Claessen <felix@seita.nl>
Signed-off-by: F.N. Claessen <felix@seita.nl>
Signed-off-by: F.N. Claessen <felix@seita.nl>
Signed-off-by: F.N. Claessen <felix@seita.nl>
Signed-off-by: F.N. Claessen <felix@seita.nl>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
…and map them to the respective group id

Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
…chemas

Signed-off-by: Ahmad-Wahid <ahmedwahid16101@gmail.com>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>

# Conflicts:
#	flexmeasures/data/models/planning/storage.py
#	flexmeasures/data/services/scheduling.py

@Flix6x Flix6x left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Self-review.

Comment thread documentation/changelog.rst Outdated
Comment thread flexmeasures/data/schemas/scheduling/__init__.py Outdated
Comment thread flexmeasures/data/schemas/scheduling/__init__.py Outdated
Comment thread flexmeasures/data/schemas/scheduling/__init__.py Outdated
@Flix6x Flix6x self-assigned this Jul 8, 2026
@Flix6x Flix6x added this to the 1.0.0 milestone Jul 8, 2026
Copilot AI and others added 3 commits July 8, 2026 17:29
…2274)

Context:
- PR #2072 added scheduling_result output to StorageScheduler.compute()
  when return_multiple=True, and added _compute_unresolved_targets.
- In single-sensor mode (self.sensor is set), flex_model entries lack a
  "sensor" key, so _compute_unresolved_targets was skipping every device
  and returning empty unresolved/resolved lists.

Changes:
- storage.py: fall back to self.sensor in _compute_unresolved_targets
  when the flex_model entry has no "sensor" key (single-sensor mode)
- test_commitments.py: update schedule-count assertions (+1 for the new
  scheduling_result entry added by PR #2072)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Flix6x <30658763+Flix6x@users.noreply.github.com>
…nto feat/commodity-context-defaults

# Conflicts:
#	documentation/changelog.rst
Base automatically changed from fix/multi-commodity-hardening to main July 8, 2026 18:31
Flix6x added 3 commits July 8, 2026 20:39
…t-defaults

chore: update openapi-specs.json

Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
@Flix6x
Flix6x requested a review from Ahmad-Wahid July 8, 2026 19:27
@Flix6x Flix6x added documentation Improvements or additions to documentation AI Infra labels Jul 8, 2026

@nhoening nhoening left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice that we have this, another improvement to make flex-configuration have less unexplainable failures.
There might be new questions if things default to something, but at least we make it explicit, and this can also be read by LLMs which can hopefully offer useful answers.

Comment thread documentation/features/scheduling.rst Outdated
Comment thread documentation/features/scheduling.rst Outdated
Comment thread documentation/features/scheduling.rst Outdated
Comment thread documentation/features/scheduling.rst Outdated
Comment thread flexmeasures/data/models/planning/tests/test_commitments.py Outdated
Flix6x and others added 2 commits July 10, 2026 20:56
…t-defaults

# Conflicts:
#	.claude/agents/api-backward-compatibility-specialist.md
#	.claude/agents/architecture-domain-specialist.md
#	.claude/agents/coordinator.md
#	.claude/agents/data-time-semantics-specialist.md
#	.claude/agents/documentation-developer-experience-specialist.md
#	.claude/agents/performance-scalability-specialist.md
#	.claude/agents/test-specialist.md
#	.claude/agents/tooling-ci-specialist.md
#	.claude/agents/ui-specialist.md
- Give this PR its own concise changelog entry (pointing at the new
  commodity_context_defaults docs section) instead of only tagging the
  multi-commodity entry.
- Reword the smart-defaults docs per review: prefer 'zero' over '0',
  clarify that zero prices refer to the usage (energy) prices, adopt the
  suggested 'Then, ...' phrasing in the per-case bullets, and state that
  giving all capacity fields is valid (directional capacities soft within
  the hard site-power-capacity limit).
- Drop the redundant test-name prefix from a test docstring.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016MLCUiSdXDqDBmg8GbYp1B
@Flix6x

Flix6x commented Jul 10, 2026

Copy link
Copy Markdown
Member Author

Interaction note with #2279: the smart defaults fill a zero consumption-price into price-free commodity contexts, which defeats #2279's internal-node detection (a priceless commodity like a steam network should become a hard balance node). Tested fix on a local merge of both branches: record prices_are_defaulted in fill_grid_connection_defaults (this PR's code) and consume it in _prepare (#2279's code). I'll open the follow-up PR once both have landed; no change needed here.

🤖 Generated with Claude Code

@Flix6x
Flix6x merged commit 8b4e81a into main Jul 17, 2026
13 checks passed
@Flix6x
Flix6x deleted the feat/commodity-context-defaults branch July 17, 2026 14:37
@Flix6x Flix6x removed the AI Infra label Jul 17, 2026
Flix6x added a commit that referenced this pull request Jul 17, 2026
…efaults

After merging main's #2272 smart commodity-context defaults, a price-free
commodity context (e.g. a bare {"commodity": "steam"}) gets a
smart-defaulted zero consumption-price, which defeated #2289's
priceless-commodity internal-node detection: the steam balance group
vanished and the CHP dispatched incorrectly through the StorageScheduler.

Record durably on each commodity context whether any price field was
user-given (prices_are_defaulted) and treat a context whose prices were
all defaulted (and which uses no price sensors) as an internal node.
Ports the combo-branch fix upstream now that #2272 has landed on main.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016MLCUiSdXDqDBmg8GbYp1B
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation Scheduling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants