Files
pumpingStation/examples/README.md
znetsixe fe5fa3577b feat(pumpingStation): realistic defaults, ramp-foot visual fix, manual-mode visibility, dashboard example
Editor + schema defaults
- pumpingStation.html: drag-in defaults now reflect a realistic basin
  (volume=50 m³, height=4 m, inflowLevel=1.5, outflowLevel=0.2,
  overflowLevel=3.8, startLevel=1, stopLevel=0.5, minLevel=0.3,
  maxLevel=3.8). Old defaults left every level field null.

Visual bug fix
- src/editor/mode-preview.js: the level-based ramp curve in the editor
  was being drawn with foot=startLevel via buildPath(start, start, max).
  The runtime in control/levelBased.js has always used inflowLevel as
  the ramp foot. Pass buildPath(start, upFoot, max) where upFoot falls
  back to start when inflowLevel is missing, matching the runtime.

Manual mode observability
- src/specificClass.js: store last forwarded demand on this._manualDemand;
  surface as `mode` and `manualDemand` in getOutput(); call
  notifyOutputChanged() on forwardDemandToChildren and on changeMode so
  Port 0/1 emit even with no children registered. Status badge compacted
  to `mode | dir% | net m³/h` + `Qd=X m³/h` in manual mode.

Examples cleanup
- Drop stale 02-Integration.json, 03-Dashboard.json, basic-dashboard.flow.json,
  standalone-demo.js.
- 01-Basic.json: numbered driver groups (1. Control mode … 4. Calibration),
  Debug-outputs group, fixed typos and HOW-TO-USE; Port 1 debug now active.
- New 02-Dashboard.json: FlowFuse Dashboard 2.0 with Controls (7 buttons),
  Status (7 ui-text rows), Trends (4 ui-charts: level / volume / volume% /
  flow in-out-net), Raw output (ui-template dumping every Port 0 field).
  Fan-out function pattern-matches the 4-segment measurement keys by
  prefix instead of hardcoding childId, converts flow m³/s → m³/h, and
  caches last-known values so deltas never blank a row.
- examples/README.md realigned to the two-file set.

Wiki
- Home.md: 5 image placeholders replaced with the provided screenshots
  (01-node-and-editor, 02-basic-flow, 03-wiring-standalone,
  04-wiring-integrated) and the demo GIF (01-basic-demo).
- Reference-Examples.md: shipped-files table reduced to 01-Basic +
  02-Dashboard, Example-01 section uses the screenshot + GIF, Example-02
  rewritten as Dashboard (kept screenshot/GIF callouts open for those
  captures), Example-03/Integration sections + their debug-recipes row
  removed.

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

3.6 KiB

pumpingStation - Example Flows

Node-RED flows demonstrating the Phase-2 pumpingStation node on the canonical topic API (set.mode, set.inflow, set.outflow, set.demand, cmd.calibrate.volume, cmd.calibrate.level). Legacy aliases (changemode, q_in, q_out, Qd, calibratePredictedVolume, calibratePredictedLevel, registerChild) still work but log a one-time deprecation warning; these fresh flows use the canonical names only.

Files

File Tier Tabs Purpose
01-Basic.json 1 Process Plant Single pumpingStation driven by inject nodes - no parent, no dashboard.
02-Dashboard.json 2 Process Plant + Dashboard UI Same command surface as Basic, but driven by FlowFuse Dashboard 2.0 widgets — ui-button controls + ui-text live status panel.

Prerequisites

  • Node-RED with the EVOLV package installed (so the pumpingStation, measurement, machineGroupControl, and rotatingMachine node types are registered).
  • For 02-Dashboard.json: @flowfuse/node-red-dashboard (Dashboard 2.0).

How to load

# Drop a file into a running Node-RED instance using its Admin API.
curl -X POST -H 'Content-Type: application/json' \
  --data @nodes/pumpingStation/examples/01-Basic.json \
  http://localhost:1880/flows

Or in the editor: Menu -> Import -> select file -> Import. The flows import into their own tabs and can be deployed immediately.

01-Basic - what to try

  1. Deploy.
  2. Inject set.mode = manual.
  3. Inject set.inflow = 60 m3/h - the basin starts filling. Watch the formatted Port 0 payload in the debug sidebar.
  4. Inject set.demand = 40 % - in manual mode this would feed any registered children; here there are no pump children so it is logged and shown on Port 0.
  5. Inject cmd.calibrate.volume = 25 m3 to jump the predicted-volume integrator to half-full.

02-Dashboard - what to try

  1. Deploy.
  2. Open the dashboard at http://localhost:1880/dashboard/pumpingstation-basic.
  3. Click Mode: Manual or Mode: Levelbased in the Controls panel.
  4. Click Inflow 60 m³/h to push wastewater into the basin — the Status panel on the right shows level / volume / volume % rising.
  5. In manual mode, click Demand 40 m³/h — the value surfaces as Manual demand in the Status panel and in the node's status badge.
  6. Use Calibrate V = 25 m³ or Calibrate L = 1.5 m to snap the predicted-volume integrator.

All buttons fire the same canonical msg.topic as the Basic flow's inject nodes; the only difference is the trigger. The Live status panel is fed by Port 0 via a small fan-out function that caches last-known values so delta-only updates never blank a row.

Layout conventions

These flows follow the EVOLV layout rule set in .claude/rules/node-red-flow-layout.md:

  • Tabs split by concern: Process Plant (EVOLV nodes) / Dashboard UI (ui-* widgets) / Setup (once-true injects).
  • Cross-tab wiring via named link out / link in channels: setup:to-ps-mode, setup:to-ps-inflow, setup:to-mgc-mode, cmd:ps-mode, cmd:ps-demand, evt:flow, evt:level, evt:volpct, evt:state, evt:perc, evt:dir, evt:tempty.
  • Lane positions L0-L7 = [120, 360, 600, 840, 1080, 1320, 1560, 1800], driven by each node's S88 level (Process Cell on L5, Unit on L4, Equipment on L3, Control Module on L2).
  • Group boxes wrap each parent + its direct children, coloured by the parent's S88 level.

Regenerating

The current example JSON files are hand-maintained. If you re-introduce a generator, regenerate 01-Basic.json and 02-Dashboard.json from it rather than editing the JSON directly.