Derive Pot's L/Td from the Sud doc instead of a fixed server default

Sud now parses top-level L/Td fields from sude/*.json (defaulting to 0.2/30,
matching the old hardcoded server constants), and derive_plant_params()
returns them alongside M/C - constant for the whole brew, unlike M/C which
vary per step with grain/water mass. All sude/*.json docs gain explicit
L/Td fields.

Callers (tasks/sud.py, SudForecastEstimator, demo_sud.py) switch from the
narrow set_thermal_params(M, C)/set_model_params(M, C) to the full
set_plant_params(params)/set_model_plant_params(params), since
derive_plant_params() now always returns all four keys; both narrow setters
are removed as dead code.

Caught along the way: Pot.set_plant_params() unconditionally rebuilt the
Delay ring buffer, which was harmless when only ever called once at
construction - but now running on every Sud step change, it was wiping
in-flight delayed power at each step boundary. Fixed to only rebuild when
Td actually changes; verified this restores the exact original forecast
result for sud_0010.json.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DkkuG48uHFCGKe6dPSERFk
This commit is contained in:
2026-06-22 18:45:07 +02:00
co-authored by Claude Sonnet 4.6
parent 96fe7ce90c
commit f1688d3c71
12 changed files with 59 additions and 41 deletions
+2
View File
@@ -3,6 +3,8 @@
"Description": "Small, fast schedule for exercising the GUI (load/start/pause/stop/restart) without waiting through a real brew",
"pot_mass": 5.96,
"pot_material": "Edelstahl 18/10",
"L": 0.2,
"Td": 30,
"default": {
"step": {
"descr": "Put description here",
+2
View File
@@ -3,6 +3,8 @@
"Description": "Small, fast schedule for exercising the GUI (load/start/pause/stop/restart) without waiting through a real brew",
"pot_mass": 5.96,
"pot_material": "Edelstahl 18/10",
"L": 0.2,
"Td": 30,
"default": {
"step": {
"descr": "Put description here",
+2
View File
@@ -3,6 +3,8 @@
"Description": "Rotfraenkisch, Dunkles Lager",
"pot_mass": 5.96,
"pot_material": "Edelstahl 18/10",
"L": 0.2,
"Td": 30,
"default": {
"step": {
"descr": "Put description here",
+2
View File
@@ -3,6 +3,8 @@
"Description": "Rotfraenkisch, Dunkles Lager",
"pot_mass": 5.96,
"pot_material": "Edelstahl 18/10",
"L": 0.2,
"Td": 30,
"default": {
"step": {
"descr": "Put description here",
+4 -2
View File
@@ -3,13 +3,15 @@
"Description": "Bavarian, Dunkles",
"pot_mass": 5.96,
"pot_material": "Edelstahl 18/10",
"L": 0.2,
"Td": 30,
"default": {
"step": {
"descr": "Put description here",
"user_message": "Put user message here",
"user_wait_for_continue": false,
"grain_mass": 5.21,
"water_mass": 22,
"grain_mass": 2.51,
"water_mass": 10,
"temperature": 0,
"ramp": {
"rate": 1.0,