Files
EVOLV/examples
Rene De Ren aec90cc8e7
Some checks failed
CI / lint-and-test (push) Has been cancelled
fix: stopLevel hysteresis works — bump rotatingMachine + MGC
Pump-shutdown deadlock fix split across two submodules:

- rotatingMachine@8f9150e: shutdown sequence clears state.delayedMove
  so the abort-and-return-to-operational path doesn't auto-pickup the
  queued setpoint and re-engage the pump.
- machineGroupControl@ea2857f: turnOffAllMachines clears MGC's
  _delayedCall and serializes per-pump shutdown so PS's 2 s tick loop
  can't interrupt an in-flight shutdown.

Live verification on pumpingstation-complete-example demo: basin now
shuts pumps off at stopLevel cleanly, reverses to fill, completes the
hysteresis cycle.

Also disable the trends page in the demo flow (build_flow.py + regen
flow.json). FlowFuse ui-chart's per-series server-side history buffer
(7 charts × ~20 series × 3600-point retention) was saturating the
Node-RED event loop at 129% CPU, making the dashboard freeze on every
click. Trends remain available — just disabled by default; flip the
ui_page_trends "d" key to false to re-enable.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 18:18:11 +02:00
..

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:

  1. docker compose up -d from the EVOLV root.
  2. Open Node-RED at http://localhost:1880.
  3. Menu → ProjectsOpen Project → pick one.
  4. 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:

  1. Make a subfolder under examples/ named <scenario>-<focus>.
  2. Include at least flow.json and README.md. A build_flow.py (or equivalent generator) is recommended so the JSON stays diff-friendly.
  3. docker compose restart nodered — the entrypoint will bootstrap your new folder as a Node-RED project (synthesizes package.json, git init, initial commit) under /data/projects/<name>/.
  4. Editor → Projects → Open Project → pick your new one.
  5. 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 optimalcontrol and prioritycontrol modes 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 loopreactor upstream feeding settler, return sludge controlled by a small pumpingStation.
  • 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 measurement node 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.