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
118 lines
1.9 KiB
JSON
118 lines
1.9 KiB
JSON
{
|
|
"Name": "Sud-0010",
|
|
"Description": "Rotfraenkisch, Dunkles Lager",
|
|
"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,
|
|
"ramp": {
|
|
"rate": 1.0,
|
|
"temp": 0,
|
|
"stirrer": {
|
|
"speed": 50,
|
|
"interval_time": 0,
|
|
"on_ratio": 1.0
|
|
}
|
|
},
|
|
"hold": {
|
|
"duration": 0,
|
|
"stirrer": {
|
|
"speed": 30,
|
|
"interval_time": 60,
|
|
"on_ratio": 0.5
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"steps": [
|
|
{
|
|
"grain_mass": 0,
|
|
"descr": "Heizen f\u00fcr Einmaischen",
|
|
"ramp": {
|
|
"rate": 1.8,
|
|
"temp": 57,
|
|
"stirrer": {
|
|
"speed": 75
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"descr": "Einmaischen einf\u00fcllen",
|
|
"user_message": "Bitte Malz einf\u00fcllen und best\u00e4tigen",
|
|
"user_wait_for_continue": true,
|
|
"hold": {
|
|
"stirrer": {
|
|
"speed": 0
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"descr": "Einmaischen Rast",
|
|
"hold": {
|
|
"duration": 2000
|
|
}
|
|
},
|
|
{
|
|
"descr": "Heizen Glucose-Rast",
|
|
"ramp": {
|
|
"rate": 1.0,
|
|
"temp": 63
|
|
}
|
|
},
|
|
{
|
|
"descr": "Halten Glucose-Rast",
|
|
"hold": {
|
|
"duration": 4000,
|
|
"stirrer": {
|
|
"speed": 20,
|
|
"interval_time": 90,
|
|
"on_ratio": 0.8
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"descr": "Heizen Verzuckerungs-Rast",
|
|
"ramp": {
|
|
"rate": 1.0,
|
|
"temp": 72
|
|
}
|
|
},
|
|
{
|
|
"descr": "Halten Verzuckerungs-Rast",
|
|
"hold": {
|
|
"duration": 3000,
|
|
"stirrer": {
|
|
"speed": 35,
|
|
"interval_time": 120
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"water_mass": 20,
|
|
"descr": "Heizen Abmaischen",
|
|
"ramp": {
|
|
"rate": 1.0,
|
|
"temp": 76
|
|
}
|
|
},
|
|
{
|
|
"water_mass": 20,
|
|
"descr": "Halten Abmaischen",
|
|
"user_message": "Quittieren zum Abmaischen",
|
|
"user_wait_for_continue": true,
|
|
"hold": {
|
|
"duration": 300,
|
|
"stirrer": {
|
|
"speed": 50
|
|
}
|
|
}
|
|
}
|
|
]
|
|
} |