[ { "id": "77f00aef1c966167", "type": "tab", "label": "PumpingStation - Basic", "disabled": false, "info": "Tier 1: single pumpingStation node driven by inject nodes only. Demonstrates the canonical Phase-2 topic API: set.mode, set.inflow, set.demand." }, { "id": "aa3381b896eb2cfb", "type": "group", "z": "77f00aef1c966167", "name": "Pumping Station (Process Cell)", "style": { "label": true, "stroke": "#000000", "fill": "#0c99d9", "fill-opacity": "0.10" }, "nodes": [ "8e78b6607deb33a7" ], "x": 534, "y": 351.5, "w": 232, "h": 97 }, { "id": "4996420d47442fad", "type": "group", "z": "77f00aef1c966167", "name": "1. Control mode", "style": { "stroke": "#666666", "fill": "#ffdf7f", "fill-opacity": "0.15", "label": true, "color": "#333333" }, "nodes": [ "1155bbbde7c65363", "e9bea0f95b557f5d" ], "x": 94, "y": 119, "w": 272, "h": 122 }, { "id": "a9f9b38b0e00c1d7", "type": "group", "z": "77f00aef1c966167", "name": "2. Flow signals (inflow / outflow)", "style": { "stroke": "#666666", "fill": "#ffdf7f", "fill-opacity": "0.15", "label": true, "color": "#333333" }, "nodes": [ "7b2b5eb919b1ab15", "3350187815774b95" ], "x": 94, "y": 279, "w": 262, "h": 122 }, { "id": "42bf82c87d05f498", "type": "group", "z": "77f00aef1c966167", "name": "3. Operator demand (manual mode only)", "style": { "stroke": "#666666", "fill": "#ffdf7f", "fill-opacity": "0.15", "label": true, "color": "#333333" }, "nodes": [ "48c2262c345c46b9" ], "x": 94, "y": 479, "w": 261, "h": 82 }, { "id": "234bdce20170061a", "type": "group", "z": "77f00aef1c966167", "name": "4. Calibration", "style": { "stroke": "#666666", "fill": "#ffdf7f", "fill-opacity": "0.15", "label": true, "color": "#333333" }, "nodes": [ "463eefdd54df89a5", "2e0642275899fc79" ], "x": 94, "y": 599, "w": 272, "h": 122 }, { "id": "f4ba4542514ed853", "type": "group", "z": "77f00aef1c966167", "name": "Expected outputs", "style": { "stroke": "#666666", "fill": "#d1d1d1", "fill-opacity": "0.2", "label": true, "color": "#333333" }, "nodes": [ "b2450e5ee2eebfaa", "386af1ad8aa8ed12", "c27c2655f199b530" ], "x": 874, "y": 299, "w": 252, "h": 202 }, { "id": "b30af582f935bcb7", "type": "comment", "z": "77f00aef1c966167", "name": "PumpingStation — Basic (Tier 1)", "info": "Single pumpingStation node driven by inject buttons. Shows the canonical msg.topic command surface.\n\nDefault controlMode = levelbased. Switch to manual to honour set.demand.\n\nHOW TO USE\n1. Deploy the flow.\n2. (optional) Click \"set.mode = manual\" if you want set.demand to forward; otherwise leave it on levelbased and the ramp drives demand from level.\n3. Click \"set.inflow = 60 m³/h\" to push wastewater into the basin.\n4. Watch the basin fill on Port 0 (level, volume rise) and Port 1 (InfluxDB-shaped payload).\n5. In manual mode: click \"set.demand = 40\" — the value surfaces as `manualDemand` on Port 0/1 and in the node status badge.\n6. Click \"calibrate volume 25 m³\" or \"calibrate level 1.5 m\" to snap the predicted-volume integrator.\n\nPORTS\n- Port 0: process output (changed fields only)\n- Port 1: InfluxDB-shaped {measurement, fields, tags, timestamp}\n- Port 2: parent registration (child handshake)", "x": 650, "y": 300, "wires": [] }, { "id": "1155bbbde7c65363", "type": "inject", "z": "77f00aef1c966167", "g": "4996420d47442fad", "name": "set.mode = manual", "props": [ { "p": "topic", "vt": "str" }, { "p": "payload", "v": "manual", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": "", "topic": "set.mode", "x": 230, "y": 160, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "e9bea0f95b557f5d", "type": "inject", "z": "77f00aef1c966167", "g": "4996420d47442fad", "name": "set.mode = levelbased", "props": [ { "p": "topic", "vt": "str" }, { "p": "payload", "v": "levelbased", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": "", "topic": "set.mode", "x": 240, "y": 200, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "7b2b5eb919b1ab15", "type": "inject", "z": "77f00aef1c966167", "g": "a9f9b38b0e00c1d7", "name": "set.inflow = 60 m3/h", "props": [ { "p": "topic", "vt": "str" }, { "p": "payload", "v": "60", "vt": "num" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": "", "topic": "set.inflow", "x": 240, "y": 360, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "48c2262c345c46b9", "type": "inject", "z": "77f00aef1c966167", "g": "42bf82c87d05f498", "name": "set.demand = 40 %", "props": [ { "p": "topic", "vt": "str" }, { "p": "payload", "v": "40", "vt": "num" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": "", "topic": "set.demand", "x": 230, "y": 520, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "463eefdd54df89a5", "type": "inject", "z": "77f00aef1c966167", "g": "234bdce20170061a", "name": "calibrate volume 25 m3", "props": [ { "p": "topic", "vt": "str" }, { "p": "payload", "v": "25", "vt": "num" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": "", "topic": "cmd.calibrate.volume", "x": 240, "y": 640, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "2e0642275899fc79", "type": "inject", "z": "77f00aef1c966167", "g": "234bdce20170061a", "name": "calibrate level 1.5 m", "props": [ { "p": "topic", "vt": "str" }, { "p": "payload", "v": "1.5", "vt": "num" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": "", "topic": "cmd.calibrate.level", "x": 240, "y": 680, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "b2450e5ee2eebfaa", "type": "debug", "z": "77f00aef1c966167", "g": "f4ba4542514ed853", "name": "Port 0: Process", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "x": 980, "y": 340, "wires": [] }, { "id": "386af1ad8aa8ed12", "type": "debug", "z": "77f00aef1c966167", "g": "f4ba4542514ed853", "name": "Port 1: InfluxDB", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "x": 980, "y": 400, "wires": [] }, { "id": "c27c2655f199b530", "type": "debug", "z": "77f00aef1c966167", "g": "f4ba4542514ed853", "name": "Port 2: Parent reg", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "x": 990, "y": 460, "wires": [] }, { "id": "8e78b6607deb33a7", "type": "pumpingStation", "z": "77f00aef1c966167", "g": "aa3381b896eb2cfb", "name": "", "simulator": false, "basinVolume": 50, "basinHeight": 4, "inflowLevel": 1.5, "outflowLevel": 0.2, "overflowLevel": 3.8, "defaultFluid": "wastewater", "inletPipeDiameter": 0.3, "outletPipeDiameter": 0.3, "pipelineLength": 80, "maxDischargeHead": 24, "staticHead": 12, "maxInflowRate": 200, "temperatureReferenceDegC": 15, "timeleftToFullOrEmptyThresholdSeconds": 0, "enableDryRunProtection": true, "enableHighVolumeSafety": true, "enableOverfillProtection": true, "dryRunThresholdPercent": 2, "highVolumeSafetyThresholdPercent": 98, "overfillThresholdPercent": 98, "minHeightBasedOn": "outlet", "processOutputFormat": "process", "dbaseOutputFormat": "influxdb", "refHeight": "NAP", "basinBottomRef": 1, "uuid": "", "supplier": "", "category": "", "assetType": "", "model": "", "unit": "", "enableLog": false, "logLevel": "error", "positionVsParent": "atEquipment", "positionIcon": "⊥", "hasDistance": false, "distance": "", "controlMode": "levelbased", "levelCurveType": "linear", "logCurveFactor": 9, "enableShiftedRamp": false, "shiftLevel": 0, "shiftArmPercent": 95, "startLevel": 1, "stopLevel": 0.5, "minLevel": 0.20400000000000001, "maxLevel": 3.8, "flowSetpoint": null, "flowDeadband": null, "x": 650, "y": 400, "wires": [ [ "b2450e5ee2eebfaa" ], [ "386af1ad8aa8ed12" ], [ "c27c2655f199b530" ] ] }, { "id": "3350187815774b95", "type": "inject", "z": "77f00aef1c966167", "g": "a9f9b38b0e00c1d7", "name": "set.outflow= 80 m3/h", "props": [ { "p": "topic", "vt": "str" }, { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": "", "topic": "set.outflow", "payload": "80", "payloadType": "num", "x": 230, "y": 320, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "ef77c1819422a098", "type": "global-config", "env": [], "modules": { "EVOLV": "1.0.29" } } ]