From 5c41dc44a3ef605011da7c6dea6a596de36918d6 Mon Sep 17 00:00:00 2001
From: "p.vanderwilt"
Date: Thu, 6 Nov 2025 15:46:43 +0100
Subject: [PATCH 1/7] Clean up unused code
---
additional_nodes/recirculation-pump.html | 57 -
additional_nodes/recirculation-pump.js | 40 -
additional_nodes/settling-basin.html | 57 -
additional_nodes/settling-basin.js | 57 -
flows/asm3_flows.json | 1763 ----------------------
package-lock.json | 119 --
package.json | 5 +-
7 files changed, 2 insertions(+), 2096 deletions(-)
delete mode 100644 additional_nodes/recirculation-pump.html
delete mode 100644 additional_nodes/recirculation-pump.js
delete mode 100644 additional_nodes/settling-basin.html
delete mode 100644 additional_nodes/settling-basin.js
delete mode 100644 flows/asm3_flows.json
delete mode 100644 package-lock.json
diff --git a/additional_nodes/recirculation-pump.html b/additional_nodes/recirculation-pump.html
deleted file mode 100644
index 39a3753..0000000
--- a/additional_nodes/recirculation-pump.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
diff --git a/additional_nodes/recirculation-pump.js b/additional_nodes/recirculation-pump.js
deleted file mode 100644
index 2a02932..0000000
--- a/additional_nodes/recirculation-pump.js
+++ /dev/null
@@ -1,40 +0,0 @@
-module.exports = function(RED) {
- function recirculation(config) {
- RED.nodes.createNode(this, config);
- var node = this;
-
- let name = config.name;
- let F2 = parseFloat(config.F2);
- const inlet_F2 = parseInt(config.inlet);
-
- node.on('input', function(msg, send, done) {
- switch (msg.topic) {
- case "Fluent":
- // conserve volume flow debit
- let F_in = msg.payload.F;
- let F1 = Math.max(F_in - F2, 0);
- let F2_corr = F_in < F2 ? F_in : F2;
-
- let msg_F1 = structuredClone(msg);
- msg_F1.payload.F = F1;
-
- let msg_F2 = {...msg};
- msg_F2.payload.F = F2_corr;
- msg_F2.payload.inlet = inlet_F2;
-
- send([msg_F1, msg_F2]);
- break;
- case "clock":
- break;
- default:
- console.log("Unknown topic: " + msg.topic);
- }
-
- if (done) {
- done();
- }
- });
-
- }
- RED.nodes.registerType("recirculation-pump", recirculation);
-};
diff --git a/additional_nodes/settling-basin.html b/additional_nodes/settling-basin.html
deleted file mode 100644
index e8e8e8d..0000000
--- a/additional_nodes/settling-basin.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
diff --git a/additional_nodes/settling-basin.js b/additional_nodes/settling-basin.js
deleted file mode 100644
index dd3d697..0000000
--- a/additional_nodes/settling-basin.js
+++ /dev/null
@@ -1,57 +0,0 @@
-module.exports = function(RED) {
- function settler(config) {
- RED.nodes.createNode(this, config);
- var node = this;
-
- let name = config.name;
- let TS_set = parseFloat(config.TS_set);
- const inlet_sludge = parseInt(config.inlet);
-
- node.on('input', function(msg, send, done) {
- switch (msg.topic) {
- case "Fluent":
- // conserve volume flow debit
- let F_in = msg.payload.F;
- let C_in = msg.payload.C;
- let F2 = (F_in * C_in[12]) / TS_set;
-
- let F1 = Math.max(F_in - F2, 0);
- let F2_corr = F_in < F2 ? F_in : F2;
-
- let msg_F1 = structuredClone(msg);
- msg_F1.payload.F = F1;
- msg_F1.payload.C[7] = 0;
- msg_F1.payload.C[8] = 0;
- msg_F1.payload.C[9] = 0;
- msg_F1.payload.C[10] = 0;
- msg_F1.payload.C[11] = 0;
- msg_F1.payload.C[12] = 0;
-
- let msg_F2 = {...msg};
- msg_F2.payload.F = F2_corr;
- if (F2_corr > 0) {
- msg_F2.payload.C[7] = F_in * C_in[7] / F2;
- msg_F2.payload.C[8] = F_in * C_in[8] / F2;
- msg_F2.payload.C[9] = F_in * C_in[9] / F2;
- msg_F2.payload.C[10] = F_in * C_in[10] / F2;
- msg_F2.payload.C[11] = F_in * C_in[11] / F2;
- msg_F2.payload.C[12] = F_in * C_in[12] / F2;
- }
- msg_F2.payload.inlet = inlet_sludge;
-
- send([msg_F1, msg_F2]);
- break;
- case "clock":
- break;
- default:
- console.log("Unknown topic: " + msg.topic);
- }
-
- if (done) {
- done();
- }
- });
-
- }
- RED.nodes.registerType("settling-basin", settler);
-};
diff --git a/flows/asm3_flows.json b/flows/asm3_flows.json
deleted file mode 100644
index 7f6d216..0000000
--- a/flows/asm3_flows.json
+++ /dev/null
@@ -1,1763 +0,0 @@
-[
- {
- "id": "31bba0914516dd85",
- "type": "tab",
- "label": "Flow 2",
- "disabled": true,
- "info": "",
- "env": []
- },
- {
- "id": "0abdac5260d9553e",
- "type": "tab",
- "label": "Flow 1",
- "disabled": false,
- "info": "",
- "env": []
- },
- {
- "id": "394f713d4e71366c",
- "type": "tab",
- "label": "Flow 4",
- "disabled": true,
- "info": "",
- "env": []
- },
- {
- "id": "2c8bcaa0046b4323",
- "type": "ui-theme",
- "name": "Default",
- "colors": {
- "surface": "#ffffff",
- "primary": "#0094ce",
- "bgPage": "#eeeeee",
- "groupBg": "#ffffff",
- "groupOutline": "#cccccc"
- },
- "sizes": {
- "density": "default",
- "pagePadding": "12px",
- "groupGap": "12px",
- "groupBorderRadius": "4px",
- "widgetGap": "12px"
- }
- },
- {
- "id": "ac25cd90dc999a5a",
- "type": "ui-base",
- "name": "UI Name",
- "path": "/dashboard",
- "appIcon": "",
- "includeClientData": true,
- "acceptsClientConfig": [
- "ui-notification",
- "ui-control"
- ],
- "showPathInSidebar": false,
- "headerContent": "page",
- "navigationStyle": "default",
- "titleBarStyle": "default",
- "showReconnectNotification": true,
- "notificationDisplayTime": 1,
- "showDisconnectNotification": true,
- "allowInstall": true
- },
- {
- "id": "ec4a923c5ead6278",
- "type": "ui-page",
- "name": "Dashboard",
- "ui": "ac25cd90dc999a5a",
- "path": "/page1",
- "icon": "home",
- "layout": "grid",
- "theme": "2c8bcaa0046b4323",
- "breakpoints": [
- {
- "name": "Default",
- "px": "0",
- "cols": "3"
- },
- {
- "name": "Tablet",
- "px": "576",
- "cols": "6"
- },
- {
- "name": "Small Desktop",
- "px": "768",
- "cols": "9"
- },
- {
- "name": "Desktop",
- "px": "1024",
- "cols": "12"
- }
- ],
- "order": -1,
- "className": "",
- "visible": "true",
- "disabled": "false"
- },
- {
- "id": "58b5e9368ec5774b",
- "type": "ui-group",
- "name": "Group 1",
- "page": "ec4a923c5ead6278",
- "width": 6,
- "height": 1,
- "order": -1,
- "showTitle": true,
- "className": "",
- "visible": "true",
- "disabled": "false",
- "groupType": "default"
- },
- {
- "id": "14172c57f4c6ff14",
- "type": "ui-group",
- "name": "Group 2",
- "page": "ec4a923c5ead6278",
- "width": 6,
- "height": 1,
- "order": -1,
- "showTitle": true,
- "className": "",
- "visible": "true",
- "disabled": "false",
- "groupType": "default"
- },
- {
- "id": "ca564642bfc5606c",
- "type": "ui-page",
- "name": "PFR",
- "ui": "ac25cd90dc999a5a",
- "path": "/page2",
- "icon": "home",
- "layout": "grid",
- "theme": "2c8bcaa0046b4323",
- "breakpoints": [
- {
- "name": "Default",
- "px": "0",
- "cols": "3"
- },
- {
- "name": "Tablet",
- "px": "576",
- "cols": "6"
- },
- {
- "name": "Small Desktop",
- "px": "768",
- "cols": "9"
- },
- {
- "name": "Desktop",
- "px": "1024",
- "cols": "12"
- }
- ],
- "order": -1,
- "className": "",
- "visible": "true",
- "disabled": "false"
- },
- {
- "id": "ae38454098a37db0",
- "type": "ui-group",
- "name": "Group 3",
- "page": "ca564642bfc5606c",
- "width": 6,
- "height": 1,
- "order": -1,
- "showTitle": true,
- "className": "",
- "visible": "true",
- "disabled": "false",
- "groupType": "default"
- },
- {
- "id": "de8b029d69f26c0e",
- "type": "ui-group",
- "name": "Group 4",
- "page": "ca564642bfc5606c",
- "width": 6,
- "height": 1,
- "order": -1,
- "showTitle": true,
- "className": "",
- "visible": "true",
- "disabled": "false",
- "groupType": "default"
- },
- {
- "id": "f7803caf86a911f6",
- "type": "inject",
- "z": "31bba0914516dd85",
- "name": "",
- "props": [
- {
- "p": "timestamp",
- "v": "",
- "vt": "date"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "1",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "clock",
- "x": 200,
- "y": 340,
- "wires": [
- [
- "5266f4e09e7b919b"
- ]
- ]
- },
- {
- "id": "98f5ffa4bed3b99f",
- "type": "inject",
- "z": "31bba0914516dd85",
- "name": "Influx composition",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- },
- {
- "p": "timestamp",
- "v": "",
- "vt": "date"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": "5",
- "topic": "Fluent",
- "payload": "{\"inlet\":0,\"F\":1000,\"C\":[0,30,100,16,0,0,5,25,75,30,0,0,125]}",
- "payloadType": "json",
- "x": 170,
- "y": 260,
- "wires": [
- [
- "5266f4e09e7b919b"
- ]
- ]
- },
- {
- "id": "f1b3cffbd2d38473",
- "type": "ui-chart",
- "z": "31bba0914516dd85",
- "group": "14172c57f4c6ff14",
- "name": "Effluent",
- "label": "Effluent",
- "order": 9007199254740991,
- "chartType": "line",
- "category": "Series",
- "categoryType": "property",
- "xAxisLabel": "",
- "xAxisProperty": "",
- "xAxisPropertyType": "timestamp",
- "xAxisType": "time",
- "xAxisFormat": "",
- "xAxisFormatType": "auto",
- "xmin": "",
- "xmax": "",
- "yAxisLabel": "",
- "yAxisProperty": "Y",
- "yAxisPropertyType": "property",
- "ymin": "",
- "ymax": "",
- "bins": 10,
- "action": "append",
- "stackSeries": false,
- "pointShape": "circle",
- "pointRadius": 4,
- "showLegend": true,
- "removeOlder": "8",
- "removeOlderUnit": "3600",
- "removeOlderPoints": "2000",
- "colors": [
- "#0095ff",
- "#ff0000",
- "#ff7f0e",
- "#2ca02c",
- "#a347e1",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "textColor": [
- "#666666"
- ],
- "textColorDefault": true,
- "gridColor": [
- "#e5e5e5"
- ],
- "gridColorDefault": true,
- "width": 6,
- "height": 8,
- "className": "",
- "interpolation": "linear",
- "x": 1420,
- "y": 300,
- "wires": [
- []
- ]
- },
- {
- "id": "fc4aa2928bdbe228",
- "type": "function",
- "z": "31bba0914516dd85",
- "name": "Data_converter",
- "func": "if (msg.topic != \"Fluent\") {\n return;\n}\n\nconst [S_O, S_I, S_S, S_NH, S_N2, S_NO, S_HCO, X_I, X_S, X_H, X_STO, X_A, X_TS] = msg.payload.C;\n\nmsg = {payload: [\n { \"Series\": \"S_O\", \"Y\": S_O},\n { \"Series\": \"S_I\", \"Y\": S_I},\n { \"Series\": \"S_S\", \"Y\": S_S},\n { \"Series\": \"S_NH\", \"Y\": S_NH},\n { \"Series\": \"S_N2\", \"Y\": S_N2},\n { \"Series\": \"S_NO\", \"Y\": S_NO},\n { \"Series\": \"S_HCO\", \"Y\": S_HCO}\n ]};\n\nreturn msg;",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1220,
- "y": 300,
- "wires": [
- [
- "f1b3cffbd2d38473"
- ]
- ]
- },
- {
- "id": "e955d0c2d3246c4b",
- "type": "ui-chart",
- "z": "31bba0914516dd85",
- "group": "58b5e9368ec5774b",
- "name": "Anoxic reactor",
- "label": "Anoxic reactor",
- "order": 9007199254740991,
- "chartType": "line",
- "category": "Series",
- "categoryType": "property",
- "xAxisLabel": "",
- "xAxisProperty": "",
- "xAxisPropertyType": "timestamp",
- "xAxisType": "time",
- "xAxisFormat": "",
- "xAxisFormatType": "auto",
- "xmin": "",
- "xmax": "",
- "yAxisLabel": "",
- "yAxisProperty": "Y",
- "yAxisPropertyType": "property",
- "ymin": "",
- "ymax": "",
- "bins": 10,
- "action": "append",
- "stackSeries": false,
- "pointShape": "circle",
- "pointRadius": 4,
- "showLegend": true,
- "removeOlder": "8",
- "removeOlderUnit": "3600",
- "removeOlderPoints": "2000",
- "colors": [
- "#0095ff",
- "#ff0000",
- "#ff7f0e",
- "#2ca02c",
- "#a347e1",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "textColor": [
- "#666666"
- ],
- "textColorDefault": true,
- "gridColor": [
- "#e5e5e5"
- ],
- "gridColorDefault": true,
- "width": 6,
- "height": 8,
- "className": "",
- "interpolation": "linear",
- "x": 1040,
- "y": 180,
- "wires": [
- []
- ]
- },
- {
- "id": "59f0787fadf99939",
- "type": "function",
- "z": "31bba0914516dd85",
- "name": "Data_converter",
- "func": "if (msg.topic != \"Fluent\") {\n return;\n}\n\nconst [S_O, S_I, S_S, S_NH, S_N2, S_NO, S_HCO, X_I, X_S, X_H, X_STO, X_A, X_TS] = msg.payload.C;\n\nmsg = {payload: [\n { \"Series\": \"S_O\", \"Y\": S_O},\n { \"Series\": \"S_I\", \"Y\": S_I},\n { \"Series\": \"S_S\", \"Y\": S_S},\n { \"Series\": \"S_NH\", \"Y\": S_NH},\n { \"Series\": \"S_N2\", \"Y\": S_N2},\n { \"Series\": \"S_NO\", \"Y\": S_NO},\n { \"Series\": \"S_HCO\", \"Y\": S_HCO},\n { \"Series\": \"X_I\", \"Y\": X_I},\n { \"Series\": \"X_S\", \"Y\": X_S},\n { \"Series\": \"X_H\", \"Y\": X_H},\n { \"Series\": \"X_STO\", \"Y\": X_STO},\n { \"Series\": \"X_A\", \"Y\": X_A},\n { \"Series\": \"X_TS\", \"Y\": X_TS}\n ]};\n\nreturn msg;",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 820,
- "y": 180,
- "wires": [
- [
- "e955d0c2d3246c4b"
- ]
- ]
- },
- {
- "id": "bb63e864735f963f",
- "type": "ui-chart",
- "z": "31bba0914516dd85",
- "group": "14172c57f4c6ff14",
- "name": "Sludge composition",
- "label": "Sludge composition",
- "order": 9007199254740991,
- "chartType": "line",
- "category": "Series",
- "categoryType": "property",
- "xAxisLabel": "",
- "xAxisProperty": "",
- "xAxisPropertyType": "timestamp",
- "xAxisType": "time",
- "xAxisFormat": "",
- "xAxisFormatType": "auto",
- "xmin": "",
- "xmax": "",
- "yAxisLabel": "",
- "yAxisProperty": "Y",
- "yAxisPropertyType": "property",
- "ymin": "",
- "ymax": "",
- "bins": 10,
- "action": "append",
- "stackSeries": false,
- "pointShape": "circle",
- "pointRadius": 4,
- "showLegend": true,
- "removeOlder": "8",
- "removeOlderUnit": "3600",
- "removeOlderPoints": "2000",
- "colors": [
- "#0095ff",
- "#ff0000",
- "#ff7f0e",
- "#2ca02c",
- "#a347e1",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "textColor": [
- "#666666"
- ],
- "textColorDefault": true,
- "gridColor": [
- "#e5e5e5"
- ],
- "gridColorDefault": true,
- "width": 6,
- "height": 8,
- "className": "",
- "interpolation": "linear",
- "x": 1450,
- "y": 340,
- "wires": [
- []
- ]
- },
- {
- "id": "ca96bcb7f32f011f",
- "type": "function",
- "z": "31bba0914516dd85",
- "name": "Data_converter",
- "func": "if (msg.topic != \"Fluent\") {\n return;\n}\n\nconst [S_O, S_I, S_S, S_NH, S_N2, S_NO, S_HCO, X_I, X_S, X_H, X_STO, X_A, X_TS] = msg.payload.C;\n\nmsg = {payload: [\n { \"Series\": \"X_I\", \"Y\": X_I},\n { \"Series\": \"X_S\", \"Y\": X_S},\n { \"Series\": \"X_H\", \"Y\": X_H},\n { \"Series\": \"X_STO\", \"Y\": X_STO},\n { \"Series\": \"X_A\", \"Y\": X_A},\n { \"Series\": \"X_TS\", \"Y\": X_TS}\n ]};\n\nreturn msg;",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1220,
- "y": 340,
- "wires": [
- [
- "bb63e864735f963f"
- ]
- ]
- },
- {
- "id": "9327869b411c3063",
- "type": "ui-chart",
- "z": "31bba0914516dd85",
- "group": "58b5e9368ec5774b",
- "name": "Aerobic reactor",
- "label": "Aerobic reactor / recirculation",
- "order": 9007199254740991,
- "chartType": "line",
- "category": "Series",
- "categoryType": "property",
- "xAxisLabel": "",
- "xAxisProperty": "",
- "xAxisPropertyType": "timestamp",
- "xAxisType": "time",
- "xAxisFormat": "",
- "xAxisFormatType": "auto",
- "xmin": "",
- "xmax": "",
- "yAxisLabel": "",
- "yAxisProperty": "Y",
- "yAxisPropertyType": "property",
- "ymin": "",
- "ymax": "",
- "bins": 10,
- "action": "append",
- "stackSeries": false,
- "pointShape": "circle",
- "pointRadius": 4,
- "showLegend": true,
- "removeOlder": "8",
- "removeOlderUnit": "3600",
- "removeOlderPoints": "2000",
- "colors": [
- "#0095ff",
- "#ff0000",
- "#ff7f0e",
- "#2ca02c",
- "#a347e1",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "textColor": [
- "#666666"
- ],
- "textColorDefault": true,
- "gridColor": [
- "#e5e5e5"
- ],
- "gridColorDefault": true,
- "width": 6,
- "height": 8,
- "className": "",
- "interpolation": "linear",
- "x": 1440,
- "y": 260,
- "wires": [
- []
- ]
- },
- {
- "id": "3cb7fec9537ac405",
- "type": "function",
- "z": "31bba0914516dd85",
- "name": "Data_converter",
- "func": "if (msg.topic != \"Fluent\") {\n return;\n}\n\nconst [S_O, S_I, S_S, S_NH, S_N2, S_NO, S_HCO, X_I, X_S, X_H, X_STO, X_A, X_TS] = msg.payload.C;\n\nmsg = {payload: [\n { \"Series\": \"S_O\", \"Y\": S_O},\n { \"Series\": \"S_I\", \"Y\": S_I},\n { \"Series\": \"S_S\", \"Y\": S_S},\n { \"Series\": \"S_NH\", \"Y\": S_NH},\n { \"Series\": \"S_N2\", \"Y\": S_N2},\n { \"Series\": \"S_NO\", \"Y\": S_NO},\n { \"Series\": \"S_HCO\", \"Y\": S_HCO},\n { \"Series\": \"X_I\", \"Y\": X_I},\n { \"Series\": \"X_S\", \"Y\": X_S},\n { \"Series\": \"X_H\", \"Y\": X_H},\n { \"Series\": \"X_STO\", \"Y\": X_STO},\n { \"Series\": \"X_A\", \"Y\": X_A},\n { \"Series\": \"X_TS\", \"Y\": X_TS}\n ]};\n\nreturn msg;",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1220,
- "y": 260,
- "wires": [
- [
- "9327869b411c3063"
- ]
- ]
- },
- {
- "id": "640ecab878ee623a",
- "type": "debug",
- "z": "31bba0914516dd85",
- "name": "Sludge removal",
- "active": true,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "payload",
- "targetType": "msg",
- "statusVal": "",
- "statusType": "auto",
- "x": 1160,
- "y": 420,
- "wires": []
- },
- {
- "id": "8e1117ff307f949b",
- "type": "debug",
- "z": "31bba0914516dd85",
- "name": "Sludge recirculation",
- "active": true,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "payload",
- "targetType": "msg",
- "statusVal": "",
- "statusType": "auto",
- "x": 930,
- "y": 420,
- "wires": []
- },
- {
- "id": "d9e3b28718762905",
- "type": "debug",
- "z": "31bba0914516dd85",
- "name": "Effluent",
- "active": true,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "payload",
- "targetType": "msg",
- "statusVal": "",
- "statusType": "auto",
- "x": 680,
- "y": 420,
- "wires": []
- },
- {
- "id": "9534da473265bb6a",
- "type": "recirculation-pump",
- "z": "31bba0914516dd85",
- "name": "",
- "F2": "50",
- "inlet": "2",
- "x": 930,
- "y": 340,
- "wires": [
- [
- "ca96bcb7f32f011f",
- "640ecab878ee623a"
- ],
- [
- "8e1117ff307f949b",
- "5266f4e09e7b919b"
- ]
- ]
- },
- {
- "id": "038a9d67ce069678",
- "type": "settling-basin",
- "z": "31bba0914516dd85",
- "name": "",
- "TS_set": "5400",
- "inlet": "1",
- "x": 700,
- "y": 340,
- "wires": [
- [
- "fc4aa2928bdbe228",
- "d9e3b28718762905"
- ],
- [
- "9534da473265bb6a"
- ]
- ]
- },
- {
- "id": "1cb62ce7d6e2b362",
- "type": "recirculation-pump",
- "z": "31bba0914516dd85",
- "name": "",
- "F2": "3000",
- "inlet": 1,
- "x": 470,
- "y": 340,
- "wires": [
- [
- "038a9d67ce069678"
- ],
- [
- "5266f4e09e7b919b"
- ]
- ]
- },
- {
- "id": "2ac1635a77880b09",
- "type": "advancedReactor",
- "z": "31bba0914516dd85",
- "name": "Aerobic 2",
- "reactor_type": "CSTR",
- "volume": "400",
- "length": "",
- "resolution_L": "",
- "alpha": "",
- "n_inlets": 1,
- "kla": "7500",
- "S_O_init": 0,
- "S_I_init": 30,
- "S_S_init": 100,
- "S_NH_init": 16,
- "S_N2_init": 0,
- "S_NO_init": 0,
- "S_HCO_init": 5,
- "X_I_init": 25,
- "X_S_init": 75,
- "X_H_init": 30,
- "X_STO_init": 0,
- "X_A_init": 0.001,
- "X_TS_init": 125.0009,
- "x": 960,
- "y": 260,
- "wires": [
- [
- "3cb7fec9537ac405",
- "1cb62ce7d6e2b362"
- ],
- [],
- []
- ]
- },
- {
- "id": "5f39b76fc9528f75",
- "type": "advancedReactor",
- "z": "31bba0914516dd85",
- "name": "Aerobic 1",
- "reactor_type": "CSTR",
- "volume": "400",
- "length": "",
- "resolution_L": "",
- "alpha": "",
- "n_inlets": 1,
- "kla": "7500",
- "S_O_init": 0,
- "S_I_init": 30,
- "S_S_init": 100,
- "S_NH_init": 16,
- "S_N2_init": 0,
- "S_NO_init": 0,
- "S_HCO_init": 5,
- "X_I_init": 25,
- "X_S_init": 75,
- "X_H_init": 30,
- "X_STO_init": 0,
- "X_A_init": "30",
- "X_TS_init": "132",
- "x": 780,
- "y": 260,
- "wires": [
- [],
- [],
- [
- "2ac1635a77880b09"
- ]
- ]
- },
- {
- "id": "b38f1a7b0ab6a7c7",
- "type": "advancedReactor",
- "z": "31bba0914516dd85",
- "name": "Anoxic 2",
- "reactor_type": "CSTR",
- "volume": "400",
- "length": "",
- "resolution_L": "",
- "alpha": "",
- "n_inlets": 1,
- "kla": "",
- "S_O_init": 0,
- "S_I_init": 30,
- "S_S_init": 100,
- "S_NH_init": 16,
- "S_N2_init": 0,
- "S_NO_init": 0,
- "S_HCO_init": 5,
- "X_I_init": 25,
- "X_S_init": 75,
- "X_H_init": 30,
- "X_STO_init": 0,
- "X_A_init": 0.001,
- "X_TS_init": 125.0009,
- "x": 600,
- "y": 260,
- "wires": [
- [
- "59f0787fadf99939"
- ],
- [],
- [
- "5f39b76fc9528f75"
- ]
- ]
- },
- {
- "id": "5266f4e09e7b919b",
- "type": "advancedReactor",
- "z": "31bba0914516dd85",
- "name": "Anoxic 1",
- "reactor_type": "CSTR",
- "volume": "400",
- "length": "",
- "resolution_L": "",
- "alpha": "",
- "n_inlets": "3",
- "kla": "",
- "S_O_init": 0,
- "S_I_init": 30,
- "S_S_init": 100,
- "S_NH_init": 16,
- "S_N2_init": 0,
- "S_NO_init": 0,
- "S_HCO_init": 5,
- "X_I_init": 25,
- "X_S_init": 75,
- "X_H_init": 30,
- "X_STO_init": 0,
- "X_A_init": 0.001,
- "X_TS_init": 125.0009,
- "x": 420,
- "y": 260,
- "wires": [
- [],
- [],
- [
- "b38f1a7b0ab6a7c7"
- ]
- ]
- },
- {
- "id": "5865699f68c9aa64",
- "type": "inject",
- "z": "0abdac5260d9553e",
- "name": "",
- "props": [
- {
- "p": "timestamp",
- "v": "",
- "vt": "date"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "1",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "clock",
- "x": 300,
- "y": 260,
- "wires": [
- [
- "5ba082534d7b491e"
- ]
- ]
- },
- {
- "id": "061920b87a45057d",
- "type": "inject",
- "z": "0abdac5260d9553e",
- "name": "Influx composition 1",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- },
- {
- "p": "timestamp",
- "v": "",
- "vt": "date"
- }
- ],
- "repeat": "1440",
- "crontab": "",
- "once": true,
- "onceDelay": "5",
- "topic": "Fluent",
- "payload": "{\"inlet\":0,\"F\":6600,\"C\":[0,30,100,16,0,0,5,25,75,30,0,0,125]}",
- "payloadType": "json",
- "x": 260,
- "y": 180,
- "wires": [
- [
- "5ba082534d7b491e"
- ]
- ]
- },
- {
- "id": "c2338b164df519f6",
- "type": "debug",
- "z": "0abdac5260d9553e",
- "name": "Sludge removal",
- "active": false,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "payload",
- "targetType": "msg",
- "statusVal": "",
- "statusType": "auto",
- "x": 1260,
- "y": 340,
- "wires": []
- },
- {
- "id": "724aa3442b6fc5fc",
- "type": "debug",
- "z": "0abdac5260d9553e",
- "name": "Sludge recirculation",
- "active": false,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "payload",
- "targetType": "msg",
- "statusVal": "",
- "statusType": "auto",
- "x": 1030,
- "y": 340,
- "wires": []
- },
- {
- "id": "fd2e755a96891ec3",
- "type": "debug",
- "z": "0abdac5260d9553e",
- "name": "Effluent",
- "active": false,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "payload",
- "targetType": "msg",
- "statusVal": "",
- "statusType": "auto",
- "x": 780,
- "y": 340,
- "wires": []
- },
- {
- "id": "c509ace161289789",
- "type": "recirculation-pump",
- "z": "0abdac5260d9553e",
- "name": "",
- "F2": "1000",
- "inlet": "2",
- "x": 1030,
- "y": 260,
- "wires": [
- [
- "c2338b164df519f6",
- "c2fd7710c8b22ffa"
- ],
- [
- "724aa3442b6fc5fc",
- "5ba082534d7b491e",
- "edbda618f142adfa"
- ]
- ]
- },
- {
- "id": "b914e9abe9d60945",
- "type": "settling-basin",
- "z": "0abdac5260d9553e",
- "name": "",
- "TS_set": "5400",
- "inlet": "1",
- "x": 800,
- "y": 260,
- "wires": [
- [
- "fd2e755a96891ec3"
- ],
- [
- "c509ace161289789"
- ]
- ]
- },
- {
- "id": "dc2d2c985e2fdff6",
- "type": "recirculation-pump",
- "z": "0abdac5260d9553e",
- "name": "",
- "F2": "1100",
- "inlet": 1,
- "x": 570,
- "y": 260,
- "wires": [
- [
- "b914e9abe9d60945"
- ],
- [
- "5ba082534d7b491e"
- ]
- ]
- },
- {
- "id": "7f94060aa59d6c3a",
- "type": "advancedReactor",
- "z": "0abdac5260d9553e",
- "name": "Aerobic 1",
- "reactor_type": "PFR",
- "volume": "1470",
- "length": "20",
- "resolution_L": "20",
- "alpha": "0",
- "n_inlets": 1,
- "kla": "7500",
- "S_O_init": 0,
- "S_I_init": 30,
- "S_S_init": 100,
- "S_NH_init": 16,
- "S_N2_init": 0,
- "S_NO_init": 0,
- "S_HCO_init": 5,
- "X_I_init": 25,
- "X_S_init": 75,
- "X_H_init": 30,
- "X_STO_init": 0,
- "X_A_init": "30",
- "X_TS_init": "132",
- "enableLog": true,
- "logLevel": "debug",
- "positionVsParent": "atEquipment",
- "x": 1060,
- "y": 180,
- "wires": [
- [
- "dc2d2c985e2fdff6",
- "a5d1282993a362c9",
- "368215b8dd484211"
- ],
- [],
- []
- ]
- },
- {
- "id": "5ba082534d7b491e",
- "type": "advancedReactor",
- "z": "0abdac5260d9553e",
- "name": "Anoxic 1",
- "reactor_type": "PFR",
- "volume": "730",
- "length": "10",
- "resolution_L": "10",
- "alpha": "0",
- "n_inlets": "3",
- "kla": "",
- "S_O_init": 0,
- "S_I_init": 30,
- "S_S_init": 100,
- "S_NH_init": 16,
- "S_N2_init": 0,
- "S_NO_init": 0,
- "S_HCO_init": 5,
- "X_I_init": 25,
- "X_S_init": 75,
- "X_H_init": 30,
- "X_STO_init": 0,
- "X_A_init": 0.001,
- "X_TS_init": 125.0009,
- "enableLog": true,
- "logLevel": "debug",
- "positionVsParent": "atEquipment",
- "x": 540,
- "y": 180,
- "wires": [
- [
- "4874a8564327e7ab"
- ],
- [],
- [
- "7f94060aa59d6c3a"
- ]
- ]
- },
- {
- "id": "4874a8564327e7ab",
- "type": "function",
- "z": "0abdac5260d9553e",
- "name": "Data_converter",
- "func": "if (msg.topic != \"Fluent\") {\n return;\n}\n\nconst [S_O, S_I, S_S, S_NH, S_N2, S_NO, S_HCO, X_I, X_S, X_H, X_STO, X_A, X_TS] = msg.payload.C;\n\nmsg = {payload: [\n { \"Series\": \"S_O\", \"Y\": S_O},\n { \"Series\": \"S_I\", \"Y\": S_I},\n { \"Series\": \"S_S\", \"Y\": S_S},\n { \"Series\": \"S_NH\", \"Y\": S_NH},\n { \"Series\": \"S_N2\", \"Y\": S_N2},\n { \"Series\": \"S_NO\", \"Y\": S_NO},\n { \"Series\": \"S_HCO\", \"Y\": S_HCO},\n { \"Series\": \"X_I\", \"Y\": X_I},\n { \"Series\": \"X_S\", \"Y\": X_S},\n { \"Series\": \"X_H\", \"Y\": X_H},\n { \"Series\": \"X_STO\", \"Y\": X_STO},\n { \"Series\": \"X_A\", \"Y\": X_A},\n { \"Series\": \"X_TS\", \"Y\": X_TS}\n ]};\n\nreturn msg;",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 800,
- "y": 120,
- "wires": [
- [
- "ac91a2c6413414f8"
- ]
- ]
- },
- {
- "id": "ac91a2c6413414f8",
- "type": "ui-chart",
- "z": "0abdac5260d9553e",
- "group": "ae38454098a37db0",
- "name": "Anoxic reactor",
- "label": "Anoxic reactor",
- "order": 9007199254740991,
- "chartType": "line",
- "category": "Series",
- "categoryType": "property",
- "xAxisLabel": "",
- "xAxisProperty": "",
- "xAxisPropertyType": "timestamp",
- "xAxisType": "time",
- "xAxisFormat": "",
- "xAxisFormatType": "auto",
- "xmin": "",
- "xmax": "",
- "yAxisLabel": "",
- "yAxisProperty": "Y",
- "yAxisPropertyType": "property",
- "ymin": "",
- "ymax": "",
- "bins": 10,
- "action": "append",
- "stackSeries": false,
- "pointShape": "circle",
- "pointRadius": 4,
- "showLegend": true,
- "removeOlder": "8",
- "removeOlderUnit": "3600",
- "removeOlderPoints": "2000",
- "colors": [
- "#0095ff",
- "#ff0000",
- "#ff7f0e",
- "#2ca02c",
- "#a347e1",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "textColor": [
- "#666666"
- ],
- "textColorDefault": true,
- "gridColor": [
- "#e5e5e5"
- ],
- "gridColorDefault": true,
- "width": 6,
- "height": 8,
- "className": "",
- "interpolation": "linear",
- "x": 1020,
- "y": 120,
- "wires": [
- []
- ]
- },
- {
- "id": "a5d1282993a362c9",
- "type": "function",
- "z": "0abdac5260d9553e",
- "name": "Data_converter",
- "func": "if (msg.topic != \"Fluent\") {\n return;\n}\n\nconst [S_O, S_I, S_S, S_NH, S_N2, S_NO, S_HCO, X_I, X_S, X_H, X_STO, X_A, X_TS] = msg.payload.C;\n\nmsg = {payload: [\n { \"Series\": \"S_O\", \"Y\": S_O},\n { \"Series\": \"S_I\", \"Y\": S_I},\n { \"Series\": \"S_S\", \"Y\": S_S},\n { \"Series\": \"S_NH\", \"Y\": S_NH},\n { \"Series\": \"S_N2\", \"Y\": S_N2},\n { \"Series\": \"S_NO\", \"Y\": S_NO},\n { \"Series\": \"S_HCO\", \"Y\": S_HCO},\n { \"Series\": \"X_I\", \"Y\": X_I},\n { \"Series\": \"X_S\", \"Y\": X_S},\n { \"Series\": \"X_H\", \"Y\": X_H},\n { \"Series\": \"X_STO\", \"Y\": X_STO},\n { \"Series\": \"X_A\", \"Y\": X_A},\n { \"Series\": \"X_TS\", \"Y\": X_TS}\n ]};\n\nreturn msg;",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1260,
- "y": 180,
- "wires": [
- [
- "e61130eff38ee89a"
- ]
- ]
- },
- {
- "id": "e61130eff38ee89a",
- "type": "ui-chart",
- "z": "0abdac5260d9553e",
- "group": "ae38454098a37db0",
- "name": "Aerobic reactor",
- "label": "Aerobic reactor / recirculation",
- "order": 9007199254740991,
- "chartType": "line",
- "category": "Series",
- "categoryType": "property",
- "xAxisLabel": "",
- "xAxisProperty": "",
- "xAxisPropertyType": "timestamp",
- "xAxisType": "time",
- "xAxisFormat": "",
- "xAxisFormatType": "auto",
- "xmin": "",
- "xmax": "",
- "yAxisLabel": "",
- "yAxisProperty": "Y",
- "yAxisPropertyType": "property",
- "ymin": "",
- "ymax": "",
- "bins": 10,
- "action": "append",
- "stackSeries": false,
- "pointShape": "circle",
- "pointRadius": 4,
- "showLegend": true,
- "removeOlder": "8",
- "removeOlderUnit": "3600",
- "removeOlderPoints": "2000",
- "colors": [
- "#0095ff",
- "#ff0000",
- "#ff7f0e",
- "#2ca02c",
- "#a347e1",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "textColor": [
- "#666666"
- ],
- "textColorDefault": true,
- "gridColor": [
- "#e5e5e5"
- ],
- "gridColorDefault": true,
- "width": 6,
- "height": 8,
- "className": "",
- "interpolation": "linear",
- "x": 1480,
- "y": 180,
- "wires": [
- []
- ]
- },
- {
- "id": "c2fd7710c8b22ffa",
- "type": "function",
- "z": "0abdac5260d9553e",
- "name": "Data_converter",
- "func": "if (msg.topic != \"Fluent\") {\n return;\n}\n\nconst [S_O, S_I, S_S, S_NH, S_N2, S_NO, S_HCO, X_I, X_S, X_H, X_STO, X_A, X_TS] = msg.payload.C;\n\nmsg = {payload: [\n { \"Series\": \"S_O\", \"Y\": S_O},\n { \"Series\": \"S_I\", \"Y\": S_I},\n { \"Series\": \"S_S\", \"Y\": S_S},\n { \"Series\": \"S_NH\", \"Y\": S_NH},\n { \"Series\": \"S_N2\", \"Y\": S_N2},\n { \"Series\": \"S_NO\", \"Y\": S_NO},\n { \"Series\": \"S_HCO\", \"Y\": S_HCO}\n ]};\n\nreturn msg;",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1260,
- "y": 240,
- "wires": [
- [
- "6cfb58885cf36b74"
- ]
- ]
- },
- {
- "id": "6cfb58885cf36b74",
- "type": "ui-chart",
- "z": "0abdac5260d9553e",
- "group": "de8b029d69f26c0e",
- "name": "Effluent",
- "label": "Effluent",
- "order": 9007199254740991,
- "chartType": "line",
- "category": "Series",
- "categoryType": "property",
- "xAxisLabel": "",
- "xAxisProperty": "",
- "xAxisPropertyType": "timestamp",
- "xAxisType": "time",
- "xAxisFormat": "",
- "xAxisFormatType": "auto",
- "xmin": "",
- "xmax": "",
- "yAxisLabel": "",
- "yAxisProperty": "Y",
- "yAxisPropertyType": "property",
- "ymin": "",
- "ymax": "",
- "bins": 10,
- "action": "append",
- "stackSeries": false,
- "pointShape": "circle",
- "pointRadius": 4,
- "showLegend": true,
- "removeOlder": "8",
- "removeOlderUnit": "3600",
- "removeOlderPoints": "2000",
- "colors": [
- "#0095ff",
- "#ff0000",
- "#ff7f0e",
- "#2ca02c",
- "#a347e1",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "textColor": [
- "#666666"
- ],
- "textColorDefault": true,
- "gridColor": [
- "#e5e5e5"
- ],
- "gridColorDefault": true,
- "width": 6,
- "height": 8,
- "className": "",
- "interpolation": "linear",
- "x": 1460,
- "y": 240,
- "wires": [
- []
- ]
- },
- {
- "id": "edbda618f142adfa",
- "type": "function",
- "z": "0abdac5260d9553e",
- "name": "Data_converter",
- "func": "if (msg.topic != \"Fluent\") {\n return;\n}\n\nconst [S_O, S_I, S_S, S_NH, S_N2, S_NO, S_HCO, X_I, X_S, X_H, X_STO, X_A, X_TS] = msg.payload.C;\n\nmsg = {payload: [\n { \"Series\": \"X_I\", \"Y\": X_I},\n { \"Series\": \"X_S\", \"Y\": X_S},\n { \"Series\": \"X_H\", \"Y\": X_H},\n { \"Series\": \"X_STO\", \"Y\": X_STO},\n { \"Series\": \"X_A\", \"Y\": X_A},\n { \"Series\": \"X_TS\", \"Y\": X_TS}\n ]};\n\nreturn msg;",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1260,
- "y": 280,
- "wires": [
- [
- "95dc5302c82d6bcb"
- ]
- ]
- },
- {
- "id": "95dc5302c82d6bcb",
- "type": "ui-chart",
- "z": "0abdac5260d9553e",
- "group": "de8b029d69f26c0e",
- "name": "Sludge composition",
- "label": "Sludge composition",
- "order": 9007199254740991,
- "chartType": "line",
- "category": "Series",
- "categoryType": "property",
- "xAxisLabel": "",
- "xAxisProperty": "",
- "xAxisPropertyType": "timestamp",
- "xAxisType": "time",
- "xAxisFormat": "",
- "xAxisFormatType": "auto",
- "xmin": "",
- "xmax": "",
- "yAxisLabel": "",
- "yAxisProperty": "Y",
- "yAxisPropertyType": "property",
- "ymin": "",
- "ymax": "",
- "bins": 10,
- "action": "append",
- "stackSeries": false,
- "pointShape": "circle",
- "pointRadius": 4,
- "showLegend": true,
- "removeOlder": "8",
- "removeOlderUnit": "3600",
- "removeOlderPoints": "2000",
- "colors": [
- "#0095ff",
- "#ff0000",
- "#ff7f0e",
- "#2ca02c",
- "#a347e1",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "textColor": [
- "#666666"
- ],
- "textColorDefault": true,
- "gridColor": [
- "#e5e5e5"
- ],
- "gridColorDefault": true,
- "width": 6,
- "height": 8,
- "className": "",
- "interpolation": "linear",
- "x": 1490,
- "y": 280,
- "wires": [
- []
- ]
- },
- {
- "id": "cb4329d4882d3b10",
- "type": "inject",
- "z": "0abdac5260d9553e",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "Dispersion",
- "payload": "10000",
- "payloadType": "num",
- "x": 290,
- "y": 340,
- "wires": [
- [
- "5ba082534d7b491e",
- "7f94060aa59d6c3a"
- ]
- ]
- },
- {
- "id": "4b5a1cb582ce04a5",
- "type": "inject",
- "z": "0abdac5260d9553e",
- "name": "Influx composition 2",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- },
- {
- "p": "timestamp",
- "v": "",
- "vt": "date"
- }
- ],
- "repeat": "1440",
- "crontab": "",
- "once": true,
- "onceDelay": "480",
- "topic": "Fluent",
- "payload": "{\"inlet\":0,\"F\":8000,\"C\":[0,50,125,20,0,0,6.25,10,50,11,0,0,81.5]}",
- "payloadType": "json",
- "x": 260,
- "y": 140,
- "wires": [
- [
- "5ba082534d7b491e"
- ]
- ]
- },
- {
- "id": "68ba512b76ed980a",
- "type": "inject",
- "z": "0abdac5260d9553e",
- "name": "Influx composition 3",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- },
- {
- "p": "timestamp",
- "v": "",
- "vt": "date"
- }
- ],
- "repeat": "1440",
- "crontab": "",
- "once": true,
- "onceDelay": "960",
- "topic": "Fluent",
- "payload": "{\"inlet\":0,\"F\":6600,\"C\":[0,25,95,12.8,0,0,4,25,75,40,0,0,134]}",
- "payloadType": "json",
- "x": 260,
- "y": 100,
- "wires": [
- [
- "5ba082534d7b491e"
- ]
- ]
- },
- {
- "id": "368215b8dd484211",
- "type": "debug",
- "z": "0abdac5260d9553e",
- "name": "debug 1",
- "active": true,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "false",
- "statusVal": "",
- "statusType": "auto",
- "x": 1280,
- "y": 100,
- "wires": []
- },
- {
- "id": "b5dde0cd3e3b7a9e",
- "type": "inject",
- "z": "394f713d4e71366c",
- "name": "Influx composition 3",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- },
- {
- "p": "timestamp",
- "v": "",
- "vt": "date"
- }
- ],
- "repeat": "1440",
- "crontab": "",
- "once": true,
- "onceDelay": "960",
- "topic": "Fluent",
- "payload": "{\"inlet\":0,\"F\":1000,\"C\":[0,25,95,12.8,0,0,4,25,75,40,0,0,134]}",
- "payloadType": "json",
- "x": 220,
- "y": 140,
- "wires": [
- [
- "818dbe32cad9fa42"
- ]
- ]
- },
- {
- "id": "74fa10e5ad6ac925",
- "type": "inject",
- "z": "394f713d4e71366c",
- "name": "Influx composition 2",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- },
- {
- "p": "timestamp",
- "v": "",
- "vt": "date"
- }
- ],
- "repeat": "1440",
- "crontab": "",
- "once": true,
- "onceDelay": "480",
- "topic": "Fluent",
- "payload": "{\"inlet\":0,\"F\":1200,\"C\":[0,50,125,20,0,0,6.25,10,50,11,0,0,81.5]}",
- "payloadType": "json",
- "x": 220,
- "y": 180,
- "wires": [
- [
- "818dbe32cad9fa42"
- ]
- ]
- },
- {
- "id": "ad54f09b8bb12e39",
- "type": "inject",
- "z": "394f713d4e71366c",
- "name": "Influx composition 1",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- },
- {
- "p": "timestamp",
- "v": "",
- "vt": "date"
- }
- ],
- "repeat": "1440",
- "crontab": "",
- "once": true,
- "onceDelay": "5",
- "topic": "Fluent",
- "payload": "{\"inlet\":0,\"F\":1000,\"C\":[0,30,100,16,0,0,5,25,75,30,0,0,125]}",
- "payloadType": "json",
- "x": 220,
- "y": 220,
- "wires": [
- [
- "818dbe32cad9fa42"
- ]
- ]
- },
- {
- "id": "2776f6ebd3205e51",
- "type": "inject",
- "z": "394f713d4e71366c",
- "name": "",
- "props": [
- {
- "p": "timestamp",
- "v": "",
- "vt": "date"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "1",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "clock",
- "x": 260,
- "y": 300,
- "wires": [
- [
- "818dbe32cad9fa42"
- ]
- ]
- },
- {
- "id": "8538c18935bee1bf",
- "type": "inject",
- "z": "394f713d4e71366c",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "Dispersion",
- "payload": "3000",
- "payloadType": "num",
- "x": 240,
- "y": 380,
- "wires": [
- [
- "818dbe32cad9fa42",
- "c3d507ed7b05c089"
- ]
- ]
- },
- {
- "id": "818dbe32cad9fa42",
- "type": "advancedReactor",
- "z": "394f713d4e71366c",
- "name": "Anoxic 1",
- "reactor_type": "PFR",
- "volume": "800",
- "length": "30",
- "resolution_L": "20",
- "alpha": "0",
- "n_inlets": "3",
- "kla": "",
- "S_O_init": 0,
- "S_I_init": 30,
- "S_S_init": 100,
- "S_NH_init": 16,
- "S_N2_init": 0,
- "S_NO_init": 0,
- "S_HCO_init": 5,
- "X_I_init": 25,
- "X_S_init": 75,
- "X_H_init": 30,
- "X_STO_init": 0,
- "X_A_init": 0.001,
- "X_TS_init": 125.0009,
- "enableLog": false,
- "logLevel": "info",
- "positionVsParent": "downstream",
- "x": 600,
- "y": 220,
- "wires": [
- [],
- [],
- [
- "c3d507ed7b05c089"
- ]
- ]
- },
- {
- "id": "c3d507ed7b05c089",
- "type": "advancedReactor",
- "z": "394f713d4e71366c",
- "name": "Aerobic 1",
- "reactor_type": "PFR",
- "volume": "800",
- "length": "30",
- "resolution_L": "20",
- "alpha": "0",
- "n_inlets": 1,
- "kla": "7500",
- "S_O_init": 0,
- "S_I_init": 30,
- "S_S_init": 100,
- "S_NH_init": 16,
- "S_N2_init": 0,
- "S_NO_init": 0,
- "S_HCO_init": 5,
- "X_I_init": 25,
- "X_S_init": 75,
- "X_H_init": 30,
- "X_STO_init": 0,
- "X_A_init": "30",
- "X_TS_init": "132",
- "enableLog": false,
- "logLevel": "info",
- "positionVsParent": "upstream",
- "x": 1020,
- "y": 220,
- "wires": [
- [],
- [],
- []
- ]
- }
-]
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index b8efbf7..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,119 +0,0 @@
-{
- "name": "reactor",
- "version": "0.0.1",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "reactor",
- "version": "0.0.1",
- "license": "SEE LICENSE",
- "dependencies": {
- "generalFunctions": "git+https://gitea.centraal.wbd-rd.nl/RnD/generalFunctions.git",
- "mathjs": "^14.5.2"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
- "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/complex.js": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.4.2.tgz",
- "integrity": "sha512-qtx7HRhPGSCBtGiST4/WGHuW+zeaND/6Ld+db6PbrulIB1i2Ev/2UPiqcmpQNPSyfBKraC0EOvOKCB5dGZKt3g==",
- "license": "MIT",
- "engines": {
- "node": "*"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/rawify"
- }
- },
- "node_modules/decimal.js": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
- "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
- "license": "MIT"
- },
- "node_modules/escape-latex": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz",
- "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==",
- "license": "MIT"
- },
- "node_modules/fraction.js": {
- "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
- "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
- "license": "MIT",
- "engines": {
- "node": "*"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/rawify"
- }
- },
- "node_modules/generalFunctions": {
- "version": "1.0.0",
- "resolved": "git+https://gitea.centraal.wbd-rd.nl/RnD/generalFunctions.git#efc97d6cd17399391b011298e47e8c1b1599592d",
- "license": "SEE LICENSE"
- },
- "node_modules/javascript-natural-sort": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
- "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==",
- "license": "MIT"
- },
- "node_modules/mathjs": {
- "version": "14.8.0",
- "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-14.8.0.tgz",
- "integrity": "sha512-DN4wmAjNzFVJ9vHqpAJ3vX0UF306u/1DgGKh7iVPuAFH19JDRd9NAaQS764MsKbSwDB6uBSkQEmgVmKdgYaCoQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@babel/runtime": "^7.26.10",
- "complex.js": "^2.2.5",
- "decimal.js": "^10.4.3",
- "escape-latex": "^1.2.0",
- "fraction.js": "^5.2.1",
- "javascript-natural-sort": "^0.7.1",
- "seedrandom": "^3.0.5",
- "tiny-emitter": "^2.1.0",
- "typed-function": "^4.2.1"
- },
- "bin": {
- "mathjs": "bin/cli.js"
- },
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/seedrandom": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
- "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==",
- "license": "MIT"
- },
- "node_modules/tiny-emitter": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
- "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
- "license": "MIT"
- },
- "node_modules/typed-function": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.2.1.tgz",
- "integrity": "sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==",
- "license": "MIT",
- "engines": {
- "node": ">= 18"
- }
- }
- }
-}
diff --git a/package.json b/package.json
index 4651d19..152c346 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,7 @@
"activated sludge",
"wastewater",
"biological model",
+ "EVOLV",
"node-red"
],
"license": "SEE LICENSE",
@@ -21,9 +22,7 @@
},
"node-red": {
"nodes": {
- "reactor": "reactor.js",
- "recirculation-pump": "additional_nodes/recirculation-pump.js",
- "settling-basin": "additional_nodes/settling-basin.js"
+ "reactor": "reactor.js"
}
},
"dependencies": {
From b0dd9b6a8f0356fe37eda0785dbbf46c84eddee9 Mon Sep 17 00:00:00 2001
From: "p.vanderwilt"
Date: Thu, 6 Nov 2025 15:47:18 +0100
Subject: [PATCH 2/7] Refactor ASM3 module to export ASM_CONSTANTS and update
references in Reactor classes
---
src/reaction_modules/asm3_class Koch.js | 9 +++++++--
src/reaction_modules/asm3_class.js | 9 +++++++--
src/specificClass.js | 22 ++++++++++------------
3 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/src/reaction_modules/asm3_class Koch.js b/src/reaction_modules/asm3_class Koch.js
index e5e98b3..0742afa 100644
--- a/src/reaction_modules/asm3_class Koch.js
+++ b/src/reaction_modules/asm3_class Koch.js
@@ -1,4 +1,9 @@
-const math = require('mathjs')
+const math = require('mathjs');
+
+const ASM_CONSTANTS = {
+ S_O_INDEX: 0,
+ NUM_SPECIES: 13
+};
/**
* ASM3 class for the Activated Sludge Model No. 3 (ASM3). Using Koch et al. 2000 parameters.
@@ -208,4 +213,4 @@ class ASM3 {
}
}
-module.exports = ASM3;
\ No newline at end of file
+module.exports = { ASM3, ASM_CONSTANTS };
\ No newline at end of file
diff --git a/src/reaction_modules/asm3_class.js b/src/reaction_modules/asm3_class.js
index d228619..dc519db 100644
--- a/src/reaction_modules/asm3_class.js
+++ b/src/reaction_modules/asm3_class.js
@@ -1,4 +1,9 @@
-const math = require('mathjs')
+const math = require('mathjs');
+
+const ASM_CONSTANTS = {
+ S_O_INDEX: 0,
+ NUM_SPECIES: 13
+};
/**
* ASM3 class for the Activated Sludge Model No. 3 (ASM3).
@@ -208,4 +213,4 @@ class ASM3 {
}
}
-module.exports = ASM3;
\ No newline at end of file
+module.exports = { ASM3, ASM_CONSTANTS };
\ No newline at end of file
diff --git a/src/specificClass.js b/src/specificClass.js
index 18ac54a..3f368e1 100644
--- a/src/specificClass.js
+++ b/src/specificClass.js
@@ -1,4 +1,4 @@
-const ASM3 = require('./reaction_modules/asm3_class.js');
+const { ASM3, ASM_CONSTANTS } = require('./reaction_modules/asm3_class.js');
const { create, all, isArray, i } = require('mathjs');
const { assertNoNaN } = require('./utils.js');
const { childRegistrationUtils, logger, MeasurementContainer } = require('generalFunctions');
@@ -10,8 +10,6 @@ const mathConfig = {
const math = create(all, mathConfig);
-const S_O_INDEX = 0;
-const NUM_SPECIES = 13;
const BC_PADDING = 2;
const DEBUG = false;
const DAY2MS = 1000 * 60 * 60 * 24;
@@ -39,7 +37,7 @@ class Reactor {
this.volume = config.volume; // fluid volume reactor [m3]
this.Fs = [0]; // fluid debits per inlet [m3 d-1]
- this.Cs_in = [Array(NUM_SPECIES).fill(0)]; // composition influents
+ this.Cs_in = [Array(ASM_CONSTANTS.NUM_SPECIES).fill(0)]; // composition influents
this.OTR = 0.0; // oxygen transfer rate [g O2 d-1 m-3]
this.temperature = 20; // temperature [C]
@@ -59,7 +57,7 @@ class Reactor {
if (this.Fs.length <= i_in) {
this.logger.debug(`Adding new inlet index ${i_in}.`);
this.Fs.push(0);
- this.Cs_in.push(Array(NUM_SPECIES).fill(0));
+ this.Cs_in.push(Array(ASM_CONSTANTS.NUM_SPECIES).fill(0));
this.setInfluent = input;
}
this.Fs[i_in] = input.payload.F;
@@ -243,8 +241,8 @@ class Reactor_CSTR extends Reactor {
const inflow = math.multiply(math.divide([this.Fs], this.volume), this.Cs_in)[0];
const outflow = math.multiply(-1 * math.sum(this.Fs) / this.volume, this.state);
const reaction = this.asm.compute_dC(this.state, this.temperature);
- const transfer = Array(NUM_SPECIES).fill(0.0);
- transfer[S_O_INDEX] = isNaN(this.kla) ? this.OTR : this._calcOTR(this.state[S_O_INDEX], this.temperature); // calculate OTR if kla is not NaN, otherwise use externaly calculated OTR
+ const transfer = Array(ASM_CONSTANTS.NUM_SPECIES).fill(0.0);
+ transfer[ASM_CONSTANTS.S_O_INDEX] = isNaN(this.kla) ? this.OTR : this._calcOTR(this.state[S_O_INDEX], this.temperature); // calculate OTR if kla is not NaN, otherwise use externaly calculated OTR
const dC_total = math.multiply(math.add(inflow, outflow, reaction, transfer), time_step)
this.state = this._arrayClip2Zero(math.add(this.state, dC_total)); // clip value element-wise to avoid negative concentrations
@@ -273,7 +271,7 @@ class Reactor_PFR extends Reactor {
this.alpha = config.alpha;
this.state = Array.from(Array(this.n_x), () => config.initialState.slice());
- this.extendedState = Array.from(Array(this.n_x + 2*BC_PADDING), () => new Array(NUM_SPECIES).fill(0));
+ this.extendedState = Array.from(Array(this.n_x + 2*BC_PADDING), () => new Array(ASM_CONSTANTS.NUM_SPECIES).fill(0));
// initialise extended state
this.state.forEach((row, i) => this.extendedState[i+BC_PADDING] = row);
@@ -324,15 +322,15 @@ class Reactor_PFR extends Reactor {
const dispersion = math.multiply(this.D / (this.d_x*this.d_x), this.D2_op, this.extendedState);
const advection = math.multiply(-1 * math.sum(this.Fs) / (this.A*this.d_x), this.D_op, this.extendedState);
const reaction = this.extendedState.map((state_slice) => this.asm.compute_dC(state_slice, this.temperature));
- const transfer = Array.from(Array(this.n_x+2*BC_PADDING), () => new Array(NUM_SPECIES).fill(0));
+ const transfer = Array.from(Array(this.n_x+2*BC_PADDING), () => new Array(ASM_CONSTANTS.NUM_SPECIES).fill(0));
if (isNaN(this.kla)) { // calculate OTR if kla is not NaN, otherwise use externally calculated OTR
for (let i = BC_PADDING+1; i < BC_PADDING+this.n_x - 1; i++) {
- transfer[i][S_O_INDEX] = this.OTR * this.n_x/(this.n_x-2);
+ transfer[i][ASM_CONSTANTS.S_O_INDEX] = this.OTR * this.n_x/(this.n_x-2);
}
} else {
for (let i = BC_PADDING+1; i < BC_PADDING+this.n_x - 1; i++) {
- transfer[i][S_O_INDEX] = this._calcOTR(this.extendedState[i][S_O_INDEX], this.temperature) * this.n_x/(this.n_x-2);
+ transfer[i][ASM_CONSTANTS.S_O_INDEX] = this._calcOTR(this.extendedState[i][ASM_CONSTANTS.S_O_INDEX], this.temperature) * this.n_x/(this.n_x-2);
}
}
@@ -357,7 +355,7 @@ class Reactor_PFR extends Reactor {
switch(measurementType) {
case "quantity (oxygen)":
let grid_pos = Math.round(context.distance / this.config.length * this.n_x);
- this.state[grid_pos][S_O_INDEX] = value; // naive approach for reconciling measurements and simulation
+ this.state[grid_pos][0] = value; // naive approach for reconciling measurements and simulation
break;
default:
super._updateMeasurement(measurementType, value, position, context);
From 9f060d2dd0c64f3d6e89759aefa3ec7b2096be5c Mon Sep 17 00:00:00 2001
From: "p.vanderwilt"
Date: Thu, 6 Nov 2025 16:09:18 +0100
Subject: [PATCH 3/7] Refactor, minor changes and remove depreciated functions
---
reactor.html | 15 +--------------
src/nodeClass.js | 1 -
src/specificClass.js | 24 ++++--------------------
3 files changed, 5 insertions(+), 35 deletions(-)
diff --git a/reactor.html b/reactor.html
index cdca7c7..6825342 100644
--- a/reactor.html
+++ b/reactor.html
@@ -2,7 +2,7 @@