Pump-shutdown deadlock fix split across two submodules:
- rotatingMachine@8f9150e: shutdown sequence clears state.delayedMove
so the abort-and-return-to-operational path doesn't auto-pickup the
queued setpoint and re-engage the pump.
- machineGroupControl@ea2857f: turnOffAllMachines clears MGC's
_delayedCall and serializes per-pump shutdown so PS's 2 s tick loop
can't interrupt an in-flight shutdown.
Live verification on pumpingstation-complete-example demo: basin now
shuts pumps off at stopLevel cleanly, reverses to fill, completes the
hysteresis cycle.
Also disable the trends page in the demo flow (build_flow.py + regen
flow.json). FlowFuse ui-chart's per-series server-side history buffer
(7 charts × ~20 series × 3600-point retention) was saturating the
Node-RED event loop at 129% CPU, making the dashboard freeze on every
click. Trends remain available — just disabled by default; flip the
ui_page_trends "d" key to false to re-enable.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Submodule bumps land the deadlock fix (state.js residue unpark + MGC
optimalControl dispatch reorder) and pumpingStation stopLevel hysteresis.
- Renames examples/pumpingstation-3pumps-dashboard →
pumpingstation-complete-example with regenerated flow.json. New
dashboard groups, demand-broadcast wiring, S88 placement rule
applied, ui-chart trend-split and link-channel naming follow
.claude/rules/node-red-flow-layout.md.
- New cross-node test harness under test/: end-to-end-pumpingstation
drives PS + MGC + 3 pumps + physics simulator end-to-end and
verifies the ~5/15 min cycle.
- Adds Grafana provisioning dashboards (pumping-station.json) and a
helper sync-example.sh script for export/import to live Node-RED.
- Docker entrypoint + settings + compose tweaks for the persistent
user dir layout used by the demo.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>