Files
pumpingStation/wiki/Reference-Contracts.md
znetsixe 8507ee4e02 wiki: split per-node Home into Zone A (intuitive) + Reference-* siblings
New standard, pilot pass for pumpingStation. Sets the pattern the other
10 nodes will follow once we sign off on this one.

Zone A (wiki/Home.md, ~180 lines):
- one-sentence opener
- "at a glance" 5-row fact table
- "How it looks in Node-RED" — screenshot placeholder
- "What it models" — embeds the existing basin-model.drawio.svg
- "Try it" — 3-minute demo with curl-load command, click list,
  GIF placeholder
- "Typical wiring" — two placeholder screenshots (standalone +
  integrated), no mermaid (per user direction)
- "The five things you'll send" + sample Port-0 payload table
- "Need more?" footer linking to Reference-* siblings

Zone B (4 sibling pages):
- Reference-Contracts.md  — full topic contract + data model
  (AUTOGEN markers); config schema; child registration filters;
  unit policy
- Reference-Architecture.md — 3-tier code layout; safety FSM
  (stateDiagram-v2); tick lifecycle (sequenceDiagram); output ports
- Reference-Examples.md — 01-Basic / 02-Integration / 03-Dashboard
  walk-through with per-example screenshot + GIF placeholders;
  debug-recipes table
- Reference-Limitations.md — implemented vs schema-only modes;
  basin-shape constraint; net-flow source caveat; alias-removal map

Asset directory placeholders created:
- wiki/_partial-screenshots/pumpingStation/.gitkeep
- wiki/_partial-gifs/pumpingStation/.gitkeep
- wiki/_partial-flows/pumpingStation/.gitkeep

