Allow a Sud step to combine a ramp and a hold

A step can now carry both 'ramp' and 'hold': it ramps to the target
temp, then holds there for the given duration, instead of needing two
separate schedule entries. Sud.temp_reached() switches such a step
from its ramp phase into its hold phase in place (re-firing the
step-changed callback so SudTask/demo_sud re-apply the hold's stirrer
settings); user_wait_for_continue still applies once the whole step -
both phases - is done.

Merges sud_0010.json's three ramp/hold pairs into combined steps.
This commit is contained in:
2026-06-21 09:01:04 +02:00
parent 56de5cf4d6
commit 9bd9889cb0
6 changed files with 57 additions and 37 deletions
+8 -2
View File
@@ -129,13 +129,19 @@ environment (`$WORKON_HOME`/`$BREWPI_HOME`) on a Raspberry Pi-style deployment.
## Mash schedules
Files under `sude/` describe a brew's mash schedule ("Sud"): `pot_mass`,
`pot_material` (fixed for the whole brew), and a `steps` list, each either:
`pot_material` (fixed for the whole brew), and a `steps` list, each a ramp, a
hold, or both:
- a ramp — `"ramp": {"rate": ..., "temp": ...}` — ramp to `temp` at `rate`
(°C/min), or
(°C/min), and/or
- a hold — `"hold": {"duration": ...}` — hold the current target for
`duration` minutes (omit/`0` for an immediate step).
A step with both ramps to `temp` and then holds there for `duration` -
useful for a mash rest ("ramp to 63°C, then hold 40 min") without needing two
separate schedule entries. `user_wait_for_continue`/`user_message` (below)
apply once the whole step is done, i.e. after the hold phase if there is one.
Both `ramp` and `hold` carry a `stirrer` block (`speed`, `interval_time`,
`on_ratio`): `interval_time: 0` runs the stirrer continuously at `speed`;
`interval_time > 0` pulses it on a period of `interval_time` seconds, on for