From 06d81169e847d743a1e64254855d906e7908e8ef Mon Sep 17 00:00:00 2001 From: znetsixe Date: Tue, 14 Apr 2026 07:59:04 +0200 Subject: [PATCH] fix(trends): add msg.timestamp to chart data points FlowFuse ui-chart with xAxisType=time may need an explicit timestamp on each msg for the time axis to render. Added Date.now() as msg.timestamp on the per-pump dispatcher flow/power outputs. Co-Authored-By: Claude Opus 4.6 (1M context) --- examples/pumpingstation-3pumps-dashboard/build_flow.py | 5 +++-- examples/pumpingstation-3pumps-dashboard/flow.json | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/pumpingstation-3pumps-dashboard/build_flow.py b/examples/pumpingstation-3pumps-dashboard/build_flow.py index 3dffced..5a4a834 100644 --- a/examples/pumpingstation-3pumps-dashboard/build_flow.py +++ b/examples/pumpingstation-3pumps-dashboard/build_flow.py @@ -882,6 +882,7 @@ def build_ui_tab(): f"dispatch_{pump}", TAB_UI, LANE_X[1], y_p + 40, f"dispatch {label}", "const p = msg.payload || {};\n" + "const ts = Date.now();\n" "return [\n" " {payload: String(p.state || 'idle')},\n" " {payload: String(p.mode || 'auto')},\n" @@ -890,8 +891,8 @@ def build_ui_tab(): " {payload: String(p.power || 'n/a')},\n" " {payload: String(p.pUp || 'n/a')},\n" " {payload: String(p.pDn || 'n/a')},\n" - " p.flowNum != null ? {topic: '" + label + "', payload: p.flowNum} : null,\n" - " p.powerNum != null ? {topic: '" + label + "', payload: p.powerNum} : null,\n" + " p.flowNum != null ? {topic: '" + label + "', payload: p.flowNum, timestamp: ts} : null,\n" + " p.powerNum != null ? {topic: '" + label + "', payload: p.powerNum, timestamp: ts} : null,\n" "];", outputs=9, wires=[ diff --git a/examples/pumpingstation-3pumps-dashboard/flow.json b/examples/pumpingstation-3pumps-dashboard/flow.json index 55a701c..955bd81 100644 --- a/examples/pumpingstation-3pumps-dashboard/flow.json +++ b/examples/pumpingstation-3pumps-dashboard/flow.json @@ -2016,7 +2016,7 @@ "type": "function", "z": "tab_ui", "name": "dispatch Pump A", - "func": "const p = msg.payload || {};\nreturn [\n {payload: String(p.state || 'idle')},\n {payload: String(p.mode || 'auto')},\n {payload: String(p.ctrl || 'n/a')},\n {payload: String(p.flow || 'n/a')},\n {payload: String(p.power || 'n/a')},\n {payload: String(p.pUp || 'n/a')},\n {payload: String(p.pDn || 'n/a')},\n p.flowNum != null ? {topic: 'Pump A', payload: p.flowNum} : null,\n p.powerNum != null ? {topic: 'Pump A', payload: p.powerNum} : null,\n];", + "func": "const p = msg.payload || {};\nconst ts = Date.now();\nreturn [\n {payload: String(p.state || 'idle')},\n {payload: String(p.mode || 'auto')},\n {payload: String(p.ctrl || 'n/a')},\n {payload: String(p.flow || 'n/a')},\n {payload: String(p.power || 'n/a')},\n {payload: String(p.pUp || 'n/a')},\n {payload: String(p.pDn || 'n/a')},\n p.flowNum != null ? {topic: 'Pump A', payload: p.flowNum, timestamp: ts} : null,\n p.powerNum != null ? {topic: 'Pump A', payload: p.powerNum, timestamp: ts} : null,\n];", "outputs": 9, "noerr": 0, "initialize": "", @@ -2382,7 +2382,7 @@ "type": "function", "z": "tab_ui", "name": "dispatch Pump B", - "func": "const p = msg.payload || {};\nreturn [\n {payload: String(p.state || 'idle')},\n {payload: String(p.mode || 'auto')},\n {payload: String(p.ctrl || 'n/a')},\n {payload: String(p.flow || 'n/a')},\n {payload: String(p.power || 'n/a')},\n {payload: String(p.pUp || 'n/a')},\n {payload: String(p.pDn || 'n/a')},\n p.flowNum != null ? {topic: 'Pump B', payload: p.flowNum} : null,\n p.powerNum != null ? {topic: 'Pump B', payload: p.powerNum} : null,\n];", + "func": "const p = msg.payload || {};\nconst ts = Date.now();\nreturn [\n {payload: String(p.state || 'idle')},\n {payload: String(p.mode || 'auto')},\n {payload: String(p.ctrl || 'n/a')},\n {payload: String(p.flow || 'n/a')},\n {payload: String(p.power || 'n/a')},\n {payload: String(p.pUp || 'n/a')},\n {payload: String(p.pDn || 'n/a')},\n p.flowNum != null ? {topic: 'Pump B', payload: p.flowNum, timestamp: ts} : null,\n p.powerNum != null ? {topic: 'Pump B', payload: p.powerNum, timestamp: ts} : null,\n];", "outputs": 9, "noerr": 0, "initialize": "", @@ -2748,7 +2748,7 @@ "type": "function", "z": "tab_ui", "name": "dispatch Pump C", - "func": "const p = msg.payload || {};\nreturn [\n {payload: String(p.state || 'idle')},\n {payload: String(p.mode || 'auto')},\n {payload: String(p.ctrl || 'n/a')},\n {payload: String(p.flow || 'n/a')},\n {payload: String(p.power || 'n/a')},\n {payload: String(p.pUp || 'n/a')},\n {payload: String(p.pDn || 'n/a')},\n p.flowNum != null ? {topic: 'Pump C', payload: p.flowNum} : null,\n p.powerNum != null ? {topic: 'Pump C', payload: p.powerNum} : null,\n];", + "func": "const p = msg.payload || {};\nconst ts = Date.now();\nreturn [\n {payload: String(p.state || 'idle')},\n {payload: String(p.mode || 'auto')},\n {payload: String(p.ctrl || 'n/a')},\n {payload: String(p.flow || 'n/a')},\n {payload: String(p.power || 'n/a')},\n {payload: String(p.pUp || 'n/a')},\n {payload: String(p.pDn || 'n/a')},\n p.flowNum != null ? {topic: 'Pump C', payload: p.flowNum, timestamp: ts} : null,\n p.powerNum != null ? {topic: 'Pump C', payload: p.powerNum, timestamp: ts} : null,\n];", "outputs": 9, "noerr": 0, "initialize": "",