Files
machineGroupControl/examples/02-Dashboard.json
znetsixe 4cb9c5084c feat(mgc): editor defaults, compact status badge, mode-case fix, real example flows + dashboard
Editor (mgc.html)
- Drag-in defaults now expose mode (optimalControl) and scaling (normalized)
  via dropdowns in the edit dialog. Was: no control fields in the UI at all,
  so users had to send set.mode/set.scaling after deploy or live with the
  hidden schema defaults.

Wire-up (src/nodeClass.js)
- buildDomainConfig now bridges the flat editor fields (mode, scaling) into
  the nested schema shape (mode.current, scaling.current). Was: returned {}
  so the editor's mode/scaling never reached the runtime.

Mode-case bug fix (src/specificClass.js)
- Schema enum values are camelCase (optimalControl, priorityControl) but the
  runtime switch in _runDispatch matched lowercase only. With the default
  config, dispatch silently fell through to the warning branch and nothing
  ran. Normalise via String(this.mode).toLowerCase() so both forms work.

Status badge (src/io/output.js)
- Compacted from ~80 chars (mode | Ⓝ: 💨=Q/Qmax | =P | N machine(s)) to
  ~50 chars (mode | norm | Q=Q/Qmax m³/h | P=P kW | active/total x).
  Drops emoji glyphs that rendered inconsistently across themes; uses the
  same dot+fill convention as pumpingStation.

Output extension (src/io/output.js)
- getOutput() now also emits flowCapacityMin/Max, machineCount,
  machineCountActive. Was: only group-level totals + dist-from-peak +
  mode/scaling, so dashboards couldn't show capacity / active count
  without subscribing to each rotatingMachine individually.

Examples
- Drop pre-refactor stubs (basic.flow.json, integration.flow.json,
  edge.flow.json). They had a single MGC + inject + debug, no children,
  and never dispatched anything.
- 01-Basic.json: 1 MGC + 3 rotatingMachine pumps + Setup once-fires
  virtualControl + cmd.startup on all pumps via fan-out function. Numbered
  driver groups for Control mode / Scaling / Operator demand. Pumps
  register with MGC via Port 2 (child.register, automatic).
- 02-Dashboard.json: same plumbing + FlowFuse Dashboard 2.0 page with
  Controls (mode + scaling buttons, demand slider 0–100, stop + init
  buttons), Status (7 ui-text rows), Trends (3 charts: flow + capacity,
  power, BEP rel %), and a raw-output ui-template dumping every Port 0
  field. Fan-out function caches last-known values so deltas don't blank.

Wiki + README
- examples/README.md rewritten for the two-file set with canonical command
  surface table and "what to try" recipes.
- wiki/Home.md §11 (Examples) updated; §14 #4 (TODO flow item) replaced
  with the actual current limitation (no per-pump fan-out on Port 0).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 15:24:03 +02:00

