Files
brewpi/components/plant/TODO.md
T
jensandClaude Sonnet 4.6 40d57dc68a Refresh README and design-backlog docs against current code
Both TODO.md backlogs and the README's architecture section still
described the Kalman-filter/heat-diffusion design that's since been
replaced by the delay-line Pot model and Kalman-free Smith predictor.
Check off the items that rewrite already fixed (heat-loss units,
transport delay vs. single-pole lag, three-Kalman-tuning), note how
the kn/sensor-noise item was resolved differently than proposed, and
add newly-spotted issues: brewpi.py wiring set_model_power
unconditionally (breaks pid_type "Normal"), kalman.py being dead code
in production, stale Kalman/kn keys in the config templates, and
debug print()s left in Pot.process().

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 17:02:04 +02:00

50 lines
2.6 KiB
Markdown

# components/plant design backlog
Findings from reviewing `pot.py`'s water-bath model against real-plant
behavior (sim/real control mismatch reported by user), refreshed against
the current `delay`-line rewrite of `Pot`.
- [x] **Heat-loss term has wrong units.** Fixed by the `Pot` rewrite:
`process()` now computes `p_loss = self.L * self.M * (self.temp -
self.theta_amb)` in Watts and applies `self.temp += (self.delay.get()
- p_loss) / (self.M * self.C) * self.dt` — the same `/(M*C)`
normalization for both the gain and loss terms, instead of the old
mismatched `leak = 1/self.M * self.L * (...)/ self.theta_amb`.
- [x] **Thermal lag modeled as single-pole lag, not transport delay.**
Fixed: `Pot` no longer uses `HeatDiffusion`'s `alpha=dt/Td`
exponential smoothing (that module was deleted). It now delays the
input power through `plant/delay.py`'s `Delay` (true dead time)
before integrating it, matching what this item recommended.
- [x] **`kn` is loaded but never applied.** Resolved differently than
originally proposed: `kn` was removed from `Pot` entirely rather than
wired up as plant-side measurement noise. Sensor noise is now
modeled one layer up, in `TempSensorSim` (`temp_offset`/`variance`,
wired from `brewpi.py`'s `TempSensorFactory.create(..., temp_offset=
-0.15, variance=0.01)`), not in the plant model. Note: `config.json.templ`
and `config.json.sim` still carry stale `Model.kn`/`Plant.kn` keys
that nothing reads anymore — harmless but worth deleting (see
`components/pid/TODO.md`'s config-validation item).
- [ ] **`theta_amb` is hardcoded, not configured.** Still true —
`brewpi.py`: `pot = Pot(DT, pot_params, 20)` passes a literal `20`
instead of reading it from config or a live ambient sensor. Real
ambient temperature drifts and is never modeled as a disturbance, so
the controller's robustness to it is untested.
- [ ] **No actuator/process realism.** Partially improved: `process()`
now clamps `self.temp` to `min(100, ...)` (won't simulate past
boiling), but there's still no heater power saturation enforced
inside `Pot` itself (handled ad hoc in demo harnesses), no
evaporation/lid heat loss, and no varying thermal mass `M` as volume
changes (e.g. boil-off, adding water/grain) — `M` is a fixed
constant for the whole simulation.
- [ ] **Debug `print()`s left in `Pot.process()`.** Every call prints
`p_loss`, `theta_amb`, and `temp` unconditionally — this runs once
per simulated/real tick (e.g. every `Controller.dt`), spamming stdout
in both the server and every demo script. Looks like leftover
debugging from the heat-loss-units fix; remove or gate behind a
debug flag.