[ { "id": "77f00aef1c966167", "type": "tab", "label": "PumpingStation - Dashboard", "disabled": false, "info": "Tier 2: single pumpingStation node driven by a FlowFuse dashboard. Same command surface as the Basic flow, plus live status rows, four trend charts, and a raw-output table." }, { "id": "aa3381b896eb2cfb", "type": "group", "z": "77f00aef1c966167", "name": "Pumping Station (Process Cell)", "style": { "label": true, "stroke": "#000000", "fill": "#0c99d9", "fill-opacity": "0.10" }, "nodes": [ "8e78b6607deb33a7" ], "x": 534, "y": 371.5, "w": 232, "h": 97 }, { "id": "4996420d47442fad", "type": "group", "z": "77f00aef1c966167", "name": "1. Control mode", "style": { "stroke": "#666666", "fill": "#ffdf7f", "fill-opacity": "0.15", "label": true, "color": "#333333" }, "nodes": [ "ui_btn_mode_manual", "ui_btn_mode_lvl" ], "x": 94, "y": 119, "w": 272, "h": 122 }, { "id": "a9f9b38b0e00c1d7", "type": "group", "z": "77f00aef1c966167", "name": "2. Flow signals (inflow / outflow)", "style": { "stroke": "#666666", "fill": "#ffdf7f", "fill-opacity": "0.15", "label": true, "color": "#333333" }, "nodes": [ "ui_btn_inflow", "ui_btn_outflow" ], "x": 94, "y": 279, "w": 272, "h": 122 }, { "id": "42bf82c87d05f498", "type": "group", "z": "77f00aef1c966167", "name": "3. Operator demand (manual mode only)", "style": { "stroke": "#666666", "fill": "#ffdf7f", "fill-opacity": "0.15", "label": true, "color": "#333333" }, "nodes": [ "ui_btn_demand" ], "x": 94, "y": 459, "w": 261, "h": 82 }, { "id": "234bdce20170061a", "type": "group", "z": "77f00aef1c966167", "name": "4. Calibration", "style": { "stroke": "#666666", "fill": "#ffdf7f", "fill-opacity": "0.15", "label": true, "color": "#333333" }, "nodes": [ "ui_btn_cal_vol", "ui_btn_cal_lvl" ], "x": 94, "y": 579, "w": 272, "h": 122 }, { "id": "grp_status_panel", "type": "group", "z": "77f00aef1c966167", "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_direction", "ui_txt_level", "ui_txt_volume", "ui_txt_volpct", "ui_txt_pct", "ui_txt_demand", "ui_chart_level", "ui_chart_volume", "ui_chart_volpct", "ui_chart_flow", "ui_tpl_raw" ], "x": 854, "y": 99, "w": 712, "h": 642 }, { "id": "f4ba4542514ed853", "type": "group", "z": "77f00aef1c966167", "name": "Debug outputs (sidebar)", "style": { "stroke": "#666666", "fill": "#d1d1d1", "fill-opacity": "0.2", "label": true, "color": "#333333" }, "nodes": [ "b2450e5ee2eebfaa", "386af1ad8aa8ed12", "c27c2655f199b530" ], "x": 854, "y": 779, "w": 252, "h": 202 }, { "id": "b30af582f935bcb7", "type": "comment", "z": "77f00aef1c966167", "name": "PumpingStation — Dashboard (Tier 2)", "info": "Same command surface as the Basic example, driven by a FlowFuse dashboard.\n\nOpen /dashboard/pumpingstation-basic after deploy.\n\nCONTROLS panel\n- Mode buttons → set.mode (manual / levelbased)\n- Inflow / Outflow buttons → set.inflow / set.outflow (60 / 80 m³/h)\n- Demand button → set.demand (40 m³/h, manual mode only)\n- Calibrate buttons → cmd.calibrate.volume / cmd.calibrate.level\n\nSTATUS panel\n- 7 text rows: Mode, Direction, Level, Volume, Volume %, percControl, Manual demand\n\nTRENDS panel\n- 4 charts: Level (m), Volume (m³), Volume %, Flow (in/out/net m³/h)\n\nRAW OUTPUT panel\n- Full key/value dump of the latest Port 0 cache (sorted). Shows every field the node emits including basin geometry, safety thresholds, predicted overflow/underflow.\n\nThe fan-out function caches last-known values so delta-only Port 0 updates never blank a row.", "x": 660, "y": 320, "wires": [] }, { "id": "ui_base_ps", "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_ps", "type": "ui-theme", "name": "EVOLV Basic Theme", "colors": { "surface": "#ffffff", "primary": "#0c99d9", "bgPage": "#eeeeee", "groupBg": "#ffffff", "groupOutline": "#cccccc" }, "sizes": { "density": "default", "pagePadding": "14px", "groupGap": "14px", "groupBorderRadius": "6px", "widgetGap": "12px" } }, { "id": "ui_page_ps", "type": "ui-page", "name": "PumpingStation Basic", "ui": "ui_base_ps", "path": "/pumpingstation-basic", "icon": "water-pump", "layout": "grid", "theme": "ui_theme_ps", "breakpoints": [ { "name": "Default", "px": "0", "cols": "12" } ], "order": 1, "className": "" }, { "id": "ui_group_ctrl", "type": "ui-group", "name": "Controls", "page": "ui_page_ps", "width": "6", "height": "1", "order": 1, "showTitle": true, "className": "" }, { "id": "ui_group_status", "type": "ui-group", "name": "Status", "page": "ui_page_ps", "width": "6", "height": "1", "order": 2, "showTitle": true, "className": "" }, { "id": "ui_group_trends", "type": "ui-group", "name": "Trends", "page": "ui_page_ps", "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_ps", "width": "12", "height": "1", "order": 4, "showTitle": true, "className": "" }, { "id": "ui_btn_mode_manual", "type": "ui-button", "z": "77f00aef1c966167", "g": "4996420d47442fad", "group": "ui_group_ctrl", "name": "Mode: Manual", "label": "Mode: Manual", "order": 1, "width": "3", "height": "1", "emulateClick": false, "tooltip": "Switch control mode to manual (set.demand is honoured)", "color": "", "bgcolor": "", "icon": "pan_tool", "payload": "manual", "payloadType": "str", "topic": "set.mode", "topicType": "str", "x": 230, "y": 160, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "ui_btn_mode_lvl", "type": "ui-button", "z": "77f00aef1c966167", "g": "4996420d47442fad", "group": "ui_group_ctrl", "name": "Mode: Levelbased", "label": "Mode: Levelbased", "order": 2, "width": "3", "height": "1", "emulateClick": false, "tooltip": "Switch control mode to levelbased (ramp drives demand from level)", "color": "", "bgcolor": "", "icon": "stacked_line_chart", "payload": "levelbased", "payloadType": "str", "topic": "set.mode", "topicType": "str", "x": 240, "y": 200, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "ui_btn_inflow", "type": "ui-button", "z": "77f00aef1c966167", "g": "a9f9b38b0e00c1d7", "group": "ui_group_ctrl", "name": "Inflow 60 m³/h", "label": "Inflow 60 m³/h", "order": 3, "width": "3", "height": "1", "emulateClick": false, "tooltip": "Push a measured inflow of 60 m³/h into the basin balance", "color": "", "bgcolor": "", "icon": "south", "payload": "60", "payloadType": "num", "topic": "set.inflow", "topicType": "str", "x": 240, "y": 320, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "ui_btn_outflow", "type": "ui-button", "z": "77f00aef1c966167", "g": "a9f9b38b0e00c1d7", "group": "ui_group_ctrl", "name": "Outflow 80 m³/h", "label": "Outflow 80 m³/h", "order": 4, "width": "3", "height": "1", "emulateClick": false, "tooltip": "Push a measured outflow of 80 m³/h into the basin balance", "color": "", "bgcolor": "", "icon": "north", "payload": "80", "payloadType": "num", "topic": "set.outflow", "topicType": "str", "x": 240, "y": 360, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "ui_btn_demand", "type": "ui-button", "z": "77f00aef1c966167", "g": "42bf82c87d05f498", "group": "ui_group_ctrl", "name": "Demand 40 m³/h", "label": "Demand 40 m³/h (manual)", "order": 5, "width": "6", "height": "1", "emulateClick": false, "tooltip": "Operator outflow demand — only forwarded when mode = manual", "color": "", "bgcolor": "", "icon": "speed", "payload": "40", "payloadType": "num", "topic": "set.demand", "topicType": "str", "x": 240, "y": 500, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "ui_btn_cal_vol", "type": "ui-button", "z": "77f00aef1c966167", "g": "234bdce20170061a", "group": "ui_group_ctrl", "name": "Calibrate V=25 m³", "label": "Calibrate V = 25 m³", "order": 6, "width": "3", "height": "1", "emulateClick": false, "tooltip": "Snap the predicted-volume integrator to 25 m³", "color": "", "bgcolor": "", "icon": "tune", "payload": "25", "payloadType": "num", "topic": "cmd.calibrate.volume", "topicType": "str", "x": 240, "y": 620, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "ui_btn_cal_lvl", "type": "ui-button", "z": "77f00aef1c966167", "g": "234bdce20170061a", "group": "ui_group_ctrl", "name": "Calibrate L=1.5 m", "label": "Calibrate L = 1.5 m", "order": 7, "width": "3", "height": "1", "emulateClick": false, "tooltip": "Snap the predicted-volume integrator to a known level of 1.5 m", "color": "", "bgcolor": "", "icon": "tune", "payload": "1.5", "payloadType": "num", "topic": "cmd.calibrate.level", "topicType": "str", "x": 240, "y": 660, "wires": [ [ "8e78b6607deb33a7" ] ] }, { "id": "fn_status_split", "type": "function", "z": "77f00aef1c966167", "g": "grp_status_panel", "name": "fan-out Port 0 (status + charts + raw)", "func": "// Port 0 emits delta-only — cache last-known so deltas never blank a row.\n// Keys with dots use the runtime childId (= node id), so we pattern-match\n// by prefix rather than hardcoding.\nconst cache = context.get('cache') || {};\nconst p = msg.payload || {};\nfor (const k in p) cache[k] = p[k];\ncontext.set('cache', cache);\n\nconst findByPrefix = (prefix) => {\n for (const k of Object.keys(cache)) if (k.startsWith(prefix)) return cache[k];\n return null;\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 level = findByPrefix('level.predicted.atequipment.');\nconst volume = findByPrefix('volume.predicted.atequipment.');\nconst volPct = findByPrefix('volumePercent.predicted.atequipment.');\nconst qInS = findByPrefix('flow.predicted.in.');\nconst qOutS = findByPrefix('flow.predicted.out.');\nconst qNetS = findByPrefix('netFlowRate.predicted.atequipment.');\nconst qInH = Number.isFinite(+qInS) ? +qInS * 3600 : null;\nconst qOutH = Number.isFinite(+qOutS) ? +qOutS * 3600 : null;\nconst qNetH = Number.isFinite(+qNetS) ? +qNetS * 3600 : null;\nconst pct = cache.percControl;\nconst dem = cache.manualDemand;\nconst mode = cache.mode || '—';\nconst dir = cache.direction || '—';\n\nconst chart = (topic, v) => Number.isFinite(+v) ? { topic, payload: +v } : null;\n\n// Raw view: every cached key, sorted, with values prettified for display.\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 // 0–6: status text widgets\n { payload: mode },\n { payload: dir },\n { payload: num(level, 2, 'm') },\n { payload: num(volume, 2, 'm³') },\n { payload: num(volPct, 2, '%') },\n { payload: num(pct, 1, '%') },\n { payload: mode === 'manual'\n ? (Number.isFinite(+dem) ? num(dem, 1, 'm³/h') : 'not set')\n : '—' },\n // 7–9: single-series charts\n chart('Level', level),\n chart('Volume', volume),\n chart('Volume %', volPct),\n // 10–12: flow chart (three series share the same chart node)\n chart('Inflow', qInH),\n chart('Outflow', qOutH),\n chart('Net', qNetH),\n // 13: raw key/value rows for the ui-template\n { payload: rawRows },\n];\n", "outputs": 14, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 980, "y": 140, "wires": [ [ "ui_txt_mode" ], [ "ui_txt_direction" ], [ "ui_txt_level" ], [ "ui_txt_volume" ], [ "ui_txt_volpct" ], [ "ui_txt_pct" ], [ "ui_txt_demand" ], [ "ui_chart_level" ], [ "ui_chart_volume" ], [ "ui_chart_volpct" ], [ "ui_chart_flow" ], [ "ui_chart_flow" ], [ "ui_chart_flow" ], [ "ui_tpl_raw" ] ] }, { "id": "ui_txt_mode", "type": "ui-text", "z": "77f00aef1c966167", "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": 1240, "y": 100, "wires": [] }, { "id": "ui_txt_direction", "type": "ui-text", "z": "77f00aef1c966167", "g": "grp_status_panel", "group": "ui_group_status", "order": 2, "width": "6", "height": "1", "name": "Direction", "label": "Direction", "format": "{{msg.payload}}", "layout": "row-spread", "style": false, "font": "", "fontSize": 14, "color": "#1F4E79", "x": 1250, "y": 140, "wires": [] }, { "id": "ui_txt_level", "type": "ui-text", "z": "77f00aef1c966167", "g": "grp_status_panel", "group": "ui_group_status", "order": 3, "width": "6", "height": "1", "name": "Level", "label": "Level", "format": "{{msg.payload}}", "layout": "row-spread", "style": false, "font": "", "fontSize": 14, "color": "#1F4E79", "x": 1240, "y": 180, "wires": [] }, { "id": "ui_txt_volume", "type": "ui-text", "z": "77f00aef1c966167", "g": "grp_status_panel", "group": "ui_group_status", "order": 4, "width": "6", "height": "1", "name": "Volume", "label": "Volume", "format": "{{msg.payload}}", "layout": "row-spread", "style": false, "font": "", "fontSize": 14, "color": "#1F4E79", "x": 1250, "y": 220, "wires": [] }, { "id": "ui_txt_volpct", "type": "ui-text", "z": "77f00aef1c966167", "g": "grp_status_panel", "group": "ui_group_status", "order": 5, "width": "6", "height": "1", "name": "Volume %", "label": "Volume %", "format": "{{msg.payload}}", "layout": "row-spread", "style": false, "font": "", "fontSize": 14, "color": "#1F4E79", "x": 1250, "y": 260, "wires": [] }, { "id": "ui_txt_pct", "type": "ui-text", "z": "77f00aef1c966167", "g": "grp_status_panel", "group": "ui_group_status", "order": 6, "width": "6", "height": "1", "name": "percControl", "label": "percControl", "format": "{{msg.payload}}", "layout": "row-spread", "style": false, "font": "", "fontSize": 14, "color": "#1F4E79", "x": 1260, "y": 300, "wires": [] }, { "id": "ui_txt_demand", "type": "ui-text", "z": "77f00aef1c966167", "g": "grp_status_panel", "group": "ui_group_status", "order": 7, "width": "6", "height": "1", "name": "Manual demand", "label": "Manual demand", "format": "{{msg.payload}}", "layout": "row-spread", "style": false, "font": "", "fontSize": 14, "color": "#7D3C98", "x": 1270, "y": 340, "wires": [] }, { "id": "ui_chart_level", "type": "ui-chart", "z": "77f00aef1c966167", "g": "grp_status_panel", "group": "ui_group_trends", "name": "Level (m)", "label": "Level (m)", "order": 1, "width": 6, "height": 4, "chartType": "line", "category": "topic", "categoryType": "msg", "xAxisLabel": "time", "xAxisType": "time", "xAxisProperty": "", "xAxisPropertyType": "timestamp", "xAxisFormat": "", "xAxisFormatType": "auto", "yAxisLabel": "m", "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": [ "#0095FF", "#FF0000", "#FF7F0E", "#2CA02C", "#A347E1", "#D62728", "#FF9896", "#9467BD", "#C5B0D5" ], "textColor": [ "#666666" ], "textColorDefault": true, "gridColor": [ "#e5e5e5" ], "gridColorDefault": true, "x": 1240, "y": 400, "wires": [] }, { "id": "ui_chart_volume", "type": "ui-chart", "z": "77f00aef1c966167", "g": "grp_status_panel", "group": "ui_group_trends", "name": "Volume (m³)", "label": "Volume (m³)", "order": 2, "width": 6, "height": 4, "chartType": "line", "category": "topic", "categoryType": "msg", "xAxisLabel": "time", "xAxisType": "time", "xAxisProperty": "", "xAxisPropertyType": "timestamp", "xAxisFormat": "", "xAxisFormatType": "auto", "yAxisLabel": "m³", "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": 1250, "y": 440, "wires": [] }, { "id": "ui_chart_volpct", "type": "ui-chart", "z": "77f00aef1c966167", "g": "grp_status_panel", "group": "ui_group_trends", "name": "Volume %", "label": "Volume %", "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": "0", "ymax": "100", "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": 1240, "y": 480, "wires": [] }, { "id": "ui_chart_flow", "type": "ui-chart", "z": "77f00aef1c966167", "g": "grp_status_panel", "group": "ui_group_trends", "name": "Flow (m³/h)", "label": "Flow (m³/h) — Inflow / Outflow / Net", "order": 4, "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", "#FF7F0E", "#2CA02C", "#FF0000", "#A347E1", "#D62728", "#FF9896", "#9467BD", "#C5B0D5" ], "textColor": [ "#666666" ], "textColorDefault": true, "gridColor": [ "#e5e5e5" ], "gridColorDefault": true, "x": 1250, "y": 520, "wires": [] }, { "id": "ui_tpl_raw", "type": "ui-template", "z": "77f00aef1c966167", "g": "grp_status_panel", "group": "ui_group_raw", "name": "Raw output table", "order": 1, "width": "12", "height": "8", "head": "", "format": "\n\n\n", "storeOutMessages": true, "passthru": true, "resendOnRefresh": true, "templateScope": "local", "className": "", "x": 1260, "y": 580, "wires": [ [] ] }, { "id": "b2450e5ee2eebfaa", "type": "debug", "z": "77f00aef1c966167", "g": "f4ba4542514ed853", "name": "Port 0: Process", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "x": 980, "y": 820, "wires": [] }, { "id": "386af1ad8aa8ed12", "type": "debug", "z": "77f00aef1c966167", "g": "f4ba4542514ed853", "name": "Port 1: InfluxDB", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "x": 980, "y": 880, "wires": [] }, { "id": "c27c2655f199b530", "type": "debug", "z": "77f00aef1c966167", "g": "f4ba4542514ed853", "name": "Port 2: Parent reg", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "x": 990, "y": 940, "wires": [] }, { "id": "8e78b6607deb33a7", "type": "pumpingStation", "z": "77f00aef1c966167", "g": "aa3381b896eb2cfb", "name": "", "simulator": false, "basinVolume": 50, "basinHeight": 4, "inflowLevel": 1.5, "outflowLevel": 0.2, "overflowLevel": 3.8, "defaultFluid": "wastewater", "inletPipeDiameter": 0.3, "outletPipeDiameter": 0.3, "pipelineLength": 80, "maxDischargeHead": 24, "staticHead": 12, "maxInflowRate": 200, "temperatureReferenceDegC": 15, "timeleftToFullOrEmptyThresholdSeconds": 0, "enableDryRunProtection": true, "enableHighVolumeSafety": true, "enableOverfillProtection": true, "dryRunThresholdPercent": 2, "highVolumeSafetyThresholdPercent": 98, "overfillThresholdPercent": 98, "minHeightBasedOn": "outlet", "processOutputFormat": "process", "dbaseOutputFormat": "influxdb", "refHeight": "NAP", "basinBottomRef": 1, "uuid": "", "supplier": "", "category": "", "assetType": "", "model": "", "unit": "", "enableLog": false, "logLevel": "error", "positionVsParent": "atEquipment", "positionIcon": "⊥", "hasDistance": false, "distance": "", "controlMode": "levelbased", "levelCurveType": "linear", "logCurveFactor": 9, "enableShiftedRamp": false, "shiftLevel": 0, "shiftArmPercent": 95, "startLevel": 1, "stopLevel": 0.5, "minLevel": 0.3, "maxLevel": 3.8, "flowSetpoint": null, "flowDeadband": null, "x": 650, "y": 420, "wires": [ [ "b2450e5ee2eebfaa", "fn_status_split" ], [ "386af1ad8aa8ed12" ], [ "c27c2655f199b530" ] ] }, { "id": "ef77c1819422a098", "type": "global-config", "env": [], "modules": { "EVOLV": "1.0.29" } } ]