1206 lines
33 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[
{
"id": "tab_mgc_dash",
"type": "tab",
"label": "MGC - Dashboard",
"disabled": false,
"info": "Tier 2: one machineGroupControl coordinating three rotatingMachine pumps, driven by a FlowFuse dashboard. Mode + scaling buttons, demand slider, live status rows, three trend charts, and a raw-output table."
},
{
"id": "grp_mgc_unit",
"type": "group",
"z": "tab_mgc_dash",
"name": "Machine Group (Unit)",
"style": {
"label": true,
"stroke": "#000000",
"fill": "#50a8d9",
"fill-opacity": "0.10"
},
"nodes": [
"mgc_dash_node"
],
"x": 974,
"y": 379,
"w": 152,
"h": 122
},
{
"id": "grp_pump_a",
"type": "group",
"z": "tab_mgc_dash",
"name": "Pump A (Equipment)",
"style": {
"label": true,
"stroke": "#000000",
"fill": "#86bbdd",
"fill-opacity": "0.10"
},
"nodes": [
"rm_dash_pump_a"
],
"x": 694,
"y": 219,
"w": 142,
"h": 82
},
{
"id": "grp_pump_b",
"type": "group",
"z": "tab_mgc_dash",
"name": "Pump B (Equipment)",
"style": {
"label": true,
"stroke": "#000000",
"fill": "#86bbdd",
"fill-opacity": "0.10"
},
"nodes": [
"rm_dash_pump_b"
],
"x": 694,
"y": 399,
"w": 142,
"h": 82
},
{
"id": "grp_pump_c",
"type": "group",
"z": "tab_mgc_dash",
"name": "Pump C (Equipment)",
"style": {
"label": true,
"stroke": "#000000",
"fill": "#86bbdd",
"fill-opacity": "0.10"
},
"nodes": [
"rm_dash_pump_c"
],
"x": 694,
"y": 579,
"w": 142,
"h": 82
},
{
"id": "grp_drv_mode",
"type": "group",
"z": "tab_mgc_dash",
"name": "1. Control mode",
"style": {
"stroke": "#666666",
"fill": "#ffdf7f",
"fill-opacity": "0.15",
"label": true,
"color": "#333333"
},
"nodes": [
"ui_btn_mode_optimal",
"ui_btn_mode_priority"
],
"x": 94,
"y": 99,
"w": 312,
"h": 122
},
{
"id": "grp_drv_scaling",
"type": "group",
"z": "tab_mgc_dash",
"name": "2. Scaling",
"style": {
"stroke": "#666666",
"fill": "#ffdf7f",
"fill-opacity": "0.15",
"label": true,
"color": "#333333"
},
"nodes": [
"ui_btn_scaling_norm",
"ui_btn_scaling_abs"
],
"x": 94,
"y": 259,
"w": 312,
"h": 122
},
{
"id": "grp_drv_demand",
"type": "group",
"z": "tab_mgc_dash",
"name": "3. Operator demand",
"style": {
"stroke": "#666666",
"fill": "#ffdf7f",
"fill-opacity": "0.15",
"label": true,
"color": "#333333"
},
"nodes": [
"ui_slider_demand",
"ui_btn_demand_stop"
],
"x": 94,
"y": 419,
"w": 312,
"h": 122
},
{
"id": "grp_setup",
"type": "group",
"z": "tab_mgc_dash",
"name": "Setup — once on deploy + manual re-init",
"style": {
"stroke": "#666666",
"fill": "#dddddd",
"fill-opacity": "0.20",
"label": true,
"color": "#333333"
},
"nodes": [
"inj_setup_start",
"ui_btn_setup_init",
"fn_setup_fanout"
],
"x": 94,
"y": 579,
"w": 532,
"h": 122
},
{
"id": "grp_status_panel",
"type": "group",
"z": "tab_mgc_dash",
"name": "Live status, trends, raw output",
"style": {
"stroke": "#666666",
"fill": "#bde0fe",
"fill-opacity": "0.20",
"label": true,
"color": "#333333"
},
"nodes": [
"fn_status_split",
"ui_txt_mode",
"ui_txt_scaling",
"ui_txt_flow",
"ui_txt_power",
"ui_txt_capacity",
"ui_txt_machines",
"ui_txt_bep",
"ui_chart_flow",
"ui_chart_power",
"ui_chart_bep",
"ui_tpl_raw"
],
"x": 1234,
"y": 79,
"w": 712,
"h": 642
},
{
"id": "grp_dbg",
"type": "group",
"z": "tab_mgc_dash",
"name": "Debug outputs (sidebar)",
"style": {
"stroke": "#666666",
"fill": "#d1d1d1",
"fill-opacity": "0.2",
"label": true,
"color": "#333333"
},
"nodes": [
"dbg_port0",
"dbg_port1",
"dbg_port2"
],
"x": 1234,
"y": 759,
"w": 252,
"h": 202
},
{
"id": "cmt_title",
"type": "comment",
"z": "tab_mgc_dash",
"name": "MGC — Dashboard (Tier 2)",
"info": "Same command surface as the Basic flow, driven by a FlowFuse dashboard.\n\nOpen /dashboard/mgc-basic after deploy.\n\nCONTROLS panel\n- Mode: optimalControl / priorityControl → set.mode\n- Scaling: normalized (0100 %) / absolute (m³/h) → set.scaling\n- Demand slider 0100 → set.demand (interpretation depends on scaling)\n- Stop button (set.demand = 0) and Initialize pumps button\n\nSTATUS panel\n- Mode / Scaling / Total flow / Total power / Capacity (QminQmax) / Active machines / BEP distance (rel %)\n\nTRENDS panel\n- Flow (m³/h) — predicted aggregate vs capacity\n- Power (kW)\n- BEP distance (rel %)\n\nRAW OUTPUT panel\n- Full key/value dump of the latest MGC Port 0 cache (sorted).\n\nPORTS (preserved for inspection)\n- Port 0: process output (changed fields only)\n- Port 1: InfluxDB-shaped {measurement, fields, tags, timestamp}\n- Port 2: parent registration (when wired into a pumpingStation)",
"x": 1100,
"y": 280,
"wires": []
},
{
"id": "ui_base_mgc",
"type": "ui-base",
"name": "EVOLV Demo",
"path": "/dashboard",
"appIcon": "",
"includeClientData": true,
"acceptsClientConfig": [
"ui-notification",
"ui-control"
],
"showPathInSidebar": false,
"headerContent": "page",
"navigationStyle": "default",
"titleBarStyle": "default"
},
{
"id": "ui_theme_mgc",
"type": "ui-theme",
"name": "EVOLV Basic Theme",
"colors": {
"surface": "#ffffff",
"primary": "#50a8d9",
"bgPage": "#eeeeee",
"groupBg": "#ffffff",
"groupOutline": "#cccccc"
},
"sizes": {
"density": "default",
"pagePadding": "14px",
"groupGap": "14px",
"groupBorderRadius": "6px",
"widgetGap": "12px"
}
},
{
"id": "ui_page_mgc",
"type": "ui-page",
"name": "MGC Basic",
"ui": "ui_base_mgc",
"path": "/mgc-basic",
"icon": "settings-input-component",
"layout": "grid",
"theme": "ui_theme_mgc",
"breakpoints": [
{
"name": "Default",
"px": "0",
"cols": "12"
}
],
"order": 1,
"className": ""
},
{
"id": "ui_group_ctrl",
"type": "ui-group",
"name": "Controls",
"page": "ui_page_mgc",
"width": "6",
"height": "1",
"order": 1,
"showTitle": true,
"className": ""
},
{
"id": "ui_group_status",
"type": "ui-group",
"name": "Status",
"page": "ui_page_mgc",
"width": "6",
"height": "1",
"order": 2,
"showTitle": true,
"className": ""
},
{
"id": "ui_group_trends",
"type": "ui-group",
"name": "Trends",
"page": "ui_page_mgc",
"width": "12",
"height": "1",
"order": 3,
"showTitle": true,
"className": ""
},
{
"id": "ui_group_raw",
"type": "ui-group",
"name": "Raw output (Port 0 cache)",
"page": "ui_page_mgc",
"width": "12",
"height": "1",
"order": 4,
"showTitle": true,
"className": ""
},
{
"id": "ui_btn_mode_optimal",
"type": "ui-button",
"z": "tab_mgc_dash",
"g": "grp_drv_mode",
"group": "ui_group_ctrl",
"name": "Mode: optimalControl",
"label": "Mode: optimalControl",
"order": 1,
"width": "3",
"height": "1",
"emulateClick": false,
"tooltip": "Best-combination optimiser (BEP-Gravitation / NCog)",
"color": "",
"bgcolor": "",
"icon": "auto_fix_high",
"payload": "optimalControl",
"payloadType": "str",
"topic": "set.mode",
"topicType": "str",
"x": 260,
"y": 140,
"wires": [
[
"mgc_dash_node"
]
]
},
{
"id": "ui_btn_mode_priority",
"type": "ui-button",
"z": "tab_mgc_dash",
"g": "grp_drv_mode",
"group": "ui_group_ctrl",
"name": "Mode: priorityControl",
"label": "Mode: priorityControl",
"order": 2,
"width": "3",
"height": "1",
"emulateClick": false,
"tooltip": "Sequential equal-flow control by priority list",
"color": "",
"bgcolor": "",
"icon": "format_list_numbered",
"payload": "priorityControl",
"payloadType": "str",
"topic": "set.mode",
"topicType": "str",
"x": 260,
"y": 180,
"wires": [
[
"mgc_dash_node"
]
]
},
{
"id": "ui_btn_scaling_norm",
"type": "ui-button",
"z": "tab_mgc_dash",
"g": "grp_drv_scaling",
"group": "ui_group_ctrl",
"name": "Scaling: normalized",
"label": "Scaling: normalized",
"order": 3,
"width": "3",
"height": "1",
"emulateClick": false,
"tooltip": "Interpret set.demand as 0100 % of group capacity",
"color": "",
"bgcolor": "",
"icon": "percent",
"payload": "normalized",
"payloadType": "str",
"topic": "set.scaling",
"topicType": "str",
"x": 260,
"y": 300,
"wires": [
[
"mgc_dash_node"
]
]
},
{
"id": "ui_btn_scaling_abs",
"type": "ui-button",
"z": "tab_mgc_dash",
"g": "grp_drv_scaling",
"group": "ui_group_ctrl",
"name": "Scaling: absolute",
"label": "Scaling: absolute",
"order": 4,
"width": "3",
"height": "1",
"emulateClick": false,
"tooltip": "Interpret set.demand as m³/h (capped by group min/max)",
"color": "",
"bgcolor": "",
"icon": "exposure",
"payload": "absolute",
"payloadType": "str",
"topic": "set.scaling",
"topicType": "str",
"x": 260,
"y": 340,
"wires": [
[
"mgc_dash_node"
]
]
},
{
"id": "ui_slider_demand",
"type": "ui-slider",
"z": "tab_mgc_dash",
"g": "grp_drv_demand",
"group": "ui_group_ctrl",
"name": "Demand",
"label": "Demand",
"order": 5,
"width": "6",
"height": "1",
"topic": "set.demand",
"topicType": "str",
"icon": "speed",
"iconType": "fa",
"min": 0,
"max": 100,
"step": 1,
"thumbLabel": "always",
"tickLabel": "true",
"showTicks": false,
"passthru": true,
"outs": "all",
"className": "",
"x": 260,
"y": 460,
"wires": [
[
"mgc_dash_node"
]
]
},
{
"id": "ui_btn_demand_stop",
"type": "ui-button",
"z": "tab_mgc_dash",
"g": "grp_drv_demand",
"group": "ui_group_ctrl",
"name": "Demand = 0 (Stop)",
"label": "Stop (demand = 0)",
"order": 6,
"width": "6",
"height": "1",
"emulateClick": false,
"tooltip": "Send set.demand = 0 — MGC calls turnOffAllMachines",
"color": "#ffffff",
"bgcolor": "#cc6600",
"icon": "stop",
"payload": "0",
"payloadType": "num",
"topic": "set.demand",
"topicType": "str",
"x": 260,
"y": 500,
"wires": [
[
"mgc_dash_node"
]
]
},
{
"id": "ui_btn_setup_init",
"type": "ui-button",
"z": "tab_mgc_dash",
"g": "grp_setup",
"group": "ui_group_ctrl",
"name": "Initialize pumps",
"label": "Initialize pumps (virtualControl + startup)",
"order": 7,
"width": "12",
"height": "1",
"emulateClick": false,
"tooltip": "Re-runs the once-on-deploy setup: virtualControl mode + cmd.startup on all three pumps",
"color": "",
"bgcolor": "",
"icon": "play_arrow",
"payload": "go",
"payloadType": "str",
"topic": "",
"topicType": "str",
"x": 260,
"y": 620,
"wires": [
[
"fn_setup_fanout"
]
]
},
{
"id": "inj_setup_start",
"type": "inject",
"z": "tab_mgc_dash",
"g": "grp_setup",
"name": "Auto-start pumps",
"props": [
{ "p": "payload", "v": "go", "vt": "str" }
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": "1.5",
"topic": "",
"x": 260,
"y": 660,
"wires": [
[
"fn_setup_fanout"
]
]
},
{
"id": "fn_setup_fanout",
"type": "function",
"z": "tab_mgc_dash",
"g": "grp_setup",
"name": "fan-out: virtualControl + startup → A/B/C",
"func": "// Fire two messages per pump: set.mode = virtualControl, then cmd.startup.\nconst setMode = { topic: 'set.mode', payload: 'virtualControl' };\nconst startup = { topic: 'cmd.startup', payload: {} };\nreturn [\n [setMode, startup], // → Pump A\n [setMode, startup], // → Pump B\n [setMode, startup], // → Pump C\n];\n",
"outputs": 3,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 500,
"y": 640,
"wires": [
[
"rm_dash_pump_a"
],
[
"rm_dash_pump_b"
],
[
"rm_dash_pump_c"
]
]
},
{
"id": "fn_status_split",
"type": "function",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"name": "fan-out Port 0 (status + charts + raw)",
"func": "// MGC Port 0 emits delta-only. Cache last-known so deltas never blank a\n// row, then fan out one msg per ui-text / ui-chart / ui-template slot.\nconst cache = context.get('cache') || {};\nconst p = msg.payload || {};\nfor (const k in p) cache[k] = p[k];\ncontext.set('cache', cache);\n\nconst num = (v, dp, unit) => {\n const n = +v;\n if (!Number.isFinite(n)) return '—';\n return n.toFixed(dp) + (unit ? ' ' + unit : '');\n};\n\nconst mode = cache.mode || '—';\nconst scaling = cache.scaling || '—';\nconst flow = cache['atEquipment_predicted_flow'];\nconst power = cache['atEquipment_predicted_power'];\nconst qMin = cache.flowCapacityMin;\nconst qMax = cache.flowCapacityMax;\nconst nAct = cache.machineCountActive;\nconst nTot = cache.machineCount;\nconst bepRel = cache.relDistFromPeak;\n\nconst chart = (topic, v) => Number.isFinite(+v) ? { topic, payload: +v } : null;\n\nconst rawRows = Object.keys(cache).sort().map((k) => {\n const v = cache[k];\n let display;\n if (v === null || v === undefined) display = '—';\n else if (typeof v === 'number') display = Number.isInteger(v) ? String(v) : v.toFixed(4);\n else display = String(v);\n return { key: k, value: display };\n});\n\nreturn [\n // 06: status text\n { payload: mode },\n { payload: scaling },\n { payload: num(flow, 1, 'm³/h') },\n { payload: num(power, 2, 'kW') },\n { payload: Number.isFinite(+qMax) ? `${num(qMin, 1)} ${num(qMax, 1, 'm³/h')}` : '—' },\n { payload: Number.isFinite(+nAct) && Number.isFinite(+nTot) ? `${nAct} / ${nTot}` : '—' },\n { payload: num(bepRel, 1, '%') },\n // 79: charts (flow vs capacity / power / bep distance)\n chart('Flow', flow),\n chart('Capacity', qMax),\n chart('Power', power),\n chart('BEP rel%', bepRel),\n // 11: raw rows for the ui-template\n { payload: rawRows },\n];\n",
"outputs": 12,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1300,
"y": 140,
"wires": [
[
"ui_txt_mode"
],
[
"ui_txt_scaling"
],
[
"ui_txt_flow"
],
[
"ui_txt_power"
],
[
"ui_txt_capacity"
],
[
"ui_txt_machines"
],
[
"ui_txt_bep"
],
[
"ui_chart_flow"
],
[
"ui_chart_flow"
],
[
"ui_chart_power"
],
[
"ui_chart_bep"
],
[
"ui_tpl_raw"
]
]
},
{
"id": "ui_txt_mode",
"type": "ui-text",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"group": "ui_group_status",
"order": 1,
"width": "6",
"height": "1",
"name": "Mode",
"label": "Mode",
"format": "{{msg.payload}}",
"layout": "row-spread",
"style": false,
"font": "",
"fontSize": 14,
"color": "#1F4E79",
"x": 1560,
"y": 100,
"wires": []
},
{
"id": "ui_txt_scaling",
"type": "ui-text",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"group": "ui_group_status",
"order": 2,
"width": "6",
"height": "1",
"name": "Scaling",
"label": "Scaling",
"format": "{{msg.payload}}",
"layout": "row-spread",
"style": false,
"font": "",
"fontSize": 14,
"color": "#1F4E79",
"x": 1560,
"y": 140,
"wires": []
},
{
"id": "ui_txt_flow",
"type": "ui-text",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"group": "ui_group_status",
"order": 3,
"width": "6",
"height": "1",
"name": "Total flow",
"label": "Total flow",
"format": "{{msg.payload}}",
"layout": "row-spread",
"style": false,
"font": "",
"fontSize": 14,
"color": "#1F4E79",
"x": 1570,
"y": 180,
"wires": []
},
{
"id": "ui_txt_power",
"type": "ui-text",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"group": "ui_group_status",
"order": 4,
"width": "6",
"height": "1",
"name": "Total power",
"label": "Total power",
"format": "{{msg.payload}}",
"layout": "row-spread",
"style": false,
"font": "",
"fontSize": 14,
"color": "#1F4E79",
"x": 1580,
"y": 220,
"wires": []
},
{
"id": "ui_txt_capacity",
"type": "ui-text",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"group": "ui_group_status",
"order": 5,
"width": "6",
"height": "1",
"name": "Capacity (QminQmax)",
"label": "Capacity",
"format": "{{msg.payload}}",
"layout": "row-spread",
"style": false,
"font": "",
"fontSize": 14,
"color": "#1F4E79",
"x": 1620,
"y": 260,
"wires": []
},
{
"id": "ui_txt_machines",
"type": "ui-text",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"group": "ui_group_status",
"order": 6,
"width": "6",
"height": "1",
"name": "Machines (active / total)",
"label": "Machines",
"format": "{{msg.payload}}",
"layout": "row-spread",
"style": false,
"font": "",
"fontSize": 14,
"color": "#1F4E79",
"x": 1630,
"y": 300,
"wires": []
},
{
"id": "ui_txt_bep",
"type": "ui-text",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"group": "ui_group_status",
"order": 7,
"width": "6",
"height": "1",
"name": "BEP distance (rel)",
"label": "BEP distance",
"format": "{{msg.payload}}",
"layout": "row-spread",
"style": false,
"font": "",
"fontSize": 14,
"color": "#7D3C98",
"x": 1600,
"y": 340,
"wires": []
},
{
"id": "ui_chart_flow",
"type": "ui-chart",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"group": "ui_group_trends",
"name": "Flow vs capacity",
"label": "Flow (m³/h) — predicted vs capacity",
"order": 1,
"width": 6,
"height": 4,
"chartType": "line",
"category": "topic",
"categoryType": "msg",
"xAxisLabel": "time",
"xAxisType": "time",
"xAxisProperty": "",
"xAxisPropertyType": "timestamp",
"xAxisFormat": "",
"xAxisFormatType": "auto",
"yAxisLabel": "m³/h",
"yAxisProperty": "payload",
"yAxisPropertyType": "msg",
"xmin": "",
"xmax": "",
"ymin": "",
"ymax": "",
"removeOlder": "15",
"removeOlderUnit": "60",
"removeOlderPoints": "",
"bins": 10,
"action": "append",
"stackSeries": false,
"pointShape": "circle",
"pointRadius": 4,
"interpolation": "linear",
"showLegend": true,
"className": "",
"colors": [
"#0095FF",
"#cccccc",
"#FF7F0E",
"#2CA02C",
"#A347E1",
"#D62728",
"#FF9896",
"#9467BD",
"#C5B0D5"
],
"textColor": [
"#666666"
],
"textColorDefault": true,
"gridColor": [
"#e5e5e5"
],
"gridColorDefault": true,
"x": 1600,
"y": 400,
"wires": []
},
{
"id": "ui_chart_power",
"type": "ui-chart",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"group": "ui_group_trends",
"name": "Power",
"label": "Power (kW)",
"order": 2,
"width": 6,
"height": 4,
"chartType": "line",
"category": "topic",
"categoryType": "msg",
"xAxisLabel": "time",
"xAxisType": "time",
"xAxisProperty": "",
"xAxisPropertyType": "timestamp",
"xAxisFormat": "",
"xAxisFormatType": "auto",
"yAxisLabel": "kW",
"yAxisProperty": "payload",
"yAxisPropertyType": "msg",
"xmin": "",
"xmax": "",
"ymin": "",
"ymax": "",
"removeOlder": "15",
"removeOlderUnit": "60",
"removeOlderPoints": "",
"bins": 10,
"action": "append",
"stackSeries": false,
"pointShape": "circle",
"pointRadius": 4,
"interpolation": "linear",
"showLegend": false,
"className": "",
"colors": [
"#2CA02C",
"#FF0000",
"#FF7F0E",
"#0095FF",
"#A347E1",
"#D62728",
"#FF9896",
"#9467BD",
"#C5B0D5"
],
"textColor": [
"#666666"
],
"textColorDefault": true,
"gridColor": [
"#e5e5e5"
],
"gridColorDefault": true,
"x": 1580,
"y": 440,
"wires": []
},
{
"id": "ui_chart_bep",
"type": "ui-chart",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"group": "ui_group_trends",
"name": "BEP distance (rel %)",
"label": "BEP distance (rel %)",
"order": 3,
"width": 6,
"height": 4,
"chartType": "line",
"category": "topic",
"categoryType": "msg",
"xAxisLabel": "time",
"xAxisType": "time",
"xAxisProperty": "",
"xAxisPropertyType": "timestamp",
"xAxisFormat": "",
"xAxisFormatType": "auto",
"yAxisLabel": "%",
"yAxisProperty": "payload",
"yAxisPropertyType": "msg",
"xmin": "",
"xmax": "",
"ymin": "",
"ymax": "",
"removeOlder": "15",
"removeOlderUnit": "60",
"removeOlderPoints": "",
"bins": 10,
"action": "append",
"stackSeries": false,
"pointShape": "circle",
"pointRadius": 4,
"interpolation": "linear",
"showLegend": false,
"className": "",
"colors": [
"#A347E1",
"#FF0000",
"#FF7F0E",
"#2CA02C",
"#0095FF",
"#D62728",
"#FF9896",
"#9467BD",
"#C5B0D5"
],
"textColor": [
"#666666"
],
"textColorDefault": true,
"gridColor": [
"#e5e5e5"
],
"gridColorDefault": true,
"x": 1610,
"y": 480,
"wires": []
},
{
"id": "ui_tpl_raw",
"type": "ui-template",
"z": "tab_mgc_dash",
"g": "grp_status_panel",
"group": "ui_group_raw",
"name": "Raw output table",
"order": 1,
"width": "12",
"height": "8",
"head": "",
"format": "<template>\n <div style=\"font-family:monospace;font-size:12px\">\n <table style=\"width:100%;border-collapse:collapse\">\n <tr v-for=\"row in rows\" :key=\"row.key\" style=\"border-bottom:1px solid #eee\">\n <td style=\"padding:2px 8px;color:#444;white-space:nowrap\">{{ row.key }}</td>\n <td style=\"padding:2px 8px;text-align:right;color:#0c4a72\">{{ row.value }}</td>\n </tr>\n </table>\n </div>\n</template>\n\n<script>\nexport default {\n data() { return { rows: [] }; },\n watch: {\n msg(m) {\n if (m && Array.isArray(m.payload)) this.rows = m.payload;\n }\n }\n}\n</script>\n",
"storeOutMessages": true,
"passthru": true,
"resendOnRefresh": true,
"templateScope": "local",
"className": "",
"x": 1620,
"y": 520,
"wires": [
[]
]
},
{
"id": "rm_dash_pump_a",
"type": "rotatingMachine",
"z": "tab_mgc_dash",
"g": "grp_pump_a",
"name": "Pump A",
"speed": "1",
"startup": "2",
"warmup": "1",
"shutdown": "2",
"cooldown": "1",
"movementMode": "staticspeed",
"machineCurve": "",
"uuid": "mgc-dash-pump-a",
"supplier": "hidrostal",
"category": "pump",
"assetType": "pump-centrifugal",
"model": "hidrostal-H05K-S03R",
"unit": "m3/h",
"curvePressureUnit": "mbar",
"curveFlowUnit": "m3/h",
"curvePowerUnit": "kW",
"curveControlUnit": "%",
"enableLog": false,
"logLevel": "info",
"positionVsParent": "atEquipment",
"positionIcon": "",
"hasDistance": false,
"distance": "",
"distanceUnit": "m",
"distanceDescription": "",
"x": 760,
"y": 260,
"wires": [
[],
[],
[
"mgc_dash_node"
]
]
},
{
"id": "rm_dash_pump_b",
"type": "rotatingMachine",
"z": "tab_mgc_dash",
"g": "grp_pump_b",
"name": "Pump B",
"speed": "1",
"startup": "2",
"warmup": "1",
"shutdown": "2",
"cooldown": "1",
"movementMode": "staticspeed",
"machineCurve": "",
"uuid": "mgc-dash-pump-b",
"supplier": "hidrostal",
"category": "pump",
"assetType": "pump-centrifugal",
"model": "hidrostal-H05K-S03R",
"unit": "m3/h",
"curvePressureUnit": "mbar",
"curveFlowUnit": "m3/h",
"curvePowerUnit": "kW",
"curveControlUnit": "%",
"enableLog": false,
"logLevel": "info",
"positionVsParent": "atEquipment",
"positionIcon": "",
"hasDistance": false,
"distance": "",
"distanceUnit": "m",
"distanceDescription": "",
"x": 760,
"y": 440,
"wires": [
[],
[],
[
"mgc_dash_node"
]
]
},
{
"id": "rm_dash_pump_c",
"type": "rotatingMachine",
"z": "tab_mgc_dash",
"g": "grp_pump_c",
"name": "Pump C",
"speed": "1",
"startup": "2",
"warmup": "1",
"shutdown": "2",
"cooldown": "1",
"movementMode": "staticspeed",
"machineCurve": "",
"uuid": "mgc-dash-pump-c",
"supplier": "hidrostal",
"category": "pump",
"assetType": "pump-centrifugal",
"model": "hidrostal-H05K-S03R",
"unit": "m3/h",
"curvePressureUnit": "mbar",
"curveFlowUnit": "m3/h",
"curvePowerUnit": "kW",
"curveControlUnit": "%",
"enableLog": false,
"logLevel": "info",
"positionVsParent": "atEquipment",
"positionIcon": "",
"hasDistance": false,
"distance": "",
"distanceUnit": "m",
"distanceDescription": "",
"x": 760,
"y": 620,
"wires": [
[],
[],
[
"mgc_dash_node"
]
]
},
{
"id": "mgc_dash_node",
"type": "machineGroupControl",
"z": "tab_mgc_dash",
"g": "grp_mgc_unit",
"name": "Machine Group",
"processOutputFormat": "process",
"dbaseOutputFormat": "influxdb",
"mode": "optimalControl",
"scaling": "normalized",
"uuid": "",
"supplier": "",
"category": "",
"assetType": "",
"model": "",
"unit": "",
"enableLog": false,
"logLevel": "info",
"positionVsParent": "atEquipment",
"positionIcon": "",
"hasDistance": false,
"distance": "",
"distanceUnit": "m",
"distanceDescription": "",
"x": 1050,
"y": 440,
"wires": [
[
"dbg_port0",
"fn_status_split"
],
[
"dbg_port1"
],
[
"dbg_port2"
]
]
},
{
"id": "dbg_port0",
"type": "debug",
"z": "tab_mgc_dash",
"g": "grp_dbg",
"name": "Port 0: Process",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"x": 1340,
"y": 800,
"wires": []
},
{
"id": "dbg_port1",
"type": "debug",
"z": "tab_mgc_dash",
"g": "grp_dbg",
"name": "Port 1: InfluxDB",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"x": 1340,
"y": 860,
"wires": []
},
{
"id": "dbg_port2",
"type": "debug",
"z": "tab_mgc_dash",
"g": "grp_dbg",
"name": "Port 2: Parent reg",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"x": 1350,
"y": 920,
"wires": []
},
{
"id": "mgc_global_cfg",
"type": "global-config",
"env": [],
"modules": {
"EVOLV": "1.0.29"
}
}
]