Submodule bumps land the deadlock fix (state.js residue unpark + MGC optimalControl dispatch reorder) and pumpingStation stopLevel hysteresis. - Renames examples/pumpingstation-3pumps-dashboard → pumpingstation-complete-example with regenerated flow.json. New dashboard groups, demand-broadcast wiring, S88 placement rule applied, ui-chart trend-split and link-channel naming follow .claude/rules/node-red-flow-layout.md. - New cross-node test harness under test/: end-to-end-pumpingstation drives PS + MGC + 3 pumps + physics simulator end-to-end and verifies the ~5/15 min cycle. - Adds Grafana provisioning dashboards (pumping-station.json) and a helper sync-example.sh script for export/import to live Node-RED. - Docker entrypoint + settings + compose tweaks for the persistent user dir layout used by the demo. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.8 KiB
EVOLV — End-to-End Example Flows
Working with these examples? See
WORKFLOW.md— the canonical guide for editing, switching projects, persistence, and debugging.
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-complete-example/ |
End-to-end stack: pumpingStation + MGC + 3 pumps + 12 measurement nodes (4 per pump, physics-coupled), operator-driven inflow with scenario buttons (Constant / Sine / Diurnal / Storm), FlowFuse dashboard (realtime + 1h trends), and provisioned Grafana dashboard backed by InfluxDB. |
How it loads
Each subfolder here is a Node-RED project. The Docker stack has Node-RED's Projects feature enabled and bootstraps each examples/<name>/ into /data/projects/<name>/ on first container start.
To run:
docker compose up -dfrom the EVOLV root.- Open Node-RED at
http://localhost:1880. - Menu → Projects → Open Project → pick one.
- Open the FlowFuse dashboard at
http://localhost:1880/dashboard.
The default active project is pumpingstation-complete-example (override via DEFAULT_PROJECT env var on the nodered service). Switching is two clicks; persistence is handled by the evolv_nodered_data named volume — docker compose down && up doesn't lose the active flow.
Each example uses a unique dashboard path so they can coexist if you load multiple in the same runtime.
Adding new examples
When you create a new end-to-end example:
- Make a subfolder under
examples/named<scenario>-<focus>. - Include at least
flow.jsonandREADME.md. Abuild_flow.py(or equivalent generator) is recommended so the JSON stays diff-friendly. docker compose restart nodered— the entrypoint will bootstrap your new folder as a Node-RED project (synthesizespackage.json,git init, initial commit) under/data/projects/<name>/.- Editor → Projects → Open Project → pick your new one.
- Add a row to the catalogue table above.
The bootstrap skips folders that already exist in the volume. To force a refresh of an existing project from the repo source (e.g. after editing build_flow.py), use ./scripts/sync-example.sh <name>.
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.