forked from RnD/generalFunctions
809 lines
29 KiB
JSON
809 lines
29 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."
|
|
}
|
|
},
|
|
"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."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"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."
|
|
}
|
|
}
|
|
},
|
|
"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."
|
|
}
|
|
},
|
|
"heightInlet": {
|
|
"default": 2,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Height of the inlet pipe measured from the basin floor (m)."
|
|
}
|
|
},
|
|
"heightOutlet": {
|
|
"default": 0.2,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Height of the outlet pipe measured from the basin floor (m)."
|
|
}
|
|
},
|
|
"heightOverflow": {
|
|
"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."
|
|
}
|
|
},
|
|
"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": {
|
|
"startLevel": {
|
|
"default": 1,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "start of pump / group when level reaches this in meters starting from bottom."
|
|
}
|
|
},
|
|
"stopLevel": {
|
|
"default": 1,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "stop of pump / group when level reaches this in meters starting from bottom"
|
|
}
|
|
},
|
|
"minFlowLevel": {
|
|
"default": 1,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "min level to scale the flow lineair"
|
|
}
|
|
},
|
|
"maxFlowLevel": {
|
|
"default": 4,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "max level to scale the flow lineair"
|
|
}
|
|
}
|
|
},
|
|
"pressureBased": {
|
|
"pressureSetpoint": {
|
|
"default": 1000,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"max": 5000,
|
|
"description": "Target discharge pressure when operating in pressure control (kPa)."
|
|
}
|
|
}
|
|
},
|
|
"flowBased": {
|
|
"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."
|
|
}
|
|
},
|
|
"dryRunDebounceSeconds": {
|
|
"default": 30,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Time the low-volume condition must persist before dry-run protection engages (seconds)."
|
|
}
|
|
},
|
|
"enableOverfillProtection": {
|
|
"default": true,
|
|
"rules": {
|
|
"type": "boolean",
|
|
"description": "If true, high level alarms and shutdowns will be enforced to prevent overfilling."
|
|
}
|
|
},
|
|
"overfillThresholdPercent": {
|
|
"default": 98,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"max": 100,
|
|
"description": "Volume percentage above which overfill protection activates."
|
|
}
|
|
},
|
|
"overfillDebounceSeconds": {
|
|
"default": 30,
|
|
"rules": {
|
|
"type": "number",
|
|
"min": 0,
|
|
"description": "Time the high-volume condition must persist before overfill protection engages (seconds)."
|
|
}
|
|
},
|
|
"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)."
|
|
}
|
|
}
|
|
}
|
|
}
|