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>
87 lines
3.6 KiB
Markdown
87 lines
3.6 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
# 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.
|