updates
This commit is contained in:
345
examples/01 - Basic Manual Control.json
Normal file
345
examples/01 - Basic Manual Control.json
Normal file
@@ -0,0 +1,345 @@
|
||||
[
|
||||
{
|
||||
"id": "rm_basic_tab",
|
||||
"type": "tab",
|
||||
"label": "RotatingMachine - Basic Manual Control",
|
||||
"disabled": false,
|
||||
"info": "Demonstrates basic manual control of a single rotatingMachine using inject nodes only. No dashboard dependencies."
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_comment_title",
|
||||
"type": "comment",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "RotatingMachine - Basic Manual Control\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nDemonstrates startup/shutdown sequences, speed setpoint\ncontrol, and pressure simulation for a single pump.\n\nPrerequisites: EVOLV package installed.",
|
||||
"info": "",
|
||||
"x": 360,
|
||||
"y": 40,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_comment_howto",
|
||||
"type": "comment",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "HOW TO USE:\n1. Deploy flow\n2. Click 'Set virtualControl' to enable manual control\n3. Click 'Startup' to run the startup sequence\n4. Click 'Set 60%' to move to 60% speed\n5. Inject BOTH pressure values to see flow/power predictions\n6. Click 'Shutdown' when done\n\nNOTE: Output uses delta compression - only changed\nfields are sent each tick. The formatter merges\ndeltas into a running cache for display.\n\nIMPORTANT: Flow and power predictions require at least\none pressure value to be injected. Without pressure,\npredictions use fDimension=0 (unrealistic values).\nOutput keys use 4-segment format:\ntype.variant.position.childId (e.g. flow.predicted.downstream.default)",
|
||||
"info": "",
|
||||
"x": 360,
|
||||
"y": 100,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_node",
|
||||
"type": "rotatingMachine",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Pump 1",
|
||||
"speed": "1",
|
||||
"startup": "3",
|
||||
"warmup": "2",
|
||||
"shutdown": "3",
|
||||
"cooldown": "2",
|
||||
"movementMode": "staticspeed",
|
||||
"machineCurve": "",
|
||||
"uuid": "example-pump-001",
|
||||
"supplier": "hidrostal",
|
||||
"category": "pump",
|
||||
"assetType": "pump-centrifugal",
|
||||
"model": "hidrostal-H05K-S03R",
|
||||
"unit": "m3/h",
|
||||
"curvePressureUnit": "mbar",
|
||||
"curveFlowUnit": "m3/h",
|
||||
"curvePowerUnit": "kW",
|
||||
"curveControlUnit": "%",
|
||||
"enableLog": true,
|
||||
"logLevel": "info",
|
||||
"positionVsParent": "atEquipment",
|
||||
"positionIcon": "",
|
||||
"hasDistance": false,
|
||||
"distance": "",
|
||||
"distanceUnit": "m",
|
||||
"distanceDescription": "",
|
||||
"x": 560,
|
||||
"y": 340,
|
||||
"wires": [
|
||||
["rm_basic_format_output"],
|
||||
["rm_basic_debug_port1"],
|
||||
["rm_basic_debug_port2"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_mode",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Set virtualControl",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "virtualControl", "vt": "str" }
|
||||
],
|
||||
"topic": "setMode",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 190,
|
||||
"y": 200,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_auto",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Set auto mode",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "auto", "vt": "str" }
|
||||
],
|
||||
"topic": "setMode",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 180,
|
||||
"y": 240,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_startup",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Startup",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execSequence\",\"parameter\":\"startup\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "execSequence",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 170,
|
||||
"y": 300,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_shutdown",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Shutdown",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execSequence\",\"parameter\":\"shutdown\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "execSequence",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 170,
|
||||
"y": 340,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_emergency",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Emergency Stop",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"emergencystop\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "emergencystop",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 190,
|
||||
"y": 380,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_setpoint60",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Set 60%",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execMovement\",\"setpoint\":60}", "vt": "json" }
|
||||
],
|
||||
"topic": "execMovement",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 170,
|
||||
"y": 440,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_setpoint30",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Set 30%",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execMovement\",\"setpoint\":30}", "vt": "json" }
|
||||
],
|
||||
"topic": "execMovement",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 170,
|
||||
"y": 480,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_setpoint100",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Set 100%",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execMovement\",\"setpoint\":100}", "vt": "json" }
|
||||
],
|
||||
"topic": "execMovement",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 170,
|
||||
"y": 520,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_pressure_down",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Sim downstream 1100 mbar",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"type\":\"pressure\",\"position\":\"downstream\",\"value\":1100,\"unit\":\"mbar\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "simulateMeasurement",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 230,
|
||||
"y": 600,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_pressure_up",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Sim upstream 200 mbar",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"type\":\"pressure\",\"position\":\"upstream\",\"value\":200,\"unit\":\"mbar\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "simulateMeasurement",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 220,
|
||||
"y": 640,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_maintenance",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Enter Maintenance",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execSequence\",\"parameter\":\"entermaintenance\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "execSequence",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 200,
|
||||
"y": 700,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_inject_leavemaint",
|
||||
"type": "inject",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Leave Maintenance",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execSequence\",\"parameter\":\"leavemaintenance\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "execSequence",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 200,
|
||||
"y": 740,
|
||||
"wires": [["rm_basic_node"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_format_output",
|
||||
"type": "function",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Merge deltas and format",
|
||||
"func": "const p = msg.payload || {};\nconst cache = context.get('c') || {};\nObject.assign(cache, p);\ncontext.set('c', cache);\nfunction find(prefix) {\n for (var k in cache) { if (k.indexOf(prefix) === 0) return cache[k]; }\n return null;\n}\nconst fl = find('flow.predicted.downstream.');\nconst pw = find('power.predicted.atequipment.');\nconst pD = find('pressure.measured.downstream.');\nconst pU = find('pressure.measured.upstream.');\nmsg.payload = {\n state: cache.state || 'idle',\n mode: cache.mode || 'auto',\n ctrl: cache.ctrl != null ? Number(cache.ctrl).toFixed(1) + '%' : 'n/a',\n flow: fl != null ? Number(fl).toFixed(2) + ' m3/h' : 'n/a',\n power: pw != null ? Number(pw).toFixed(2) + ' kW' : 'n/a',\n NCog: cache.NCog != null ? Number(cache.NCog).toFixed(1) + '%' : 'n/a',\n pDown: pD != null ? Number(pD).toFixed(0) + ' mbar' : 'n/a',\n pUp: pU != null ? Number(pU).toFixed(0) + ' mbar' : 'n/a',\n runtime: cache.runtime != null ? Number(cache.runtime).toFixed(3) + ' h' : '0'\n};\nreturn msg;",
|
||||
"outputs": 1,
|
||||
"noerr": 0,
|
||||
"initialize": "",
|
||||
"finalize": "",
|
||||
"libs": [],
|
||||
"x": 790,
|
||||
"y": 300,
|
||||
"wires": [["rm_basic_debug_port0"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_debug_port0",
|
||||
"type": "debug",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Port 0: Process Data",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": true,
|
||||
"complete": "payload",
|
||||
"targetType": "msg",
|
||||
"statusVal": "payload.state",
|
||||
"statusType": "auto",
|
||||
"x": 1020,
|
||||
"y": 300,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_debug_port1",
|
||||
"type": "debug",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Port 1: InfluxDB Telemetry",
|
||||
"active": false,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "true",
|
||||
"targetType": "full",
|
||||
"x": 1040,
|
||||
"y": 360,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "rm_basic_debug_port2",
|
||||
"type": "debug",
|
||||
"z": "rm_basic_tab",
|
||||
"name": "Port 2: Parent Registration",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "true",
|
||||
"targetType": "full",
|
||||
"x": 1040,
|
||||
"y": 420,
|
||||
"wires": []
|
||||
}
|
||||
]
|
||||
368
examples/02 - Integration with Machine Group.json
Normal file
368
examples/02 - Integration with Machine Group.json
Normal file
@@ -0,0 +1,368 @@
|
||||
[
|
||||
{
|
||||
"id": "rm_int_tab",
|
||||
"type": "tab",
|
||||
"label": "RotatingMachine - Integration with Machine Group",
|
||||
"disabled": false,
|
||||
"info": "Demonstrates a machineGroupControl parent with two rotatingMachine children and a measurement node."
|
||||
},
|
||||
{
|
||||
"id": "rm_int_comment_title",
|
||||
"type": "comment",
|
||||
"z": "rm_int_tab",
|
||||
"name": "RotatingMachine - Integration with Parent\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nShows how rotatingMachine registers with a\nmachineGroupControl parent via Port 2.\nAlso shows a measurement node providing\npressure data to a pump.\n\nPrerequisites: EVOLV package installed.",
|
||||
"info": "",
|
||||
"x": 380,
|
||||
"y": 40,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "rm_int_comment_howto",
|
||||
"type": "comment",
|
||||
"z": "rm_int_tab",
|
||||
"name": "HOW TO USE:\n1. Deploy flow - pumps auto-register with MGC via Port 2\n2. Set Pump 1 to virtualControl, then Startup\n3. Set speed setpoints on individual pumps\n4. Observe MGC aggregating child state on Port 0\n5. Inject pressure measurement to see curve predictions",
|
||||
"info": "",
|
||||
"x": 380,
|
||||
"y": 110,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "rm_int_mgc",
|
||||
"type": "machineGroupControl",
|
||||
"z": "rm_int_tab",
|
||||
"name": "Machine Group",
|
||||
"enableLog": true,
|
||||
"logLevel": "info",
|
||||
"positionVsParent": "atEquipment",
|
||||
"positionIcon": "",
|
||||
"hasDistance": false,
|
||||
"distance": "",
|
||||
"distanceUnit": "m",
|
||||
"x": 570,
|
||||
"y": 300,
|
||||
"wires": [
|
||||
["rm_int_debug_mgc_port0"],
|
||||
["rm_int_debug_mgc_port1"],
|
||||
["rm_int_debug_mgc_port2"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_pump1",
|
||||
"type": "rotatingMachine",
|
||||
"z": "rm_int_tab",
|
||||
"name": "Pump 1",
|
||||
"speed": "1",
|
||||
"startup": "2",
|
||||
"warmup": "1",
|
||||
"shutdown": "2",
|
||||
"cooldown": "1",
|
||||
"movementMode": "staticspeed",
|
||||
"machineCurve": "",
|
||||
"uuid": "example-pump-001",
|
||||
"supplier": "hidrostal",
|
||||
"category": "pump",
|
||||
"assetType": "pump-centrifugal",
|
||||
"model": "hidrostal-H05K-S03R",
|
||||
"unit": "m3/h",
|
||||
"curvePressureUnit": "mbar",
|
||||
"curveFlowUnit": "m3/h",
|
||||
"curvePowerUnit": "kW",
|
||||
"curveControlUnit": "%",
|
||||
"enableLog": true,
|
||||
"logLevel": "info",
|
||||
"positionVsParent": "atEquipment",
|
||||
"positionIcon": "",
|
||||
"hasDistance": false,
|
||||
"distance": "",
|
||||
"distanceUnit": "m",
|
||||
"distanceDescription": "",
|
||||
"x": 570,
|
||||
"y": 480,
|
||||
"wires": [
|
||||
["rm_int_debug_p1_port0"],
|
||||
[],
|
||||
["rm_int_mgc"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_pump2",
|
||||
"type": "rotatingMachine",
|
||||
"z": "rm_int_tab",
|
||||
"name": "Pump 2",
|
||||
"speed": "1",
|
||||
"startup": "2",
|
||||
"warmup": "1",
|
||||
"shutdown": "2",
|
||||
"cooldown": "1",
|
||||
"movementMode": "staticspeed",
|
||||
"machineCurve": "",
|
||||
"uuid": "example-pump-002",
|
||||
"supplier": "hidrostal",
|
||||
"category": "pump",
|
||||
"assetType": "pump-centrifugal",
|
||||
"model": "hidrostal-H05K-S03R",
|
||||
"unit": "m3/h",
|
||||
"curvePressureUnit": "mbar",
|
||||
"curveFlowUnit": "m3/h",
|
||||
"curvePowerUnit": "kW",
|
||||
"curveControlUnit": "%",
|
||||
"enableLog": true,
|
||||
"logLevel": "info",
|
||||
"positionVsParent": "atEquipment",
|
||||
"positionIcon": "",
|
||||
"hasDistance": false,
|
||||
"distance": "",
|
||||
"distanceUnit": "m",
|
||||
"distanceDescription": "",
|
||||
"x": 570,
|
||||
"y": 620,
|
||||
"wires": [
|
||||
["rm_int_debug_p2_port0"],
|
||||
[],
|
||||
["rm_int_mgc"]
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_inject_mode_p1",
|
||||
"type": "inject",
|
||||
"z": "rm_int_tab",
|
||||
"name": "P1: virtualControl",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "virtualControl", "vt": "str" }
|
||||
],
|
||||
"topic": "setMode",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 200,
|
||||
"y": 440,
|
||||
"wires": [["rm_int_pump1"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_inject_start_p1",
|
||||
"type": "inject",
|
||||
"z": "rm_int_tab",
|
||||
"name": "P1: Startup",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execSequence\",\"parameter\":\"startup\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "execSequence",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 180,
|
||||
"y": 480,
|
||||
"wires": [["rm_int_pump1"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_inject_setpoint_p1",
|
||||
"type": "inject",
|
||||
"z": "rm_int_tab",
|
||||
"name": "P1: Set 75%",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execMovement\",\"setpoint\":75}", "vt": "json" }
|
||||
],
|
||||
"topic": "execMovement",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 180,
|
||||
"y": 520,
|
||||
"wires": [["rm_int_pump1"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_inject_mode_p2",
|
||||
"type": "inject",
|
||||
"z": "rm_int_tab",
|
||||
"name": "P2: virtualControl",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "virtualControl", "vt": "str" }
|
||||
],
|
||||
"topic": "setMode",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 200,
|
||||
"y": 580,
|
||||
"wires": [["rm_int_pump2"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_inject_start_p2",
|
||||
"type": "inject",
|
||||
"z": "rm_int_tab",
|
||||
"name": "P2: Startup",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execSequence\",\"parameter\":\"startup\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "execSequence",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 180,
|
||||
"y": 620,
|
||||
"wires": [["rm_int_pump2"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_inject_setpoint_p2",
|
||||
"type": "inject",
|
||||
"z": "rm_int_tab",
|
||||
"name": "P2: Set 50%",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execMovement\",\"setpoint\":50}", "vt": "json" }
|
||||
],
|
||||
"topic": "execMovement",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 180,
|
||||
"y": 660,
|
||||
"wires": [["rm_int_pump2"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_inject_pressure",
|
||||
"type": "inject",
|
||||
"z": "rm_int_tab",
|
||||
"name": "P1: Sim downstream 900 mbar",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"type\":\"pressure\",\"position\":\"downstream\",\"value\":900,\"unit\":\"mbar\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "simulateMeasurement",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 240,
|
||||
"y": 740,
|
||||
"wires": [["rm_int_pump1"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_inject_shutdown_p1",
|
||||
"type": "inject",
|
||||
"z": "rm_int_tab",
|
||||
"name": "P1: Shutdown",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execSequence\",\"parameter\":\"shutdown\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "execSequence",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 190,
|
||||
"y": 780,
|
||||
"wires": [["rm_int_pump1"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_inject_shutdown_p2",
|
||||
"type": "inject",
|
||||
"z": "rm_int_tab",
|
||||
"name": "P2: Shutdown",
|
||||
"props": [
|
||||
{ "p": "topic", "vt": "str" },
|
||||
{ "p": "payload", "v": "{\"source\":\"GUI\",\"action\":\"execSequence\",\"parameter\":\"shutdown\"}", "vt": "json" }
|
||||
],
|
||||
"topic": "execSequence",
|
||||
"repeat": "",
|
||||
"crontab": "",
|
||||
"once": false,
|
||||
"onceDelay": "",
|
||||
"x": 190,
|
||||
"y": 820,
|
||||
"wires": [["rm_int_pump2"]]
|
||||
},
|
||||
{
|
||||
"id": "rm_int_debug_mgc_port0",
|
||||
"type": "debug",
|
||||
"z": "rm_int_tab",
|
||||
"name": "MGC Port 0: Group State",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": true,
|
||||
"complete": "payload",
|
||||
"targetType": "msg",
|
||||
"statusVal": "payload",
|
||||
"statusType": "auto",
|
||||
"x": 830,
|
||||
"y": 260,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "rm_int_debug_mgc_port1",
|
||||
"type": "debug",
|
||||
"z": "rm_int_tab",
|
||||
"name": "MGC Port 1: InfluxDB",
|
||||
"active": false,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "true",
|
||||
"targetType": "full",
|
||||
"x": 820,
|
||||
"y": 300,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "rm_int_debug_mgc_port2",
|
||||
"type": "debug",
|
||||
"z": "rm_int_tab",
|
||||
"name": "MGC Port 2: Parent",
|
||||
"active": true,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": false,
|
||||
"complete": "true",
|
||||
"targetType": "full",
|
||||
"x": 810,
|
||||
"y": 340,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "rm_int_debug_p1_port0",
|
||||
"type": "debug",
|
||||
"z": "rm_int_tab",
|
||||
"name": "P1 Port 0: Process",
|
||||
"active": false,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": true,
|
||||
"complete": "payload",
|
||||
"targetType": "msg",
|
||||
"statusVal": "payload.state",
|
||||
"statusType": "auto",
|
||||
"x": 810,
|
||||
"y": 460,
|
||||
"wires": []
|
||||
},
|
||||
{
|
||||
"id": "rm_int_debug_p2_port0",
|
||||
"type": "debug",
|
||||
"z": "rm_int_tab",
|
||||
"name": "P2 Port 0: Process",
|
||||
"active": false,
|
||||
"tosidebar": true,
|
||||
"console": false,
|
||||
"tostatus": true,
|
||||
"complete": "payload",
|
||||
"targetType": "msg",
|
||||
"statusVal": "payload.state",
|
||||
"statusType": "auto",
|
||||
"x": 810,
|
||||
"y": 600,
|
||||
"wires": []
|
||||
}
|
||||
]
|
||||
1026
examples/03 - Dashboard Visualization.json
Normal file
1026
examples/03 - Dashboard Visualization.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,49 +1,53 @@
|
||||
# RotatingMachine Example Flows
|
||||
|
||||
These flows are import-ready Node-RED examples focused on the `rotatingMachine` node.
|
||||
These flows are import-ready Node-RED examples for the `rotatingMachine` node.
|
||||
In Node-RED: **Import > Examples > EVOLV** to find them.
|
||||
|
||||
## Files
|
||||
## Example Flows
|
||||
|
||||
- `basic.flow.json`
|
||||
Purpose: quick manual control + local visualization.
|
||||
Includes:
|
||||
- mode selection
|
||||
- startup/shutdown/emergency buttons
|
||||
- setpoint control
|
||||
- simulated upstream/downstream pressure input
|
||||
- local charts for predicted flow/power/ctrl
|
||||
### 01 - Basic Manual Control
|
||||
**Dependencies:** EVOLV only (no dashboard)
|
||||
|
||||
- `integration.flow.json`
|
||||
Purpose: richer scenario testing from dashboard controls.
|
||||
Includes:
|
||||
- sequence controls (startup/shutdown/maintenance)
|
||||
- direct setpoint + flowMovement commands
|
||||
- simulated pressure inputs
|
||||
- charts for flow, power, NCog%
|
||||
- state snapshot text
|
||||
Inject-based flow demonstrating all core functionality:
|
||||
- Mode switching (auto / virtualControl / fysicalControl)
|
||||
- Startup/shutdown/emergency sequences
|
||||
- Speed setpoint control (30%, 60%, 100%)
|
||||
- Pressure simulation (upstream + downstream)
|
||||
- Maintenance mode enter/leave
|
||||
- Debug outputs on all 3 ports
|
||||
|
||||
- `edge.flow.json`
|
||||
Purpose: intentionally send invalid/boundary inputs and observe behavior.
|
||||
Includes:
|
||||
- invalid mode command
|
||||
- negative setpoint command
|
||||
- disallowed source sequence command
|
||||
- unsupported simulated measurement type
|
||||
- debug outputs for process/influx/parent channels
|
||||
### 02 - Integration with Machine Group
|
||||
**Dependencies:** EVOLV only (no dashboard)
|
||||
|
||||
## Requirements
|
||||
Parent-child relationship demo:
|
||||
- machineGroupControl parent with 2x rotatingMachine children
|
||||
- Auto-registration via Port 2 on deploy
|
||||
- Independent pump control with group-level aggregation
|
||||
- Pressure simulation on individual pumps
|
||||
|
||||
- EVOLV rotatingMachine node installed/available in Node-RED.
|
||||
- FlowFuse Dashboard 2 nodes installed (`ui-base`, `ui-page`, `ui-group`, etc.).
|
||||
### 03 - Dashboard Visualization
|
||||
**Dependencies:** EVOLV + @flowfuse/node-red-dashboard
|
||||
|
||||
Interactive FlowFuse dashboard with:
|
||||
- Mode dropdown, startup/shutdown/emergency buttons
|
||||
- Speed setpoint input, pressure simulation inputs
|
||||
- Real-time charts: flow, power, ctrl%, NCog, state code, pressure
|
||||
|
||||
## Legacy Files
|
||||
|
||||
The following files are from the original flow set and will be removed in a future release:
|
||||
- `basic.flow.json` → replaced by `01 - Basic Manual Control.json`
|
||||
- `integration.flow.json` → replaced by `02 - Integration with Machine Group.json`
|
||||
- `edge.flow.json` → edge-case testing (inject-based)
|
||||
|
||||
## Import
|
||||
|
||||
1. In Node-RED, use `Import` and select one of the `*.flow.json` files.
|
||||
2. Deploy.
|
||||
3. Open the dashboard page path configured in the flow.
|
||||
1. In Node-RED, use **Import > Examples > EVOLV** (auto-discovered)
|
||||
2. Or manually: **Import > Clipboard** and paste the `.json` file contents
|
||||
3. Deploy
|
||||
|
||||
## Notes
|
||||
|
||||
- These examples are manual by design: no auto-start on deploy.
|
||||
- Pressure simulation uses `msg.topic = "simulateMeasurement"` handled by the rotatingMachine wrapper.
|
||||
- Output graphs are based on the rotatingMachine process output payload fields.
|
||||
- Tier 1 and 2 examples have zero dashboard dependencies — they work on any Node-RED install with EVOLV
|
||||
- Tier 3 requires `@flowfuse/node-red-dashboard` (included in EVOLV's package.json dependencies)
|
||||
- All examples use `enableLog: true` so you can observe behavior in the Node-RED debug panel
|
||||
|
||||
Reference in New Issue
Block a user