Architecture change: demo is now driven by a sinusoidal inflow into the pumping station basin, rather than a random demand generator. The basin fills from the sinus, and PS's levelbased control should start/stop pumps via MGC when level crosses start/stop thresholds. Changes: - Demo Drivers tab: sinus generator (period 120s, base 0.005 + amp 0.03 m³/s) replaces the random demand. Sends q_in to PS via link channel. - PS config: levelbased mode, 10 m³ basin, startLevel 1.2 m / stopLevel 0.6 m. Volume-based safeties on, time-based off. - MGC scaling = normalized (was absolute) so PS's percent-based level control maps correctly. - Dashboard mode toggle now drives PS mode (levelbased ↔ manual) instead of per-pump setMode. Slider sends Qd to PS (only effective in manual). - PS code (committed separately): _controlLevelBased now calls _applyMachineGroupLevelControl + new Qd topic + forwardDemandToChildren. KNOWN ISSUE: Basin fills correctly (visible on dashboard), but pumps don't start when level exceeds startLevel. Likely cause: _pickVariant for 'level' in _controlLevelBased may not be resolving the predicted level correctly, or the safetyController is interfering despite time-threshold being 0. Needs source-level tracing of the PS tick → _safetyController → _controlLogic → _controlLevelBased path with logging enabled. To be debugged in the next session. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
EVOLV — End-to-End Example Flows
Demo flows that show how multiple EVOLV nodes work together in a realistic wastewater-automation scenario. Each example is self-contained: its folder has a flow.json you can import directly into Node-RED plus a README.md that walks through the topology, control modes, and dashboard layout.
These flows complement the per-node example flows under nodes/<name>/examples/ (which exercise a single node in isolation). Use the per-node flows for smoke tests during development; use the flows here when you want to see how a real plant section behaves end-to-end.
Catalogue
| Folder | What it shows |
|---|---|
pumpingstation-3pumps-dashboard/ |
Wet-well basin + machineGroupControl orchestrating 3 pumps (each with up/downstream pressure measurements), individual + auto control, process-demand input via dashboard slider or random generator, full FlowFuse dashboard. |
How to import
- Bring up the EVOLV stack:
docker compose up -dfrom the superproject root. - Open Node-RED at
http://localhost:1880. - Menu → Import → drop in the example's
flow.json(or paste the contents). - Open the FlowFuse dashboard at
http://localhost:1880/dashboard.
Each example uses a unique dashboard path so they can coexist in the same Node-RED runtime.
Adding new examples
When you create a new end-to-end example:
- Make a subfolder under
examples/named<scenario>-<focus>. - Include
flow.json(Node-RED export) andREADME.md(topology, control modes, dashboard map, things to try). - Test it on a fresh Dockerized Node-RED — clean import, no errors, dashboard loads.
- Add a row to the catalogue table above.
Wishlist for future examples
These are scenarios worth building when there's a session for it:
- Pump failure + MGC re-routing — kill pump 2 mid-run, watch MGC redistribute to pumps 1 and 3.
- Energy-optimal vs equal-flow control — same demand profile run through
optimalcontrolandprioritycontrolmodes side-by-side, energy comparison chart. - Schedule-driven demand — diurnal flow pattern (low at night, peak at 7 am), MGC auto-tuning over 24 simulated hours.
- Reactor + clarifier loop —
reactorupstream feedingsettler, return sludge controlled by a smallpumpingStation. - Diffuser + DO control — aeration grid driven by a PID controller from a dissolved-oxygen sensor.
- Digital sensor bundle — MQTT-style sensor (BME280, ATAS, etc.) feeding a
measurementnode in digital mode + parent equipment node. - Maintenance window — entermaintenance / exitmaintenance cycle with operator handover dashboard.
- Calibration walk-through — measurement node calibrate cycle with stable / unstable input demonstrations.