pumpingStation schema: add flow dead-band, output formats, level-armed shift

- general.flowThreshold: configurable m3/s dead-band for steady-flow detection
- output.process / output.dbase: enum for port-0 / port-1 payload format
- control.levelbased.enableShiftedRamp: hysteresis toggle
- control.levelbased.shiftLevel: arming level for the shifted ramp
- inflowLevel description clarified as "bottom/invert of inlet pipe"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Rene De Ren
2026-05-05 19:16:20 +02:00
parent 4252292ae1
commit 35f648f64e

View File

@@ -22,6 +22,14 @@
"description": "The default flow unit used for reporting station throughput."
}
},
"flowThreshold": {
"default": 0.0001,
"rules": {
"type": "number",
"min": 0,
"description": "Flow dead-band in m3/s below which the station treats net flow as steady."
}
},
"logging": {
"logLevel": {
"default": "info",
@@ -127,6 +135,50 @@
}
}
},
"output": {
"process": {
"default": "process",
"rules": {
"type": "enum",
"values": [
{
"value": "process",
"description": "Delta-compressed process message."
},
{
"value": "json",
"description": "JSON payload."
},
{
"value": "csv",
"description": "CSV-formatted payload."
}
],
"description": "Format of the process payload emitted on output port 0."
}
},
"dbase": {
"default": "influxdb",
"rules": {
"type": "enum",
"values": [
{
"value": "influxdb",
"description": "InfluxDB telemetry payload."
},
{
"value": "json",
"description": "JSON payload."
},
{
"value": "csv",
"description": "CSV-formatted payload."
}
],
"description": "Format of the telemetry payload emitted on output port 1."
}
}
},
"asset": {
"uuid": {
"default": null,
@@ -240,7 +292,7 @@
"rules": {
"type": "number",
"min": 0,
"description": "Height of the inlet pipe measured from the basin floor (m)."
"description": "Bottom/invert height of the inlet pipe measured from the basin floor (m)."
}
},
"outflowLevel": {
@@ -248,7 +300,7 @@
"rules": {
"type": "number",
"min": 0,
"description": "Height of the outlet pipe measured from the basin floor (m)."
"description": "Top height of the outlet or pump-suction pipe measured from the basin floor (m)."
}
},
"overflowLevel": {
@@ -438,7 +490,7 @@
"rules": {
"type": "number",
"min": 0,
"description": "Below this level the MGC shuts down all pumps (unconditional stop). Above dryRunLevel (safety), below startLevel (DEAD ZONE)."
"description": "Below this level the MGC shuts down all pumps (unconditional stop). Between minLevel and the active ramp start, demand is held at 0 %."
}
},
"startLevel": {
@@ -446,7 +498,7 @@
"rules": {
"type": "number",
"min": 0,
"description": "Level at which the pump demand ramp begins at 0 %. Demand scales linearly from startLevel (0 %) to maxLevel (100 %)."
"description": "Lower shifted ramp point used while draining. While filling, demand is held at 0 % from startLevel through inletLevel, then scales from inletLevel to maxLevel."
}
},
"maxLevel": {
@@ -456,6 +508,46 @@
"min": 0,
"description": "Level at which the pump demand saturates at 100 %. Above this, demand stays clamped."
}
},
"curveType": {
"default": "linear",
"rules": {
"type": "enum",
"values": [
{
"value": "linear",
"description": "Linear demand scaling between the active lower ramp level and maxLevel."
},
{
"value": "log",
"description": "Logarithmic demand scaling with fast response early in the ramp."
}
],
"description": "Demand curve used by levelbased control."
}
},
"logCurveFactor": {
"default": 9,
"rules": {
"type": "number",
"min": 0.001,
"description": "Shape factor for the levelbased log curve; higher values increase early response."
}
},
"enableShiftedRamp": {
"default": false,
"rules": {
"type": "boolean",
"description": "When true, arm a hysteresis shift: once level rises past shiftLevel the ramp foot moves left from inflowLevel to startLevel until level falls back below startLevel."
}
},
"shiftLevel": {
"default": 0,
"rules": {
"type": "number",
"min": 0,
"description": "Level (m) that arms the shifted ramp when crossed going up. Should be ≤ maxLevel. Ignored when enableShiftedRamp is false."
}
}
},
"pressureBased": {
@@ -634,7 +726,14 @@
"default": true,
"rules": {
"type": "boolean",
"description": "If true, high level alarms and shutdowns will be enforced to prevent overfilling."
"description": "Deprecated alias for enableHighVolumeSafety. If true, high level alarms and shutdowns will be enforced to preserve overflow margin."
}
},
"enableHighVolumeSafety": {
"default": true,
"rules": {
"type": "boolean",
"description": "If true, high-volume safety actions run before the basin reaches physical overflow."
}
},
"overfillThresholdPercent": {
@@ -643,7 +742,16 @@
"type": "number",
"min": 0,
"max": 100,
"description": "Volume percentage above which overfill protection activates."
"description": "Deprecated alias for highVolumeSafetyThresholdPercent."
}
},
"highVolumeSafetyThresholdPercent": {
"default": 98,
"rules": {
"type": "number",
"min": 0,
"max": 100,
"description": "Percentage of maxVolAtOverflow where high-volume safety activates before actual overflow."
}
},
"timeleftToFullOrEmptyThresholdSeconds": {