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>
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, androtatingMachinenode 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
- Deploy.
- Inject
set.mode = manual. - Inject
set.inflow = 60 m3/h- the basin starts filling. Watch the formatted Port 0 payload in the debug sidebar. - 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. - Inject
cmd.calibrate.volume = 25 m3to jump the predicted-volume integrator to half-full.
02-Dashboard - what to try
- Deploy.
- Open the dashboard at
http://localhost:1880/dashboard/pumpingstation-basic. - Click Mode: Manual or Mode: Levelbased in the Controls panel.
- Click Inflow 60 m³/h to push wastewater into the basin — the Status panel on the right shows level / volume / volume % rising.
- In manual mode, click Demand 40 m³/h — the value surfaces as
Manual demandin the Status panel and in the node's status badge. - 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.