Abandoned per user direction (no longer linked, removed from source):
- wiki/README.md
- wiki/functional-description.md (377 lines retired)
- wiki/modes/*.md (5 files retired)

Diagrams kept in place (wiki/diagrams/*.drawio.svg) — referenced from
Home and Reference-Architecture.

package.json: wiki:contract + wiki:datamodel now target
Reference-Contracts.md instead of Home.md.

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

8.6 KiB
Raw Blame History

Reference — Contracts

code-ref autogen

Note

Full topic contract, configuration schema, and child-registration filters for pumpingStation. The topic-contract and data-model sections are regenerated by npm run wiki:all — do not hand-edit between the BEGIN AUTOGEN / END AUTOGEN markers. Source of truth for everything on this page: the node's src/commands/index.js, src/specificClass.js configure(), and the schema at generalFunctions/src/configs/pumpingStation.json.

For an intuitive overview, return to the Home.


Topic contract

The Unit column reflects each descriptor's units: { measure, default } declaration. The default unit is what the commandRegistry coerces incoming msg.unit values to before the handler runs.

Canonical topic Aliases Payload Unit Effect
set.mode changemode string Switch the station between auto / manual control modes.
child.register registerChild string Register a child node (machine group, measurement, …) with this station.
cmd.calibrate.volume calibratePredictedVolume any volume (default m3) Calibrate the predicted-volume integrator to a known basin volume.
cmd.calibrate.level calibratePredictedLevel any length (default m) Calibrate the predicted-volume integrator to a known basin level.
set.inflow q_in any volumeFlowRate (default m3/h) Push a measured inflow value into the basin balance.
set.outflow q_out any volumeFlowRate (default m3/h) Push a measured outflow value into the basin balance.
set.demand Qd any volumeFlowRate (default m3/h) Operator outflow demand setpoint for the station.

Data model — getOutput() shape

Keys composed each tick by specificClass.getOutput() and emitted via outputUtils.formatMsg on Port 0. Delta-compressed: consumers see only the keys that changed.

Key Type Unit Sample
direction string "steady"
dryRunLevel number 0.20400000000000001
dryRunSafetyVol number 0.20400000000000001
flowSource null null
heightBasin number m 1
highVolumeSafetyLevel number 2.45
highVolumeSafetyVol number 2.45
inflowLevel number m 2
inletPipeDiameter number 0.4
maxVol number m3 1
maxVolAtOverflow number m3 2.5
minHeightBasedOn string "outlet"
minVol number m3 0.2
minVolAtInflow number m3 2
minVolAtOutflow number m3 0.2
outflowLevel number m 0.2
outletPipeDiameter number 0.4
overflowLevel number m 2.5
percControl number % 0
predictedOverflowRate number 0
predictedOverflowVolume number 0
predictedUnderflowVolume number 0
surfaceArea number m2 1
timeleft null s null
volEmptyBasin number m3 1
volume.predicted.atequipment.wikigen-pumpingstation-id number m3 0.2

Sample values come from a stub instantiation in wikiGen — in a live deployment the volume key is shaped volume.<variant>.<position>.<childId> per the standard Measurement Key Shape.


Configuration schema — editor form to config keys

Source of truth: generalFunctions/src/configs/pumpingStation.json.

Basin geometry (config.basin)

Form field Config key Default Unit Notes
Basin Volume basin.volume 1 m3 Total geometric storage from floor to rim
Basin Height basin.height 1 m Floor-to-rim wall height
Inlet Elevation basin.inflowLevel 2 m Bottom of incoming pipe, from floor
Outlet Elevation basin.outflowLevel 0.2 m Top of pump-suction pipe, from floor
Inlet Pipe Diameter basin.inletPipeDiameter 0.4 m For future hydraulic upgrades
Outlet Pipe Diameter basin.outletPipeDiameter 0.4 m For future hydraulic upgrades
Overflow Level basin.overflowLevel 2.5 m Physical overflow weir crest

Safety thresholds (config.safety)

Form field Config key Default Notes
High-Volume Safety % safety.highVolumeSafetyThresholdPercent 98 Trigger high-volume safety at this fill %
Dry-Run Safety Level safety.dryRunLevel 0.2 Below this level all pumps stop
Enable High-Volume Safety safety.enableHighVolumeSafety true Master switch

Warning

Earlier versions used enableOverfillProtection and overfillThresholdPercent. Those names are deprecated. The current canonical names are enableHighVolumeSafety and highVolumeSafetyThresholdPercent. See .claude/refactor/OPEN_QUESTIONS.md for the alias-removal timeline.

Control mode (config.control)

Form field Config key Default Notes
Mode control.mode "levelbased" One of levelbased, manual, flowbased, pressureBased, percentageBased, powerBased, hybrid*. Asterisked modes are placeholders in code.
Level Curve Type control.levelbased.curveType "linear" linear or log
Log Curve Factor control.levelbased.logCurveFactor 0.5 Slope tuning for log curve
Min Level control.levelbased.minLevel 0.3 Demand hard-zero below this
Start Level control.levelbased.startLevel 0.5 Falling-ramp returns to 0 % here
Stop Level control.levelbased.stopLevel 0.4 Schmitt-trigger lower bound for pump-count keep-alive
Max Level control.levelbased.maxLevel 2.3 Demand saturates at 100 % here
Enable Shifted Ramp control.levelbased.enableShiftedRamp true Hysteresis-armed shift between rising / falling ramps
Manual Flow Setpoint control.manual.flowSetpoint 0 Honoured in manual mode

General (config.general)

Form field Config key Default Notes
Time-left full / empty threshold general.timeleftToFullOrEmptyThresholdSeconds 120 ETA below this triggers warning state
Flow dead-band general.flowThreshold 1e-4 m³/s Net-flow below this is treated as steady

Child registration

Source: nodes/pumpingStation/src/specificClass.js configure(), lines 107116.

Software type Filter Wired to Side-effect
measurement any _subscribeMeasurement Subscribes to the measurement's emitter; updates basin balance
machine only if no machinegroup parent is present direct dispatch Bypassed when an MGC is the predicted-flow source
machinegroup any _subscribePredictedFlow Reads aggregated predicted flow from the MGC
pumpingstation any _subscribePredictedFlow Cascaded PS — reads predicted outflow of upstream station

The router only subscribes to the highest-level aggregator for predicted flow. If an MGC is present, direct machine children are not double-counted.


Unit policy

Source: nodes/pumpingStation/src/specificClass.js lines 2130.

Quantity Canonical (internal) Output (rendered)
Flow m3/s m3/s (also netFlowRate)
Level m m
Volume m3 m3
Pressure Pa (not surfaced)
Power W (not surfaced)
Temperature K (not surfaced)

overflowVolume and underflowVolume are explicitly listed in the policy output so the MeasurementContainer keeps the integrator's m3 unit on those streams (FlowAggregator writes spill / underflow per tick).


Page Why
Home Intuitive overview
Reference — Architecture Code map, state chart, lifecycle
Reference — Examples Shipped example flows
Reference — Limitations Known limitations and open questions
EVOLV — Topic Conventions Platform-wide topic rules
EVOLV — Telemetry Port 0 / 1 / 2 InfluxDB layout