When MGC's per-tick abortActiveMovements parks the FSM in 'accelerating'/'decelerating' to avoid a bounce loop, a subsequent moveTo previously fell into the early-return path and saved the new setpoint to delayedMove — which never fired because nothing transitioned back to 'operational'. Now distinguish residue states from genuine non-operational states (starting/warmingup/...) and force-transition out of residue so the new setpoint actually executes. Also picks up in-flight predict shareInputsFrom plumbing and pumpingStation.json stopLevel doc. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
996 lines
37 KiB
JSON
996 lines
37 KiB
JSON
{
|
|
"general": {
|
|
"name": {
|
|
"default": "Pumping Station",
|
|
"rules": {
|
|
"type": "string",
|
|
"description": "A human-readable name or label for this pumping station configuration."
|
|
}
|
|
},
|
|
"id": {
|
|
"default": null,
|
|
"rules": {
|
|
"type": "string",
|
|
"nullable": true,
|
|
"description": "A unique identifier for this pumping station configuration. If not provided, defaults to null."
|
|
}
|
|
},
|
|
"unit": {
|
|
"default": "m3/h",
|
|
"rules": {
|
|
"type": "string",
|
|
"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",
|
|
"rules": {
|
|
"type": "enum",
|
|
"values": [
|
|
{
|
|
"value": "debug",
|
|
"description": "Log verbose diagnostic messages that aid in troubleshooting the station."
|
|
},
|
|
{
|
|
"value": "info",
|
|
"description": "Log general informational messages about station behavior."
|
|
},
|
|
{
|
|
"value": "warn",
|
|
"description": "Log warnings when station behavior deviates from expected ranges."
|
|
},
|
|
{
|
|
"value": "error",
|
|
"description": "Log only error level messages for critical failures."
|
|
}
|
|
],
|
|
"description": "Defines the minimum severity that will be written to the log."
|
|
}
|
|
},
|
|
"enabled": {
|
|
"default": true,
|
|
"rules": {
|
|
"type": "boolean",
|
|
"description": "If true, logging is active for the pumping station node."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"functionality": {
|
|
"softwareType": {
|
|
"default": "pumpingstation",
|
|
"rules": {
|
|
"type": "string",
|
|
"description": "Specified software type used to locate the proper default configuration."
|
|
}
|
|
},
|
|
"role": {
|
|
"default": "StationController",
|
|
"rules": {
|
|
"type": "string",
|
|
"description": "Describes the station's function within the EVOLV ecosystem."
|
|
}
|
|
},
|
|
"positionVsParent": {
|
|
"default": "atEquipment",
|
|
"rules": {
|
|
"type": "enum",
|
|
"description": "Defines how the station is positioned relative to its parent process or site.",
|
|
"values": [
|
|
{
|
|
"value": "atEquipment",
|
|
"description": "The station is controlled at the equipment level and represents the primary pumping asset."
|
|
},
|
|
{
|
|
"value": "upstream",
|
|
"description": "The station governs flows entering upstream of the parent asset."
|
|
},
|
|
{
|
|
"value": "downstream",
|
|
"description": "The station influences conditions downstream of the parent asset, such as discharge or transfer."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"distance": {
|
|
"default": null,
|
|
"rules": {
|
|
"type": "number",
|
|
"nullable": true,
|
|
"description": "Optional distance to parent asset for registration metadata."
|
|
}
|
|
},
|
|
"tickIntervalMs": {
|
|
"default": 1000,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 100,
|
|
"description": "Interval in milliseconds between internal evaluation cycles and output refreshes."
|
|
}
|
|
},
|
|
"supportsSimulation": {
|
|
"default": true,
|
|
"rules": {
|
|
"type": "boolean",
|
|
"description": "Indicates whether the station can operate using simulated inflow and level data."
|
|
}
|
|
},
|
|
"supportedChildSoftwareTypes": {
|
|
"default": [
|
|
"measurement"
|
|
],
|
|
"rules": {
|
|
"type": "set",
|
|
"itemType": "string",
|
|
"description": "List of child node software types that may register with the station."
|
|
}
|
|
}
|
|
},
|
|
"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,
|
|
"rules": {
|
|
"type": "string",
|
|
"nullable": true,
|
|
"description": "Asset tag number which is a universally unique identifier for this pumping station."
|
|
}
|
|
},
|
|
"tagCode": {
|
|
"default": null,
|
|
"rules": {
|
|
"type": "string",
|
|
"nullable": true,
|
|
"description": "Asset tag code which uniquely identifies the pumping station. May be null if not assigned."
|
|
}
|
|
},
|
|
"category": {
|
|
"default": "station",
|
|
"rules": {
|
|
"type": "enum",
|
|
"values": [
|
|
{
|
|
"value": "station",
|
|
"description": "Represents a dedicated pumping station asset."
|
|
}
|
|
],
|
|
"description": "High level classification for asset reporting."
|
|
}
|
|
},
|
|
"type": {
|
|
"default": "pumpingstation",
|
|
"rules": {
|
|
"type": "string",
|
|
"description": "Specific asset type used to identify this configuration."
|
|
}
|
|
},
|
|
"model": {
|
|
"default": "Unknown",
|
|
"rules": {
|
|
"type": "string",
|
|
"description": "Manufacturer or integrator model designation for the station."
|
|
}
|
|
},
|
|
"supplier": {
|
|
"default": "Unknown",
|
|
"rules": {
|
|
"type": "string",
|
|
"description": "Primary supplier or maintainer responsible for the station."
|
|
}
|
|
},
|
|
"geoLocation": {
|
|
"default": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"z": 0
|
|
},
|
|
"rules": {
|
|
"type": "object",
|
|
"description": "Coordinate reference for locating the pumping station.",
|
|
"schema": {
|
|
"x": {
|
|
"default": 0,
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "X coordinate in meters or site units."
|
|
}
|
|
},
|
|
"y": {
|
|
"default": 0,
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Y coordinate in meters or site units."
|
|
}
|
|
},
|
|
"z": {
|
|
"default": 0,
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Z coordinate in meters or site units."
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"basin": {
|
|
"volume": {
|
|
"default": "1",
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Total volume of empty basin in m3"
|
|
}
|
|
},
|
|
"height": {
|
|
"default": "1",
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Total height of basin in m"
|
|
}
|
|
},
|
|
"levelUnit": {
|
|
"default": "m",
|
|
"rules": {
|
|
"type": "string",
|
|
"description": "Unit used for level related setpoints and thresholds."
|
|
}
|
|
},
|
|
"inflowLevel": {
|
|
"default": 2,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Bottom/invert height of the inlet pipe measured from the basin floor (m)."
|
|
}
|
|
},
|
|
"outflowLevel": {
|
|
"default": 0.2,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Top height of the outlet or pump-suction pipe measured from the basin floor (m)."
|
|
}
|
|
},
|
|
"overflowLevel": {
|
|
"default": 2.5,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Height of the overflow point measured from the basin floor (m)."
|
|
}
|
|
},
|
|
"inletPipeDiameter": {
|
|
"default": 0.4,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Nominal inlet pipe diameter (m)."
|
|
}
|
|
},
|
|
"outletPipeDiameter": {
|
|
"default": 0.4,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Nominal outlet pipe diameter (m)."
|
|
}
|
|
}
|
|
},
|
|
"hydraulics": {
|
|
"maxInflowRate": {
|
|
"default": 200,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Maximum expected inflow during peak events (m3/h)."
|
|
}
|
|
},
|
|
"refHeight": {
|
|
"default": "NAP",
|
|
"rules": {
|
|
"type": "enum",
|
|
"values": [
|
|
{
|
|
"value": "NAP",
|
|
"description": "NAP (Normaal Amsterdams Peil)"
|
|
},
|
|
{
|
|
"value": "EVRF",
|
|
"description": "EVRF (European Vertical Reference Frame)"
|
|
},
|
|
{
|
|
"value": "EGM2008",
|
|
"description": "EGM2008 / EGM96 (satellietmetingen) Geopotentieel model earth "
|
|
}
|
|
|
|
],
|
|
"description": "Reference height to use to identify the height vs other basins with. This will say something more about the expected pressure loss in m head"
|
|
}
|
|
},
|
|
"minHeightBasedOn": {
|
|
"default": "outlet",
|
|
"rules": {
|
|
"type": "enum",
|
|
"values": [
|
|
{
|
|
"value": "inlet",
|
|
"description": "Minimum height is based on inlet elevation."
|
|
},
|
|
{
|
|
"value": "outlet",
|
|
"description": "Minimum height is based on outlet elevation."
|
|
}
|
|
],
|
|
"description": "Basis for minimum height check: inlet or outlet."
|
|
}
|
|
},
|
|
"basinBottomRef": {
|
|
"default": 0,
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Absolute elevation reference of basin bottom."
|
|
}
|
|
},
|
|
"staticHead": {
|
|
"default": 12,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Static head between station suction and discharge point (m)."
|
|
}
|
|
},
|
|
"maxDischargeHead": {
|
|
"default": 24,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Maximum allowable discharge head before calling for alarms (m)."
|
|
}
|
|
},
|
|
"pipelineLength": {
|
|
"default": 80,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Length of the discharge pipeline considered in calculations (m)."
|
|
}
|
|
},
|
|
"defaultFluid": {
|
|
"default": "wastewater",
|
|
"rules": {
|
|
"type": "enum",
|
|
"values": [
|
|
{
|
|
"value": "wastewater",
|
|
"description": "The wet well is primarily cylindrical."
|
|
},
|
|
{
|
|
"value": "water",
|
|
"description": "The wet well is rectangular or box shaped."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"temperatureReferenceDegC": {
|
|
"default": 15,
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Reference fluid temperature for property lookups (degC)."
|
|
}
|
|
}
|
|
},
|
|
"control": {
|
|
"mode": {
|
|
"default": "levelbased",
|
|
"rules": {
|
|
"type": "string",
|
|
"values": [
|
|
{
|
|
"value": "levelbased",
|
|
"description": "Lead and lag pumps are controlled by basin level thresholds."
|
|
},
|
|
{
|
|
"value": "pressureBased",
|
|
"description": "Pumps target a discharge pressure setpoint."
|
|
},
|
|
{
|
|
"value": "flowBased",
|
|
"description": "Pumps modulate to match measured inflow or downstream demand."
|
|
},
|
|
{
|
|
"value": "percentageBased",
|
|
"description": "Pumps operate to maintain basin volume at a target percentage."
|
|
},
|
|
{
|
|
"value":"powerBased",
|
|
"description": "Pumps are controlled based on power consumption.For example, to limit peak power usage or operate within netcongestion limits."
|
|
},
|
|
{
|
|
"value": "hybrid",
|
|
"description": "Combines multiple control strategies for optimized operation."
|
|
},
|
|
{
|
|
"value": "manual",
|
|
"description": "Pumps are operated manually or by an external controller."
|
|
}
|
|
],
|
|
"description": "Primary control philosophy for pump actuation."
|
|
}
|
|
},
|
|
"allowedModes": {
|
|
"default": [
|
|
"levelbased",
|
|
"pressurebased",
|
|
"flowbased",
|
|
"percentagebased",
|
|
"powerbased",
|
|
"manual"
|
|
],
|
|
"rules": {
|
|
"type": "set",
|
|
"itemType": "string",
|
|
"description": "List of control modes that the station is permitted to operate in."
|
|
}
|
|
},
|
|
"levelbased": {
|
|
"minLevel": {
|
|
"default": 1,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"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": {
|
|
"default": 1,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Pump-on threshold and ramp foot. Below this level demand is 0 %; at or above it demand scales 0 → 100 % across [startLevel, maxLevel] using the configured curve (linear or log). When enableShiftedRamp is on, this also serves as the bottom of the held-then-ramp curve during draining."
|
|
}
|
|
},
|
|
"stopLevel": {
|
|
"default": null,
|
|
"rules": {
|
|
"type": "number",
|
|
"nullable": true,
|
|
"min": 0,
|
|
"description": "Optional pump-off threshold. When set, PS sends an explicit turnOffAllMachines command to MGC the moment level drops below stopLevel. Independent of the ramp scaling — does NOT shift where the ramp starts. Pair with a startLevel above stopLevel to get hysteresis (pumps engage at startLevel rising, disengage at stopLevel falling). Must be ≥ minLevel and ≤ startLevel."
|
|
}
|
|
},
|
|
"maxLevel": {
|
|
"default": 4,
|
|
"rules": {
|
|
"type": "number",
|
|
"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) at which the held output starts ramping down during draining. Must be > startLevel and ≤ maxLevel. Ignored when enableShiftedRamp is false."
|
|
}
|
|
},
|
|
"shiftArmPercent": {
|
|
"default": 95,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"max": 100,
|
|
"description": "Output % threshold that arms the shift on the way up. Once armed, the output value at the moment direction flips to draining becomes the held value, and stays held until level drops to shiftLevel. Disarms when level reaches startLevel."
|
|
}
|
|
}
|
|
},
|
|
"pressureBased": {
|
|
"pressureSetpoint": {
|
|
"default": 1000,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"max": 5000,
|
|
"description": "Target discharge pressure when operating in pressure control (kPa)."
|
|
}
|
|
}
|
|
},
|
|
"flowBased": {
|
|
"flowSetpoint": {
|
|
"default": 0,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Target outflow setpoint used by flow-based control (m3/h)."
|
|
}
|
|
},
|
|
"flowDeadband": {
|
|
"default": 0,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Allowed deadband around the outflow setpoint before corrective actions are taken (m3/h)."
|
|
}
|
|
},
|
|
"pid": {
|
|
"default": {},
|
|
"rules": {
|
|
"type": "object",
|
|
"schema": {
|
|
"kp": {
|
|
"default": 1.5,
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Proportional gain for flow-based PID control."
|
|
}
|
|
},
|
|
"ki": {
|
|
"default": 0.05,
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Integral gain for flow-based PID control."
|
|
}
|
|
},
|
|
"kd": {
|
|
"default": 0.01,
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Derivative gain for flow-based PID control."
|
|
}
|
|
},
|
|
"derivativeFilter": {
|
|
"default": 0.2,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"max": 1,
|
|
"description": "Derivative filter coefficient (0..1)."
|
|
}
|
|
},
|
|
"rateUp": {
|
|
"default": 30,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Maximum controller output increase rate (%/s)."
|
|
}
|
|
},
|
|
"rateDown": {
|
|
"default": 40,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Maximum controller output decrease rate (%/s)."
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"equalizationTargetPercent": {
|
|
"default": 60,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"max": 100,
|
|
"description": "Target fill percentage of the basin when operating in equalization mode."
|
|
}
|
|
},
|
|
"flowBalanceTolerance": {
|
|
"default": 5,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Allowable error between inflow and outflow before adjustments are triggered (m3/h)."
|
|
}
|
|
}
|
|
},
|
|
"percentageBased": {
|
|
"targetVolumePercent": {
|
|
"default": 50,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"max": 100,
|
|
"description": "Target basin volume percentage to maintain during percentage-based control."
|
|
}
|
|
},
|
|
"tolerancePercent": {
|
|
"default": 5,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Acceptable deviation from the target volume percentage before corrective action is taken."
|
|
}
|
|
}
|
|
},
|
|
"powerBased": {
|
|
"maxPowerKW": {
|
|
"default": 50,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Maximum allowable power consumption for the pumping station (kW)."
|
|
}
|
|
},
|
|
"powerControlMode": {
|
|
"default": "limit",
|
|
"rules": {
|
|
"type": "enum",
|
|
"values": [
|
|
{
|
|
"value": "limit",
|
|
"description": "Limit pump operation to stay below the max power threshold."
|
|
},
|
|
{
|
|
"value": "optimize",
|
|
"description": "Optimize pump scheduling to minimize power usage while meeting flow demands."
|
|
}
|
|
],
|
|
"description": "Defines how power constraints are managed during operation."
|
|
}
|
|
}
|
|
},
|
|
"manualOverrideTimeoutMinutes": {
|
|
"default": 30,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Duration after which a manual override expires automatically (minutes)."
|
|
}
|
|
}
|
|
},
|
|
"safety": {
|
|
"enableDryRunProtection": {
|
|
"default": true,
|
|
"rules": {
|
|
"type": "boolean",
|
|
"description": "If true, pumps will be prevented from running if basin volume is too low."
|
|
}
|
|
},
|
|
"dryRunThresholdPercent": {
|
|
"default": 2,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"max": 100,
|
|
"description": "Volume percentage below which dry run protection activates."
|
|
}
|
|
},
|
|
"enableOverfillProtection": {
|
|
"default": true,
|
|
"rules": {
|
|
"type": "boolean",
|
|
"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": {
|
|
"default": 98,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"max": 100,
|
|
"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": {
|
|
"default": 0,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Time threshold (seconds) used to predict imminent full or empty conditions."
|
|
}
|
|
}
|
|
},
|
|
"alarms": {
|
|
"default": {
|
|
"highLevel": {
|
|
"enabled": true,
|
|
"threshold": 2.3,
|
|
"delaySeconds": 30,
|
|
"severity": "critical",
|
|
"acknowledgmentRequired": true
|
|
},
|
|
"lowLevel": {
|
|
"enabled": true,
|
|
"threshold": 0.2,
|
|
"delaySeconds": 15,
|
|
"severity": "warning",
|
|
"acknowledgmentRequired": false
|
|
}
|
|
},
|
|
"rules": {
|
|
"type": "object",
|
|
"description": "Alarm configuration for the pumping station.",
|
|
"schema": {
|
|
"highLevel": {
|
|
"default": {
|
|
"enabled": true,
|
|
"threshold": 2.3,
|
|
"delaySeconds": 30,
|
|
"severity": "critical",
|
|
"acknowledgmentRequired": true
|
|
},
|
|
"rules": {
|
|
"type": "object",
|
|
"schema": {
|
|
"enabled": {
|
|
"default": true,
|
|
"rules": {
|
|
"type": "boolean",
|
|
"description": "Enable or disable the high level alarm."
|
|
}
|
|
},
|
|
"threshold": {
|
|
"default": 2.3,
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Level threshold that triggers the high level alarm (m)."
|
|
}
|
|
},
|
|
"delaySeconds": {
|
|
"default": 30,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Delay before issuing the high level alarm (seconds)."
|
|
}
|
|
},
|
|
"severity": {
|
|
"default": "critical",
|
|
"rules": {
|
|
"type": "enum",
|
|
"values": [
|
|
{
|
|
"value": "info",
|
|
"description": "Informational notification."
|
|
},
|
|
{
|
|
"value": "warning",
|
|
"description": "Warning condition requiring attention."
|
|
},
|
|
{
|
|
"value": "critical",
|
|
"description": "Critical alarm requiring immediate intervention."
|
|
}
|
|
],
|
|
"description": "Severity associated with the high level alarm."
|
|
}
|
|
},
|
|
"acknowledgmentRequired": {
|
|
"default": true,
|
|
"rules": {
|
|
"type": "boolean",
|
|
"description": "If true, this alarm must be acknowledged by an operator."
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"lowLevel": {
|
|
"default": {
|
|
"enabled": true,
|
|
"threshold": 0.2,
|
|
"delaySeconds": 15,
|
|
"severity": "warning",
|
|
"acknowledgmentRequired": false
|
|
},
|
|
"rules": {
|
|
"type": "object",
|
|
"schema": {
|
|
"enabled": {
|
|
"default": true,
|
|
"rules": {
|
|
"type": "boolean",
|
|
"description": "Enable or disable the low level alarm."
|
|
}
|
|
},
|
|
"threshold": {
|
|
"default": 0.2,
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Level threshold that triggers the low level alarm (m)."
|
|
}
|
|
},
|
|
"delaySeconds": {
|
|
"default": 15,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Delay before issuing the low level alarm (seconds)."
|
|
}
|
|
},
|
|
"severity": {
|
|
"default": "warning",
|
|
"rules": {
|
|
"type": "enum",
|
|
"values": [
|
|
{
|
|
"value": "info",
|
|
"description": "Informational notification."
|
|
},
|
|
{
|
|
"value": "warning",
|
|
"description": "Warning condition requiring attention."
|
|
},
|
|
{
|
|
"value": "critical",
|
|
"description": "Critical alarm requiring immediate intervention."
|
|
}
|
|
],
|
|
"description": "Severity associated with the low level alarm."
|
|
}
|
|
},
|
|
"acknowledgmentRequired": {
|
|
"default": false,
|
|
"rules": {
|
|
"type": "boolean",
|
|
"description": "If true, this alarm must be acknowledged by an operator."
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"simulation": {
|
|
"enabled": {
|
|
"default": false,
|
|
"rules": {
|
|
"type": "boolean",
|
|
"description": "If true, the station operates in simulation mode using generated inflow and level data."
|
|
}
|
|
},
|
|
"mode": {
|
|
"default": "diurnal",
|
|
"rules": {
|
|
"type": "enum",
|
|
"values": [
|
|
{
|
|
"value": "static",
|
|
"description": "Use constant inflow and level conditions."
|
|
},
|
|
{
|
|
"value": "diurnal",
|
|
"description": "Use a typical diurnal inflow curve to drive simulation."
|
|
},
|
|
{
|
|
"value": "storm",
|
|
"description": "Use an elevated inflow profile representing a storm event."
|
|
}
|
|
],
|
|
"description": "Defines which synthetic profile drives the simulation."
|
|
}
|
|
},
|
|
"seed": {
|
|
"default": 42,
|
|
"rules": {
|
|
"type": "number",
|
|
"description": "Seed used for pseudo-random components in simulation."
|
|
}
|
|
},
|
|
"applyRandomNoise": {
|
|
"default": true,
|
|
"rules": {
|
|
"type": "boolean",
|
|
"description": "If true, adds small noise to simulated measurements."
|
|
}
|
|
},
|
|
"inflowProfile": {
|
|
"default": [
|
|
80,
|
|
110,
|
|
160,
|
|
120,
|
|
90
|
|
],
|
|
"rules": {
|
|
"type": "array",
|
|
"itemType": "number",
|
|
"minLength": 1,
|
|
"description": "Relative inflow profile used when mode is set to diurnal or storm (percentage of design inflow)."
|
|
}
|
|
}
|
|
}
|
|
}
|