Redraw basin + control-zone diagrams

Basin model: replaced the three-column geometry/elevation/control
grid with a side-view tank cross-section — walls visible, inlet/outlet
pipes poke through at their real heights, water ≈≈ vs dead-volume ░░
separate the zones at a glance, control thresholds cut across as dotted
horizontal lines with the safety annotations on the right.

Control logic: replaced the ●-stack with a single vertical level axis
thermometer — elevation markers in the middle, control/safety
annotations fanning out to the right. Narrower, less visual noise,
easier to scan top-to-bottom.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
znetsixe
2026-04-22 11:55:55 +02:00
parent b6e6c728dd
commit e654a04d86

@@ -170,25 +170,27 @@ Line-protocol payload for the `telemetry` bucket. Tags stay low-cardinality (sta
The basin is modelled as a rectangular prism with constant cross-section. Everything derives from `volume = level × surfaceArea`. The basin is modelled as a rectangular prism with constant cross-section. Everything derives from `volume = level × surfaceArea`.
``` ```
GEOMETRY ELEVATION CONTROL (levelbased) ┌─────────────────┐ ◄─ heightBasin (rim)
│ │
═════════════ ◄─ heightBasin ──── maxVol ≡ volume │ freeboard │
(freeboard) ├─ ─ ─ ─ ─ ─ ─ ─ ─┤ ◄─ heightOverflow ═══► overfill trip
│≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│ (upstream stops)
─ ─ ─ ─ ─ ─ ─ ◄─ heightOverflow ──── maxVolOverflow ◄── overfill safety │≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│
├╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌┤ ◄─ maxFlowLevel ═══► 100 % demand
╌╌╌╌╌╌╌╌╌╌╌╌╌ ──── ◄── maxFlowLevel (100% demand) │≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│
LINEAR SCALING │≈≈≈≈≈ RUN ≈≈≈≈≈≈≈│ │ ramp
RANGE │≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│ │ linearly
──●── INFLOW ◄─ heightInlet ──── minVolIn INFLOW ═══════►╣≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│ ◄─ heightInlet
│≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│
╌╌╌╌╌╌╌╌╌╌╌╌╌ ──── ◄─ startLevel (0% demand) ├╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌┤ ◄─ startLevel ═══► 0 % demand
SEWAGE BUFFER │≈≈ DEAD ZONE ≈≈≈≈│ ─── hysteresis
┄┄┄┄┄┄┄┄┄┄┄┄┄ ──── ◄── stopLevel (unconditional stop) │≈≈ (keep cmd) ≈≈≈│
DEAD ZONE ↑ hysteresis band ├╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌┤ ◄─ stopLevel ═══► unconditional STOP
──●── OUTFLOW ◄─ heightOutlet ──── minVolOut ◄── dry-run threshold │≈≈≈≈≈ BUFFER ≈≈≈≈│
DEAD VOLUME │≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│
═════════════ 0 (floor) OUTFLOW ◄══════╣≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│ ◄─ heightOutlet ═══► dry-run trip
│░░░ DEAD VOLUME ░│ (downstream stops)
└─────────────────┘ ◄─ 0 (floor)
``` ```
**Typical ordering** (bottom → top): `stopLevel < startLevel = minFlowLevel ≤ heightInlet < maxFlowLevel ≈ heightOverflow`. **Typical ordering** (bottom → top): `stopLevel < startLevel = minFlowLevel ≤ heightInlet < maxFlowLevel ≈ heightOverflow`.
@@ -241,23 +243,30 @@ flowPositions = { inflow: ['in', 'upstream'], outflow: ['out', 'downstream'] }
### `levelbased` mode — three zones ### `levelbased` mode — three zones
``` ```
demand level
─────
maxFlowLevel ──●─── 100 % ─┐
│ │ RUN ┼── heightOverflow ═══ overfill trip ─► upstream STOP
│ │ (linear scaling)
startLevel ──●─── 0 % ─┘ │ RUN
linear 0 → 100 %
DEAD ZONE
│ │ (hysteresis: keep last command) ┼── maxFlowLevel ═══ 100 % demand
stopLevel ──●─── stop ─┘ ┼── heightInlet ─── inflow pipe
│ ┐
│ │ STOP ┼── startLevel ═══ 0 % demand (ramp starts)
│ (unconditional MGC shutdown)
DEAD ZONE
floor ──● │ hysteresis — keep last cmd
│ │
┼── stopLevel ═══ ┴ unconditional STOP
┼── heightOutlet ─── outflow pipe
│ ═══ dry-run trip ─► downstream STOP
┴── 0 (floor)
``` ```
- **STOP.** Below `stopLevel` every machine group receives `turnOffAllMachines()` and `percControl` is reset to `0`. - **STOP.** Below `stopLevel` every machine group receives `turnOffAllMachines()` and `percControl` is reset to `0`.