From 89d2260351dc0b81909f432958ce5d1b8169dfdf Mon Sep 17 00:00:00 2001 From: znetsixe <73483679+znetsixe@users.noreply.github.com> Date: Wed, 11 Mar 2026 11:13:44 +0100 Subject: [PATCH] updates --- config/machine.json | 191 +++++++++++++++++++++++----------- config/machineGroup.json | 101 ++++++++++-------- config/measurement.json | 99 +++++++++--------- config/pumpingStation.json | 164 ++++++++++++++++++++++------- config/reactor.json | 90 ++++++++++------ config/valveGroupControl.json | 2 +- dashboardapi.html | 8 +- src/nodeClass.js | 1 + src/specificClass.js | 5 +- 9 files changed, 433 insertions(+), 228 deletions(-) diff --git a/config/machine.json b/config/machine.json index b4c82ae..5e0813c 100644 --- a/config/machine.json +++ b/config/machine.json @@ -17,106 +17,174 @@ "id": null, "links": [], "panels": [ - { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, "title": "Realtime Machine", "type": "row" }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, "title": "Status", "type": "row" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "gridPos": { "h": 5, "w": 6, "x": 0, "y": 1 }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, "mappings": [{ "type": "value", "options": { "off": { "color": "red", "text": "OFF" }, "idle": { "color": "blue", "text": "IDLE" }, "operational": { "color": "green", "text": "RUNNING" }, "starting": { "color": "yellow", "text": "STARTING" }, "stopping": { "color": "yellow", "text": "STOPPING" } } }] }, "overrides": [] }, + "gridPos": { "h": 4, "w": 5, "x": 0, "y": 1 }, "id": 2, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "none" }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"state\" or r._field==\"mode\"))\n |> last()", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"state\")\n |> last()", "refId": "A" } ], - "title": "State / Mode (last)", + "title": "State", "type": "stat" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "gridPos": { "h": 5, "w": 6, "x": 6, "y": 1 }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "purple", "value": null }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 5, "x": 5, "y": 1 }, "id": 3, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "none" }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"ctrl\" or r._field==\"runtime\"))\n |> last()", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"mode\")\n |> last()", "refId": "A" } ], - "title": "Ctrl / Runtime (last)", + "title": "Mode", "type": "stat" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "fieldConfig": { "defaults": { "unit": "none" }, "overrides": [] }, - "gridPos": { "h": 9, "w": 12, "x": 12, "y": 1 }, + "fieldConfig": { "defaults": { "min": 0, "max": 100, "unit": "percent", "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }, { "color": "green", "value": 20 }, { "color": "yellow", "value": 80 }, { "color": "red", "value": 95 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 5, "x": 10, "y": 1 }, "id": 4, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "showThresholdLabels": false, "showThresholdMarkers": true }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"flow.predicted.downstream\" or r._field==\"flow.predicted.atEquipment\"))\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"ctrl\")\n |> last()", "refId": "A" } + ], + "title": "Ctrl %", + "type": "gauge" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "h", "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 5, "x": 15, "y": 1 }, + "id": 5, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"runtime\")\n |> last()", "refId": "A" } + ], + "title": "Runtime", + "type": "stat" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "min": 0, "max": 100, "unit": "percent", "thresholds": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "orange", "value": 30 }, { "color": "yellow", "value": 60 }, { "color": "green", "value": 80 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 4, "x": 20, "y": 1 }, + "id": 6, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "showThresholdLabels": false, "showThresholdMarkers": true }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"NCogPercent\")\n |> last()", "refId": "A" } + ], + "title": "NCog %", + "type": "gauge" + }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 }, "id": 7, "title": "Flow & Efficiency", "type": "row" }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 10 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 6 }, + "id": 8, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^flow\\.predicted\\.(downstream|atequipment)/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } ], "title": "Flow (predicted)", "type": "timeseries" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "fieldConfig": { "defaults": { "unit": "none" }, "overrides": [] }, - "gridPos": { "h": 8, "w": 12, "x": 0, "y": 6 }, - "id": 5, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, + "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 10 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 6 }, + "id": 9, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"power.predicted.atEquipment\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"cog\" or r._field==\"NCogPercent\"))\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } ], - "title": "Power (predicted @ atEquipment)", + "title": "Efficiency (CoG + NCog%)", + "type": "timeseries" + }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 14 }, "id": 10, "title": "Pressure & Temperature", "type": "row" }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 10 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 15 }, + "id": 11, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^pressure\\.(predicted|measured)\\.(upstream|downstream)/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } + ], + "title": "Pressure (upstream / downstream)", "type": "timeseries" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "fieldConfig": { "defaults": { "unit": "none" }, "overrides": [] }, - "gridPos": { "h": 8, "w": 12, "x": 12, "y": 10 }, - "id": 6, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, + "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 10 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 15 }, + "id": 12, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"pressure.measured.upstream\" or r._field==\"pressure.measured.downstream\"))\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^temperature/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } ], - "title": "Pressure (measured)", + "title": "Temperature", "type": "timeseries" + }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 23 }, "id": 13, "title": "Diagnostics", "type": "row" }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "yellow", "value": 0.3 }, { "color": "green", "value": 0.7 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 0, "y": 24 }, + "id": 14, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"predictionQuality\")\n |> last()", "refId": "A" } + ], + "title": "Prediction Quality", + "type": "stat" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "yellow", "value": 0.3 }, { "color": "green", "value": 0.7 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 6, "y": 24 }, + "id": 15, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"predictionConfidence\")\n |> last()", "refId": "A" } + ], + "title": "Confidence", + "type": "stat" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 1 }, { "color": "red", "value": 2 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 12, "y": 24 }, + "id": 16, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "none" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"pressureDriftLevel\")\n |> last()", "refId": "A" } + ], + "title": "Pressure Drift", + "type": "stat" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 5 }, { "color": "red", "value": 15 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 18, "y": 24 }, + "id": 17, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "none" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"effDistFromPeak\" or r._field==\"effRelDistFromPeak\"))\n |> last()", "refId": "A" } + ], + "title": "Distance from Peak", + "type": "stat" } ], "schemaVersion": 39, "tags": ["EVOLV", "machine", "template"], "templating": { "list": [ - { - "name": "dbase", - "type": "custom", - "label": "dbase", - "query": "cdzg44tv250jkd", - "current": { "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": false }, - "options": [{ "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": true }], - "hide": 2 - }, - { - "name": "measurement", - "type": "custom", - "query": "template", - "current": { "text": "template", "value": "template", "selected": false }, - "options": [{ "text": "template", "value": "template", "selected": true }] - }, - { - "name": "bucket", - "type": "custom", - "query": "lvl2", - "current": { "text": "lvl2", "value": "lvl2", "selected": false }, - "options": [{ "text": "lvl2", "value": "lvl2", "selected": true }] - } + { "name": "dbase", "type": "custom", "label": "dbase", "query": "cdzg44tv250jkd", "current": { "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": false }, "options": [{ "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": true }], "hide": 2 }, + { "name": "measurement", "type": "custom", "query": "template", "current": { "text": "template", "value": "template", "selected": false }, "options": [{ "text": "template", "value": "template", "selected": true }] }, + { "name": "bucket", "type": "custom", "query": "lvl2", "current": { "text": "lvl2", "value": "lvl2", "selected": false }, "options": [{ "text": "lvl2", "value": "lvl2", "selected": true }] } ] }, "time": { "from": "now-6h", "to": "now" }, @@ -125,4 +193,3 @@ "uid": null, "version": 1 } - diff --git a/config/machineGroup.json b/config/machineGroup.json index cb7a7bc..1a43f5f 100644 --- a/config/machineGroup.json +++ b/config/machineGroup.json @@ -17,46 +17,78 @@ "id": null, "links": [], "panels": [ - { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, "title": "Realtime Machine Group", "type": "row" }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, "title": "Status", "type": "row" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "gridPos": { "h": 5, "w": 8, "x": 0, "y": 1 }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "purple", "value": null }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 0, "y": 1 }, "id": 2, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "none" }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"mode\" or r._field==\"scaling\"))\n |> last()", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"mode\")\n |> last()", "refId": "A" } ], - "title": "Mode / Scaling (last)", + "title": "Mode", "type": "stat" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "gridPos": { "h": 5, "w": 8, "x": 8, "y": 1 }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 6, "y": 1 }, "id": 3, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "none" }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"NCog\" or r._field==\"absDistFromPeak\" or r._field==\"relDistFromPeak\"))\n |> last()", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"scaling\")\n |> last()", "refId": "A" } ], - "title": "Efficiency KPIs (last)", + "title": "Scaling", "type": "stat" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "fieldConfig": { "defaults": { "unit": "none" }, "overrides": [] }, - "gridPos": { "h": 9, "w": 24, "x": 0, "y": 6 }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 5 }, { "color": "red", "value": 15 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 12, "y": 1 }, "id": 4, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"downstream_predicted_flow\" or r._field==\"downstream_predicted_power\"))\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"absDistFromPeak\")\n |> last()", "refId": "A" } ], - "title": "Totals (flow / power)", + "title": "Abs Dist Peak", + "type": "stat" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "percent", "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 10 }, { "color": "red", "value": 25 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 18, "y": 1 }, + "id": 5, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"relDistFromPeak\")\n |> last()", "refId": "A" } + ], + "title": "Rel Dist Peak", + "type": "stat" + }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 }, "id": 6, "title": "Totals", "type": "row" }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 10 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 6 }, + "id": 7, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /predicted_flow|flow/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } + ], + "title": "Total Flow", + "type": "timeseries" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 10 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 6 }, + "id": 8, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /predicted_power|power/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } + ], + "title": "Total Power", "type": "timeseries" } ], @@ -64,29 +96,9 @@ "tags": ["EVOLV", "machineGroup", "template"], "templating": { "list": [ - { - "name": "dbase", - "type": "custom", - "label": "dbase", - "query": "cdzg44tv250jkd", - "current": { "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": false }, - "options": [{ "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": true }], - "hide": 2 - }, - { - "name": "measurement", - "type": "custom", - "query": "template", - "current": { "text": "template", "value": "template", "selected": false }, - "options": [{ "text": "template", "value": "template", "selected": true }] - }, - { - "name": "bucket", - "type": "custom", - "query": "lvl2", - "current": { "text": "lvl2", "value": "lvl2", "selected": false }, - "options": [{ "text": "lvl2", "value": "lvl2", "selected": true }] - } + { "name": "dbase", "type": "custom", "label": "dbase", "query": "cdzg44tv250jkd", "current": { "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": false }, "options": [{ "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": true }], "hide": 2 }, + { "name": "measurement", "type": "custom", "query": "template", "current": { "text": "template", "value": "template", "selected": false }, "options": [{ "text": "template", "value": "template", "selected": true }] }, + { "name": "bucket", "type": "custom", "query": "lvl2", "current": { "text": "lvl2", "value": "lvl2", "selected": false }, "options": [{ "text": "lvl2", "value": "lvl2", "selected": true }] } ] }, "time": { "from": "now-6h", "to": "now" }, @@ -95,4 +107,3 @@ "uid": null, "version": 1 } - diff --git a/config/measurement.json b/config/measurement.json index 7987a3f..c402456 100644 --- a/config/measurement.json +++ b/config/measurement.json @@ -17,70 +17,76 @@ "id": null, "links": [], "panels": [ + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, "title": "Sensor", "type": "row" }, { - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, - "id": 1, - "title": "Realtime Sensor", - "type": "row" + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } }, "overrides": [] }, + "gridPos": { "h": 5, "w": 4, "x": 0, "y": 1 }, + "id": 2, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"mAbs\")\n |> last()", "refId": "A" } + ], + "title": "mAbs (current)", + "type": "stat" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "fieldConfig": { "defaults": { "unit": "none" }, "overrides": [] }, - "gridPos": { "h": 8, "w": 16, "x": 0, "y": 1 }, - "id": 2, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, + "fieldConfig": { "defaults": { "min": 0, "max": 100, "unit": "percent", "thresholds": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "orange", "value": 10 }, { "color": "green", "value": 20 }, { "color": "yellow", "value": 80 }, { "color": "red", "value": 90 }] } }, "overrides": [] }, + "gridPos": { "h": 5, "w": 4, "x": 4, "y": 1 }, + "id": 3, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "showThresholdLabels": false, "showThresholdMarkers": true }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"mAbs\" or r._field==\"mPercent\"))\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"mPercent\")\n |> last()", "refId": "A" } ], - "title": "Measured Value (mAbs / mPercent)", + "title": "mPercent", + "type": "gauge" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 10 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 16, "x": 8, "y": 1 }, + "id": 4, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"mAbs\" or r._field==\"mPercent\"))\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } + ], + "title": "mAbs over Time", + "type": "timeseries" + }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 9 }, "id": 5, "title": "Bounds", "type": "row" }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 5 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 10 }, + "id": 6, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"mAbs\" or r._field==\"totalMinSmooth\" or r._field==\"totalMaxSmooth\"))\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } + ], + "title": "mAbs + Smooth Bounds", "type": "timeseries" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "fieldConfig": { "defaults": { "unit": "none" }, "overrides": [] }, - "gridPos": { "h": 8, "w": 8, "x": 16, "y": 1 }, - "id": 3, - "options": { "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false } }, + "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 5 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 10 }, + "id": 7, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"mAbs\")\n |> last()", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"totalMinValue\" or r._field==\"totalMaxValue\"))\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } ], - "title": "mAbs (last)", - "type": "stat" + "title": "Absolute Min / Max", + "type": "timeseries" } ], "schemaVersion": 39, "tags": ["EVOLV", "measurement", "template"], "templating": { "list": [ - { - "name": "dbase", - "type": "custom", - "label": "dbase", - "query": "cdzg44tv250jkd", - "current": { "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": false }, - "options": [{ "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": true }], - "hide": 2 - }, - { - "name": "measurement", - "type": "custom", - "query": "template", - "current": { "text": "template", "value": "template", "selected": false }, - "options": [{ "text": "template", "value": "template", "selected": true }] - }, - { - "name": "bucket", - "type": "custom", - "query": "lvl2", - "current": { "text": "lvl2", "value": "lvl2", "selected": false }, - "options": [{ "text": "lvl2", "value": "lvl2", "selected": true }] - } + { "name": "dbase", "type": "custom", "label": "dbase", "query": "cdzg44tv250jkd", "current": { "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": false }, "options": [{ "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": true }], "hide": 2 }, + { "name": "measurement", "type": "custom", "query": "template", "current": { "text": "template", "value": "template", "selected": false }, "options": [{ "text": "template", "value": "template", "selected": true }] }, + { "name": "bucket", "type": "custom", "query": "lvl2", "current": { "text": "lvl2", "value": "lvl2", "selected": false }, "options": [{ "text": "lvl2", "value": "lvl2", "selected": true }] } ] }, "time": { "from": "now-6h", "to": "now" }, @@ -89,4 +95,3 @@ "uid": null, "version": 1 } - diff --git a/config/pumpingStation.json b/config/pumpingStation.json index d53a801..b238b2f 100644 --- a/config/pumpingStation.json +++ b/config/pumpingStation.json @@ -17,63 +17,150 @@ "id": null, "links": [], "panels": [ - { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, "title": "Realtime Pumping Station", "type": "row" }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, "title": "Status", "type": "row" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "gridPos": { "h": 5, "w": 8, "x": 0, "y": 1 }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 5, "x": 0, "y": 1 }, "id": 2, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "none" }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"direction\" or r._field==\"flowSource\" or r._field==\"timeleft\"))\n |> last()", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"direction\")\n |> last()", "refId": "A" } ], - "title": "Direction / Source / Timeleft (last)", + "title": "Direction", "type": "stat" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "fieldConfig": { "defaults": { "unit": "none" }, "overrides": [] }, - "gridPos": { "h": 9, "w": 16, "x": 8, "y": 1 }, + "fieldConfig": { "defaults": { "unit": "s", "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "orange", "value": 300 }, { "color": "red", "value": 600 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 5, "x": 5, "y": 1 }, "id": 3, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"level.measured.atequipment\" or r._field==\"level.predicted.atequipment\" or r._field==\"volume.predicted.atequipment\" or r._field==\"netFlowRate.predicted.atequipment\"))\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"timeleft\")\n |> last()", "refId": "A" } ], - "title": "Level / Volume / Net Flow", + "title": "Time Left", + "type": "stat" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "thresholds": { "mode": "absolute", "steps": [{ "color": "purple", "value": null }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 4, "x": 10, "y": 1 }, + "id": 4, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "none" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field==\"flowSource\")\n |> last()", "refId": "A" } + ], + "title": "Flow Source", + "type": "stat" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "min": 0, "max": 100, "unit": "percent", "thresholds": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "orange", "value": 20 }, { "color": "green", "value": 40 }, { "color": "orange", "value": 80 }, { "color": "red", "value": 95 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 5, "x": 14, "y": 1 }, + "id": 5, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "showThresholdLabels": false, "showThresholdMarkers": true }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^volumePercent\\.predicted\\.atequipment/)\n |> last()", "refId": "A" } + ], + "title": "Fill %", + "type": "gauge" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "m", "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 5, "x": 19, "y": 1 }, + "id": 6, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^level\\.predicted\\.atequipment/)\n |> last()", "refId": "A" } + ], + "title": "Level", + "type": "stat" + }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 }, "id": 7, "title": "Basin", "type": "row" }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "m", "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 10 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 6 }, + "id": 8, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^level\\.(predicted|measured)\\.atequipment/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } + ], + "title": "Level", "type": "timeseries" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "m\u00b3", "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 10 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 6 }, + "id": 9, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^volume\\.predicted\\.atequipment/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } + ], + "title": "Volume", + "type": "timeseries" + }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 14 }, "id": 10, "title": "Flow", "type": "row" }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "m\u00b3/h", "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 10 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 15 }, + "id": 11, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^netFlowRate\\.predicted\\.atequipment/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } + ], + "title": "Net Flow Rate", + "type": "timeseries" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "m\u00b3/h", "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 10 } }, "overrides": [] }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 15 }, + "id": 12, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^flow\\.(predicted|measured)\\.atequipment/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } + ], + "title": "Inflow + Outflow", + "type": "timeseries" + }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 23 }, "id": 13, "title": "Configuration", "type": "row" }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "m", "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 12, "x": 0, "y": 24 }, + "id": 14, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "none" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"heightInlet\" or r._field==\"heightOverflow\" or r._field==\"volEmptyBasin\"))\n |> last()", "refId": "A" } + ], + "title": "Heights", + "type": "stat" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "m\u00b3", "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 12, "x": 12, "y": 24 }, + "id": 15, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "none" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"maxVol\" or r._field==\"minVol\" or r._field==\"maxVolOverflow\" or r._field==\"minVolOut\" or r._field==\"minVolIn\"))\n |> last()", "refId": "A" } + ], + "title": "Volume Limits", + "type": "stat" } ], "schemaVersion": 39, "tags": ["EVOLV", "pumpingStation", "template"], "templating": { "list": [ - { - "name": "dbase", - "type": "custom", - "label": "dbase", - "query": "cdzg44tv250jkd", - "current": { "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": false }, - "options": [{ "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": true }], - "hide": 2 - }, - { - "name": "measurement", - "type": "custom", - "query": "template", - "current": { "text": "template", "value": "template", "selected": false }, - "options": [{ "text": "template", "value": "template", "selected": true }] - }, - { - "name": "bucket", - "type": "custom", - "query": "lvl2", - "current": { "text": "lvl2", "value": "lvl2", "selected": false }, - "options": [{ "text": "lvl2", "value": "lvl2", "selected": true }] - } + { "name": "dbase", "type": "custom", "label": "dbase", "query": "cdzg44tv250jkd", "current": { "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": false }, "options": [{ "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": true }], "hide": 2 }, + { "name": "measurement", "type": "custom", "query": "template", "current": { "text": "template", "value": "template", "selected": false }, "options": [{ "text": "template", "value": "template", "selected": true }] }, + { "name": "bucket", "type": "custom", "query": "lvl2", "current": { "text": "lvl2", "value": "lvl2", "selected": false }, "options": [{ "text": "lvl2", "value": "lvl2", "selected": true }] } ] }, "time": { "from": "now-6h", "to": "now" }, @@ -82,4 +169,3 @@ "uid": null, "version": 1 } - diff --git a/config/reactor.json b/config/reactor.json index 06835c0..f3968b6 100644 --- a/config/reactor.json +++ b/config/reactor.json @@ -17,19 +17,66 @@ "id": null, "links": [], "panels": [ - { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, "title": "Reactor (Simulation/Process)", "type": "row" }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, "title": "Status", "type": "row" }, { "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, - "gridPos": { "h": 9, "w": 24, "x": 0, "y": 1 }, + "fieldConfig": { "defaults": { "unit": "mg/L", "thresholds": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "yellow", "value": 0.5 }, { "color": "green", "value": 1.5 }, { "color": "yellow", "value": 4 }, { "color": "red", "value": 6 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 0, "y": 1 }, "id": 2, - "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, "targets": [ - { - "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\")\n |> filter(fn:(r) => r._field =~ /^(F|S_O|S_NH|S_NO|temperature)/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", - "refId": "A" - } + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^S_O/)\n |> last()", "refId": "A" } ], - "title": "Core Process Signals (if logged)", + "title": "DO (S_O)", + "type": "stat" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "mg/L", "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 2 }, { "color": "red", "value": 5 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 6, "y": 1 }, + "id": 3, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^S_NH/)\n |> last()", "refId": "A" } + ], + "title": "NH\u2084 (S_NH)", + "type": "stat" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "mg/L", "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 5 }, { "color": "red", "value": 10 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 12, "y": 1 }, + "id": 4, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^S_NO/)\n |> last()", "refId": "A" } + ], + "title": "NO\u2083 (S_NO)", + "type": "stat" + }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "unit": "mg/L", "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "yellow", "value": 3000 }, { "color": "red", "value": 5000 }] } }, "overrides": [] }, + "gridPos": { "h": 4, "w": 6, "x": 18, "y": 1 }, + "id": 5, + "options": { "reduceOptions": { "calcs": ["lastNotNull"] }, "colorMode": "value", "graphMode": "area" }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: -7d)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and r._field =~ /^X_TS/)\n |> last()", "refId": "A" } + ], + "title": "TSS (X_TS)", + "type": "stat" + }, + { "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 }, "id": 6, "title": "Trends", "type": "row" }, + { + "datasource": { "type": "influxdb", "uid": "cdzg44tv250jkd" }, + "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 5 } }, "overrides": [] }, + "gridPos": { "h": 9, "w": 24, "x": 0, "y": 6 }, + "id": 7, + "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "multi" } }, + "targets": [ + { "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\")\n |> filter(fn:(r) => r._field =~ /^(F|S_O|S_NH|S_NO|S_S|X_TS)/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } + ], + "title": "Core Process Signals", "type": "timeseries" } ], @@ -37,29 +84,9 @@ "tags": ["EVOLV", "reactor", "template"], "templating": { "list": [ - { - "name": "dbase", - "type": "custom", - "label": "dbase", - "query": "cdzg44tv250jkd", - "current": { "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": false }, - "options": [{ "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": true }], - "hide": 2 - }, - { - "name": "measurement", - "type": "custom", - "query": "template", - "current": { "text": "template", "value": "template", "selected": false }, - "options": [{ "text": "template", "value": "template", "selected": true }] - }, - { - "name": "bucket", - "type": "custom", - "query": "lvl2", - "current": { "text": "lvl2", "value": "lvl2", "selected": false }, - "options": [{ "text": "lvl2", "value": "lvl2", "selected": true }] - } + { "name": "dbase", "type": "custom", "label": "dbase", "query": "cdzg44tv250jkd", "current": { "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": false }, "options": [{ "text": "cdzg44tv250jkd", "value": "cdzg44tv250jkd", "selected": true }], "hide": 2 }, + { "name": "measurement", "type": "custom", "query": "template", "current": { "text": "template", "value": "template", "selected": false }, "options": [{ "text": "template", "value": "template", "selected": true }] }, + { "name": "bucket", "type": "custom", "query": "lvl2", "current": { "text": "lvl2", "value": "lvl2", "selected": false }, "options": [{ "text": "lvl2", "value": "lvl2", "selected": true }] } ] }, "time": { "from": "now-6h", "to": "now" }, @@ -68,4 +95,3 @@ "uid": null, "version": 1 } - diff --git a/config/valveGroupControl.json b/config/valveGroupControl.json index acc1e8e..73549e9 100644 --- a/config/valveGroupControl.json +++ b/config/valveGroupControl.json @@ -39,7 +39,7 @@ "options": { "legend": { "displayMode": "list", "placement": "bottom" } }, "targets": [ { - "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field==\"atequipment_measured_flow\" or r._field==\"atequipment_predicted_flow\" or r._field==\"maxDeltaP\"))\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", + "query": "from(bucket: \"${bucket}\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn:(r) => r._measurement==\"${measurement}\" and (r._field =~ /predicted_flow|measured_flow/ or r._field==\"maxDeltaP\"))\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)", "refId": "A" } ], diff --git a/dashboardapi.html b/dashboardapi.html index 539c58e..18a4f59 100644 --- a/dashboardapi.html +++ b/dashboardapi.html @@ -14,6 +14,7 @@ host: { value: 'localhost' }, port: { value: 3000 }, bearerToken: { value: '' }, + defaultBucket: { value: '' }, }, inputs: 1, outputs: 1, @@ -43,7 +44,7 @@ window.EVOLV.nodes.dashboardapi.loggerMenu.saveEditor(node); } - ['name', 'protocol', 'host', 'port', 'bearerToken'].forEach((field) => { + ['name', 'protocol', 'host', 'port', 'bearerToken', 'defaultBucket'].forEach((field) => { const element = document.getElementById(`node-input-${field}`); if (!element) return; node[field] = field === 'port' ? parseInt(element.value, 10) || 3000 : element.value || ''; @@ -82,6 +83,11 @@ +
+ + +
+
diff --git a/src/nodeClass.js b/src/nodeClass.js index ff4d9d2..ad86daa 100644 --- a/src/nodeClass.js +++ b/src/nodeClass.js @@ -34,6 +34,7 @@ class nodeClass { port: Number(uiConfig.port || 3000), bearerToken: uiConfig.bearerToken || '', }, + defaultBucket: uiConfig.defaultBucket || process.env.INFLUXDB_BUCKET || '', }; this._output = new outputUtils(); diff --git a/src/specificClass.js b/src/specificClass.js index 858a400..39c076e 100644 --- a/src/specificClass.js +++ b/src/specificClass.js @@ -65,6 +65,7 @@ class DashboardApi { port: Number(config?.grafanaConnector?.port || 3000), bearerToken: config?.grafanaConnector?.bearerToken || '', }, + defaultBucket: config?.defaultBucket || '', bucketMap: config?.bucketMap || {}, }; @@ -133,7 +134,9 @@ class DashboardApi { ); const bucket = - this.config.bucketMap[String(positionVsParent)] || defaultBucketForPosition(positionVsParent); + this.config.defaultBucket || + this.config.bucketMap[String(positionVsParent)] || + defaultBucketForPosition(positionVsParent); updateTemplatingVar(dashboard, 'measurement', measurementName); updateTemplatingVar(dashboard, 'bucket', bucket);