diff --git a/components/pid/TODO.md b/components/pid/TODO.md index 5a820f4..6bb19a3 100644 --- a/components/pid/TODO.md +++ b/components/pid/TODO.md @@ -52,15 +52,16 @@ git history for `temp_controller.py`/`temp_controller_smith.py`). actually exposes a model to feed. - [ ] **Config access is unchecked `dict[key]` everywhere.** - `params['Hold']`, `model_params['gain']`, etc., throughout, with no - schema validation at load time. We already hit this bug class once + `params['Hold']`, `params['Td']`, etc., throughout, with no schema + validation at load time. We already hit this bug class once (`config.json.sim`'s `gain`/`Model` nesting mismatch). A small schema/dataclass validation layer at config-load would surface errors immediately instead of mid-`__init__` — and would have caught - the dead `TempCtrl.Kalman` / `Model.kn` / `Plant.kn` keys still - sitting in `config.json.templ` and `config.json.sim` (harmless today - since extra keys are just ignored, but nothing reads them anymore - after the Kalman/`kn` removal — see `components/plant/TODO.md`). + the dead `TempCtrl.Kalman` / `Model.kn` / `Plant.kn` keys that used + to sit unused in `config.json.templ`/`.sim` (since deleted) and the + `Model.gain`/`Plant.gain` keys still doing the same in + `config.json.sim` right now — `Pot` dropped `gain` entirely, see + `components/plant/TODO.md`. - [ ] **`kalman.py` is now dead code in production.** Neither `temp_controller.py` nor `temp_controller_smith.py` uses `Kalman` diff --git a/components/plant/TODO.md b/components/plant/TODO.md index f52ab64..6058040 100644 --- a/components/plant/TODO.md +++ b/components/plant/TODO.md @@ -22,29 +22,37 @@ the current `delay`-line rewrite of `Pot`. 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). + -0.15, variance=0.01)`), not in the plant model. The stale + `Model.kn`/`Plant.kn` keys this item flagged have since been deleted + from `config.json.templ`/`config.json.sim` too. - [x] **`theta_amb` is hardcoded, not configured.** Fixed: added a top-level `ambient_temperature` key to `config.json`(`.templ`/`.sim`); `brewpi.py` reads it once and passes it to both the real `Pot` and (via a new `theta_amb` param) `temp_controller_smith.py`'s internal models, so the Smith predictor's model matches the real plant's - assumed ambient instead of silently defaulting to 20. Real ambient - temperature still isn't modeled as a *drifting* disturbance (it's a - static config value, not a live sensor reading), so robustness to - ambient drift remains untested — that part of the original concern - stands. + assumed ambient instead of silently defaulting to 20. `Pot` also + dropped its separate `params['theta']` initial-temperature field — + it now always starts at `theta_amb` (so the same config value governs + both the assumed ambient *and* the pot's starting temperature; there's + no longer a way to start a sim at a temperature other than ambient). + Real ambient temperature still isn't modeled as a *drifting* + disturbance (it's a static config value, not a live sensor reading, + though `Pot.set_ambient_temperature()` now exists as a hook for that), + so robustness to ambient drift remains 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. +- [ ] **No actuator/process realism.** Partially improved (`process()` + clamps `self.temp` to `min(100, ...)`, won't simulate past boiling) + and partially regressed: `Pot` also dropped its `gain` (heater + efficiency) factor entirely — `process()` now applies 100% of + commanded power with no loss, whereas before `params['gain']` could + model e.g. an 80% efficient transfer. `Model.gain`/`Plant.gain` are + now dead keys in `config.json.sim` (already absent from `.templ`) — + see `components/pid/TODO.md`'s config-validation item. 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. - [x] **Debug `print()`s left in `Pot.process()`.** Fixed: the unconditional `p_loss`/`theta_amb`/`temp` prints (leftover from the diff --git a/scripts/demos/sud/demo_sud.py b/scripts/demos/sud/demo_sud.py index 0b8d979..287e78e 100644 --- a/scripts/demos/sud/demo_sud.py +++ b/scripts/demos/sud/demo_sud.py @@ -34,12 +34,10 @@ if __name__ == '__main__': } plant_params = { - "theta" : 20, "C" : 4190, "M" : 20, "L" : 0.2, - "Td" : 30, - "gain" : 1.0 + "Td" : 30 } sud = Sud("sude/sud_0010.json")