Files
pumpingStation/wiki/Reference-Examples.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

6.6 KiB
Raw Blame History

Reference — Examples

code-ref

Note

Every example flow shipped under nodes/pumpingStation/examples/, plus how to load them, what they show, and the debug recipes that go with them. Live source: nodes/pumpingStation/examples/.


Shipped examples

File Tier What it shows
examples/01-Basic.json 1 Single pumpingStation driven by inject nodes — no parent, no dashboard. Numbered driver groups for Mode / Flow signals / Operator demand / Calibration.
examples/02-Dashboard.json 2 Same command surface as Basic, driven by a FlowFuse Dashboard 2.0 page (Controls + live Status rows + 4 trend charts + raw-output table).

Loading a flow

Via the editor

  1. Open the Node-RED editor at http://localhost:1880.
  2. Menu → Import.
  3. Drag-and-drop the JSON file, or paste its contents.
  4. Click Deploy.

Via the Admin API

curl -X POST -H 'Content-Type: application/json' \
  --data @nodes/pumpingStation/examples/01-Basic.json \
  http://localhost:1880/flow

Example 01 — Basic standalone

Basic example flow in Node-RED editor

Nodes on the tab

Type Purpose
comment Tab header / instructions
inject × 7 Buttons to send set.mode (manual / levelbased), set.inflow, set.outflow, set.demand, cmd.calibrate.volume, cmd.calibrate.level
pumpingStation The unit under test
debug × 3 Port 0 (process), Port 1 (InfluxDB), Port 2 (parent reg)

Driver injects are wrapped in four numbered groups: 1. Control mode, 2. Flow signals (inflow / outflow), 3. Operator demand (manual mode only), 4. Calibration. Debug nodes sit in a separate Debug outputs (sidebar) group on the right.

What to do after deploy

  1. (optional) Click set.mode = manual if you want set.demand to forward; otherwise leave it on the default levelbased and the ramp drives demand from level.
  2. Click set.inflow = 60 m³/h — the basin starts filling. Watch Port 0 in the debug pane: direction flips to filling, level rises, predicted volume integrates.
  3. In manual mode: click set.demand = 40 — the value surfaces as manualDemand on Port 0/1 and in the node status badge.
  4. Click cmd.calibrate.volume = 25 m³ (or cmd.calibrate.level = 1.5 m) to snap the predicted-volume integrator.

Basic demo — level rises, demand follows


Example 02 — Dashboard

Important

Screenshot needed. Two captures from 02-Dashboard.json:

  1. The editor tab (left controls column + pumpingStation + Live-status group on the right).
  2. The rendered dashboard at http://localhost:1880/dashboard/pumpingstation-basic.

Save as wiki/_partial-screenshots/pumpingStation/05-ex02-editor.png and 06-ex02-dashboard.png. Replace this callout with both image links.

What it adds vs Example 01

Addition Why
FlowFuse ui-base + ui-theme + ui-page setup One dashboard page hosting four widget groups
ui-button × 7 (Controls group) Replace the inject buttons one-for-one — each carries the canonical msg.topic directly
ui-text × 7 (Status group) Live readouts: Mode, Direction, Level, Volume, Volume %, percControl, Manual demand
ui-chart × 4 (Trends group) Level (m), Volume (m³), Volume % (0100), Flow (m³/h, multi-series Inflow / Outflow / Net)
ui-template (Raw output group) Full key/value table of the latest Port 0 cache — every field the node emits, sorted
Fan-out function Caches last-known values so delta-only Port 0 updates never blank a status row, and forwards numeric values to the charts

The buttons fire the same canonical msg.topic as the inject nodes in Example 01 — there is no separate dashboard command surface to learn.

Required: @flowfuse/node-red-dashboard (Dashboard 2.0) installed in the Node-RED instance.

What to do after deploy

  1. Open http://localhost:1880/dashboard/pumpingstation-basic.
  2. Click Mode: Manual or Mode: Levelbased.
  3. Click Inflow 60 m³/h — Status panel level / volume / vol% rise; the Level / Volume / Flow charts plot the trends.
  4. In manual mode click Demand 40 m³/hManual demand row updates, node badge appends Qd=40 m³/h.
  5. Inspect the Raw output table at the bottom of the page for the full Port 0 surface (basin geometry, dryRunLevel, highVolumeSafetyLevel, predictedOverflowVolume, …).

Important

GIF needed. Capture clicking through Mode → Inflow → Demand and the charts reacting. 2030 s is enough.

Save as wiki/_partial-gifs/pumpingStation/02-ex02-dashboard.gif. Replace this callout with the image link.


Docker compose snippet

To bring up Node-RED + InfluxDB with EVOLV nodes pre-loaded:

# docker-compose.yml (extract)
services:
  nodered:
    build: ./docker/nodered
    ports: ['1880:1880']
    volumes:
      - ./docker/nodered/data:/data/evolv
  influxdb:
    image: influxdb:2.7
    ports: ['8086:8086']

Full file: EVOLV/docker-compose.yml.


Debug recipes

Symptom First thing to check
Status badge stuck on no data Did the level measurement child register? Tap Port 2 of the measurement with a debug node and confirm a child.register msg fires once at init.
Level rises but volume stays at minVol Volume integrator hasn't been calibrated. Send cmd.calibrate.level = <real level> once.
Demand stays at 0 % even though level is high Mode might be manual — check set.mode. Or the safety layer is blocking (look at safety.blocked on Port 0).
Predicted volume drifts Net-flow source is wrong. Look at flowSource on Port 0; it should match the highest-level aggregator you have wired in.
enableLog: 'debug' floods the container log Toggle it off in the node's config. Never ship a demo with debug logging enabled.

Page Why
Home Intuitive overview
Reference — Contracts Topic + config + child filters
Reference — Architecture Code map, state chart, lifecycle
Reference — Limitations Known limitations and open questions
EVOLV — Topology Patterns Where this node fits in a larger plant