We are struggling with a memory problem. The attached flow should be ready to run but following nodes are needed:
- node-red-contrib-linux-memory (0.8.1)
- node-red-contrib-pid (1.1.7)
- node-red-dashboard (2.28.1)
To make it easier for somebody to test we are saving the graph data in the default context. Normally, we store this in a persistent context. The data produced by the simulation is not the problem here.
CH2 shows the memory available over time
Could somebody who is familiar with the dashboard and/or plotly.js have a look at this? If it is not a memory leak, is there a way to change GC settings?
node-red: v1.2.9
node: v12.13.0
[{"id":"b4973237.46ab6","type":"subflow","name":"Process Simulation","info":"","in":[{"x":37,"y":103,"wires":[{"id":"ec719d4d.0d54f8"}]}],"out":[{"x":728.5,"y":294,"wires":[{"id":"ae1a6e5.d4c0d9","port":0}]}]},{"id":"7fe4b5c3.32e58c","type":"function","z":"b4973237.46ab6","name":"30 sec RC + 20","func":"// Applies a simple RC low pass filter to incoming payload values\nvar tc = 30*1000; // time constant in milliseconds\n\nvar lastValue = context.get('lastValue');\nif (typeof lastValue == \"undefined\") lastValue = msg.payload;\nvar lastTime = context.get('lastTime') || null;\nvar now = new Date();\nvar currentValue = msg.payload;\nif (lastTime === null) {\n // first time through\n newValue = currentValue;\n} else {\n var dt = now - lastTime;\n var newValue;\n \n if (dt > 0) {\n var dtotc = dt / tc;\n newValue = lastValue * (1 - dtotc) + currentValue * dtotc;\n } else {\n // no time has elapsed leave output the same as last time\n newValue = lastValue;\n }\n}\ncontext.set('lastValue', newValue);\ncontext.set('lastTime', now);\n\nmsg.payload = newValue + 30;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":640,"y":220,"wires":[["ae1a6e5.d4c0d9"]]},{"id":"1bacd004.9753c","type":"inject","z":"b4973237.46ab6","name":"Inject -0.2 at start","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"","topic":"","payload":"-0.2","payloadType":"num","x":134.5,"y":30,"wires":[["ec719d4d.0d54f8"]]},{"id":"999a52c2.f465f","type":"function","z":"b4973237.46ab6","name":"10 sec RC","func":"// Applies a simple RC low pass filter to incoming payload values\nvar tc = 10*1000; // time constant in milliseconds\n\nvar lastValue = context.get('lastValue');\nif (typeof lastValue == \"undefined\") lastValue = msg.payload;\nvar lastTime = context.get('lastTime') || null;\nvar now = new Date();\nvar currentValue = msg.payload;\nif (lastTime === null) {\n // first time through\n newValue = currentValue;\n} else {\n var dt = now - lastTime;\n var newValue;\n \n if (dt > 0) {\n var dtotc = dt / tc;\n newValue = lastValue * (1 - dtotc) + currentValue * dtotc;\n } else {\n // no time has elapsed leave output the same as last time\n newValue = lastValue;\n }\n}\ncontext.set('lastValue', newValue);\ncontext.set('lastTime', now);\n\nmsg.payload = newValue;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":451,"y":207,"wires":[["7fe4b5c3.32e58c"]]},{"id":"ec719d4d.0d54f8","type":"delay","z":"b4973237.46ab6","name":"","pauseType":"delay","timeout":"0.5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":278,"y":104,"wires":[["ede39236.1961f8"]]},{"id":"a823c9cf.2a6178","type":"function","z":"b4973237.46ab6","name":"2 msg transport delay","func":"// stores messages in a fifo until the specified number have been received, \n// then releases them as new messages are received.\n// during the filling phase the earliest message is passed on each time \n// a message is received, but it is also left in the fifo\nvar fifoMaxLength = 2;\nvar fifo = context.get('fifo') || [];\n// push the new message onto the top of the array, messages are shifted down and\n// drop off the front\nvar length = fifo.push(msg); // returns new length\nif (length > fifoMaxLength) {\n newMsg = fifo.shift();\n} else {\n // not full yet, make a copy of the msg and pass it on\n var newMsg = JSON.parse(JSON.stringify(fifo[0]));\n}\ncontext.set('fifo', fifo);\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":260,"y":220,"wires":[["999a52c2.f465f"]]},{"id":"ae1a6e5.d4c0d9","type":"function","z":"b4973237.46ab6","name":"Clear all except payload","func":"msg2 = {payload: msg.payload};\nreturn msg2;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":545,"y":293,"wires":[[]]},{"id":"ede39236.1961f8","type":"range","z":"b4973237.46ab6","minin":"0","maxin":"1","minout":"0","maxout":"100","action":"scale","round":false,"property":"payload","name":"","x":87,"y":208,"wires":[["a823c9cf.2a6178"]]},{"id":"de69eea5.98a61","type":"tab","label":"Flow 2","disabled":false,"info":""},{"id":"22d8f7bd.d97cd8","type":"group","z":"de69eea5.98a61","name":"Advanced Graph (plotly.js)","style":{"label":true},"nodes":["63945869.2a8a98","e3203b44.f64818","eb258cd7.3839a","b600f37c.5480b","c7eea535.cff998","f4146d0b.fff29","f1a547a.b1f0ab8","1c73b5cf.df6eba","885d2b36.e12938","f91e30da.68a9f","c5a45422.05fd78","fd090c29.e8dbe","b9711f03.ff45a","ab2c716f.05ff","3afdf86a.6df9f8","ecb6e8fa.e19b48","51f79710.27e168","8ac1866f.768cc8","398431c6.2b15fe","6b75c3b0.f4e59c","1f729ea.68a5a61"],"x":1014,"y":79,"w":1032,"h":442},{"id":"75a219a6.3e67b8","type":"group","z":"de69eea5.98a61","name":"Memory monitoring","style":{"label":true},"nodes":["c113aa4b.85b348","d0485aca.231e38","c35ca5a4.4b5ec8","78297ac2.918984"],"x":94,"y":499,"w":812,"h":82},{"id":"846c946a.aae9b8","type":"group","z":"de69eea5.98a61","name":"PID Simulation","style":{"label":true},"nodes":["e0cb2a8c.4402a8","f70949c8.aab988","2792f805.066c78","1bf3ce16.c3ae02","f69bbf05.bdd49","143523b2.2f165c","5ec4239b.34e174","de738fc5.75e4c8","e94f888a.130a88","bef0a1f8.2e2cf","9079ffaf.4a096","f6889eca.85c47","e38e1f3a.72b78"],"x":74,"y":87,"w":852,"h":317},{"id":"e0cb2a8c.4402a8","type":"PID","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"","setpoint":"50","pb":"6","ti":"16","td":"4","integral_default":"0","smooth_factor":"0","max_interval":600,"enable":"1","disabled_op":"0","x":450,"y":220,"wires":[["5ec4239b.34e174","e94f888a.130a88","e38e1f3a.72b78"]]},{"id":"f70949c8.aab988","type":"change","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"live data","tot":"str"},{"t":"set","p":"channel_nbr","pt":"msg","to":"1","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":820,"y":280,"wires":[["1f729ea.68a5a61"]]},{"id":"2792f805.066c78","type":"inject","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"Setpoint 100","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":"","topic":"setpoint","payload":"100","payloadType":"num","x":192,"y":243,"wires":[["e0cb2a8c.4402a8"]]},{"id":"1bf3ce16.c3ae02","type":"inject","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"Setpoint 150","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":"","topic":"setpoint","payload":"150","payloadType":"num","x":190.5,"y":292,"wires":[["e0cb2a8c.4402a8"]]},{"id":"f69bbf05.bdd49","type":"inject","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"enable","repeat":"","crontab":"","once":false,"topic":"enable","payload":"true","payloadType":"bool","x":183,"y":128,"wires":[["e0cb2a8c.4402a8"]]},{"id":"143523b2.2f165c","type":"inject","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"disable","repeat":"","crontab":"","once":false,"topic":"enable","payload":"false","payloadType":"bool","x":183.5,"y":178,"wires":[["e0cb2a8c.4402a8"]]},{"id":"5ec4239b.34e174","type":"subflow:b4973237.46ab6","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"","env":[],"x":453,"y":147,"wires":[["de738fc5.75e4c8","e0cb2a8c.4402a8"]]},{"id":"de738fc5.75e4c8","type":"change","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"live data","tot":"str"},{"t":"set","p":"channel_nbr","pt":"msg","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":820,"y":140,"wires":[["1f729ea.68a5a61"]]},{"id":"e94f888a.130a88","type":"range","z":"de69eea5.98a61","g":"846c946a.aae9b8","minin":"0","maxin":"1","minout":"0","maxout":"100","action":"scale","round":false,"property":"payload","name":"Scale power","x":515,"y":295,"wires":[["f70949c8.aab988"]]},{"id":"bef0a1f8.2e2cf","type":"inject","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"Clear chart on deploy","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"","topic":"","payload":"{\"data\":[]}","payloadType":"json","x":440,"y":363,"wires":[["9079ffaf.4a096"]]},{"id":"9079ffaf.4a096","type":"change","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"","rules":[{"t":"move","p":"payload.data","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":676,"y":363,"wires":[[]]},{"id":"f6889eca.85c47","type":"inject","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"Setpoint 80","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":"","topic":"setpoint","payload":"200","payloadType":"num","x":190,"y":340,"wires":[["e0cb2a8c.4402a8"]]},{"id":"c113aa4b.85b348","type":"inject","z":"de69eea5.98a61","g":"75a219a6.3e67b8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":190,"y":540,"wires":[["d0485aca.231e38"]]},{"id":"d0485aca.231e38","type":"memory","z":"de69eea5.98a61","g":"75a219a6.3e67b8","name":"","relativeValues":false,"unitType":"mb","totalMemory":false,"usedMemory":false,"freeMemory":true,"availableMemory":false,"activeMemory":false,"buffersMemory":false,"cachedMemory":false,"slabMemory":false,"buffcacheMemory":false,"freeAvailableMemory":false,"swapTotalMemory":false,"swapUsedMemory":false,"swapFreeMemory":false,"x":370,"y":540,"wires":[["78297ac2.918984"]]},{"id":"c35ca5a4.4b5ec8","type":"ui_text","z":"de69eea5.98a61","g":"75a219a6.3e67b8","group":"6aa20356.9b59bc","order":1,"width":0,"height":0,"name":"","label":"RAM","format":"{{msg.payload}} MB","layout":"row-spread","x":830,"y":540,"wires":[]},{"id":"e38e1f3a.72b78","type":"change","z":"de69eea5.98a61","g":"846c946a.aae9b8","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"live data","tot":"str"},{"t":"set","p":"channel_nbr","pt":"msg","to":"3","tot":"num"},{"t":"set","p":"payload","pt":"msg","to":"setpoint","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":820,"y":220,"wires":[["1f729ea.68a5a61"]]},{"id":"63945869.2a8a98","type":"ui_template","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","group":"6aa20356.9b59bc","name":"Load plotly.js","order":9,"width":0,"height":0,"format":"<script src=\"https://cdn.plot.ly/plotly-latest.min.js\"></script>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"global","x":1570,"y":160,"wires":[[]]},{"id":"e3203b44.f64818","type":"ui_template","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","group":"6aa20356.9b59bc","name":"div for plot","order":3,"width":"30","height":"25","format":"<div id=\"graph-div\" style=\"width:800px; height:800px;\"></div>\n\n","storeOutMessages":false,"fwdInMessages":false,"resendOnRefresh":false,"templateScope":"local","x":1770,"y":160,"wires":[[]]},{"id":"eb258cd7.3839a","type":"ui_template","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","group":"6aa20356.9b59bc","name":"streaming","order":5,"width":"0","height":"0","format":"<script>\n\n(function(scope){\n \n \nscope.$watch('msg', function(msg) {\n if(msg){\n try{\n //console.log(msg.topic + msg.payload );\n \n // load data from memory\n if(msg.topic == \"measurement data\"){\n \n \n //if(msg.payload[0].length > 0 ){\n console.log(\"load data from memory: \"+msg.channel_nbr);\n Plotly.addTraces('graph-div', {\n //type: \"scattergl\",\n mode: \"line\",\n x: msg.payload[0],\n y: msg.payload[1],\n name: \"CH\"+msg.channel_nbr\n }, msg.channel_nbr); // first trace is 0 \n //}\n \n \n \n \n }else if(msg.topic == \"live data\"){\n \n /* var minuteView = { // todo: delete\n xaxis: {\n type: 'date'\n }\n };*/\n //console.log(\"live data channel: \"+msg.channel_nbr);\n Plotly.extendTraces('graph-div', {\n x: [[msg.timestamp]],\n y: [[msg.payload]]\n }, \n \n [msg.channel_nbr]); // channel number, has to be an index!\n \n \n }else if(msg.topic == \"restyle\"){\n console.log(\"restyle: \"+msg.channel_nbr);\n \n Plotly.restyle('graph-div', msg.update, [msg.channel_nbr]);\n }\n \n }catch{\n \n }\n }\n \n \n //msg = undefined;\n\n \n});\n\n //scope = null; // prevent memory leak\n\n\n})(scope);\n\n\n</script>\n","storeOutMessages":false,"fwdInMessages":true,"resendOnRefresh":false,"templateScope":"local","x":1960,"y":400,"wires":[[]]},{"id":"b600f37c.5480b","type":"function","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"live data","func":"\n if(msg.topic === \"live data\" ){\n \n flow.set(\"live_data_counter\",flow.get(\"live_data_counter\")+1);\n \n // create and format timestamp\n msg.timestamp = new Date();\n datestring = msg.timestamp.getFullYear()+\"-\"+(msg.timestamp.getMonth()+1)+\"-\"+msg.timestamp.getDate();\n timestring = msg.timestamp.toLocaleTimeString('de-CH',\n { hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n \n }\n \n ); \n \n msg.timestamp = datestring+\" \"+timestring+\".\"+msg.timestamp.getMilliseconds().toString().padStart(3,\"0\"); // leading zeros probably working with newer node.js?\n \n \n let measurement_data = flow.get(\"measurement_data\",\"default\");\n \n // check if channel was initialized (channel_nbr equals index of array element)\n if(msg.channel_nbr > measurement_data.length-1){\n measurement_data.push([[],[]]);\n }\n \n // store current measurement in memory\n measurement_data[msg.channel_nbr][0].push(msg.timestamp);\n measurement_data[msg.channel_nbr][1].push(msg.payload);\n\n }\n \n if(msg.topic == \"live data switch\"){\n flow.set(\"live_data_switch\",flow.get(\"live_data_switch\")*-1);\n }\n \n \n // only send live data to front end if it's open\n if(flow.get(\"plot_init_done\") && flow.get(\"live_data_switch\") == 1){\n return msg;\n }\n \nreturn;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1620,"y":400,"wires":[["eb258cd7.3839a"]]},{"id":"c7eea535.cff998","type":"ui_template","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","group":"6aa20356.9b59bc","name":"Trigger: Tab with graph loaded","order":7,"width":0,"height":0,"format":"<script>\n\n//(function(scope) {\n \n // scope.$watch('msg', function(msg) {\n \n \n console.log(\"frontend init\");\n //console.log(scope);\n //let data = [ ];\n \n \n //let layout = {title: \"\", xaxis: {type: 'date'} };\n //let config = {displaylogo: false, displayModeBar: true, scrollZoom: true};\n \n Plotly.newPlot(\n 'graph-div', \n [], \n {title: \"\", xaxis: {type: 'date'} }, \n {displaylogo: false, displayModeBar: true, scrollZoom: true} \n );\n \n //scope.send({payload: \"preload done\"}); // this gets sent when the view is opened in the browser\n this.scope.send({payload: \"preload done\"});\n \n //scope = null; // prevent memory leak\n// });\n \n \n \n \n \n//})(scope);\n\n</script>","storeOutMessages":false,"fwdInMessages":false,"resendOnRefresh":false,"templateScope":"local","x":1170,"y":360,"wires":[["398431c6.2b15fe"]],"info":"This is triggered only in the selected tab (group), therefore no scope.$watch is needed\nscope.send(...) is needed, or else no message object is passed on to the next funciton node to load data for the graph"},{"id":"f4146d0b.fff29","type":"inject","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"},{"p":"tuning","v":"true","vt":"bool"}],"repeat":"","crontab":"","once":true,"onceDelay":"","topic":"","payload":"","payloadType":"date","x":1150,"y":160,"wires":[["f1a547a.b1f0ab8"]]},{"id":"f1a547a.b1f0ab8","type":"function","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"init","func":"nbr_of_channels = 4-1;\ntmp_array = [];\nfor(c = 0; c <= nbr_of_channels; c++){\n tmp_array.push([[],[]]);\n}\nflow.set(\"measurement_data\",tmp_array,\"default\");\n \nflow.set(\"plot_init_done\", false);\n \n// analysis\nflow.set(\"live_data_counter\", 0);\nflow.set(\"live_data_switch\", 1);\nflow.set(\"advanced_graph_on\",1);\n\nnode.warn(\"plotly init done\");\n\nreturn;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1310,"y":160,"wires":[[]]},{"id":"1c73b5cf.df6eba","type":"ui_ui_control","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"","events":"all","x":1120,"y":260,"wires":[["c5a45422.05fd78"]]},{"id":"885d2b36.e12938","type":"comment","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"detect browser interaction","info":"","x":1170,"y":220,"wires":[]},{"id":"f91e30da.68a9f","type":"comment","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"load plotly library and set div container","info":"","x":1650,"y":120,"wires":[]},{"id":"c5a45422.05fd78","type":"switch","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"lost","vt":"str"}],"checkall":"false","repair":false,"outputs":1,"x":1270,"y":260,"wires":[["fd090c29.e8dbe"]]},{"id":"fd090c29.e8dbe","type":"change","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"","rules":[{"t":"set","p":"plot_init_done","pt":"flow","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1500,"y":260,"wires":[[]]},{"id":"b9711f03.ff45a","type":"comment","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"init measurement data array","info":"","x":1180,"y":120,"wires":[]},{"id":"ab2c716f.05ff","type":"ui_button","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"","group":"6aa20356.9b59bc","order":1,"width":0,"height":0,"passthru":false,"label":"live data on/off","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":1120,"y":400,"wires":[["3afdf86a.6df9f8"]]},{"id":"3afdf86a.6df9f8","type":"change","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"live data switch","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1340,"y":400,"wires":[["b600f37c.5480b"]]},{"id":"ecb6e8fa.e19b48","type":"function","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"","func":"flow.set(\"advanced_graph_on\",flow.get(\"advanced_graph_on\")*-1,\"default\");\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1860,"y":220,"wires":[[]]},{"id":"51f79710.27e168","type":"inject","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"advanced graph on/off","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1620,"y":220,"wires":[["ecb6e8fa.e19b48"]]},{"id":"8ac1866f.768cc8","type":"split","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":1610,"y":360,"wires":[["6b75c3b0.f4e59c"]]},{"id":"398431c6.2b15fe","type":"change","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"","rules":[{"t":"set","p":"plot_init_done","pt":"flow","to":"true","tot":"bool"},{"t":"set","p":"payload","pt":"msg","to":"measurement_data","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":1440,"y":360,"wires":[["8ac1866f.768cc8"]]},{"id":"6b75c3b0.f4e59c","type":"change","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"measurement data","tot":"str"},{"t":"set","p":"channel_nbr","pt":"msg","to":"parts.index","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1780,"y":360,"wires":[["eb258cd7.3839a"]]},{"id":"1f729ea.68a5a61","type":"switch","z":"de69eea5.98a61","g":"22d8f7bd.d97cd8","name":"","property":"advanced_graph_on","propertyType":"flow","rules":[{"t":"eq","v":"1","vt":"num"}],"checkall":"true","repair":false,"outputs":1,"x":1090,"y":480,"wires":[["b600f37c.5480b"]]},{"id":"78297ac2.918984","type":"change","z":"de69eea5.98a61","g":"75a219a6.3e67b8","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"live data","tot":"str"},{"t":"set","p":"channel_nbr","pt":"msg","to":"2","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":580,"y":540,"wires":[["1f729ea.68a5a61","c35ca5a4.4b5ec8"]]},{"id":"6aa20356.9b59bc","type":"ui_group","name":"examples","tab":"d5ad8b85.f5ba18","order":1,"disp":false,"width":"30","collapse":false},{"id":"d5ad8b85.f5ba18","type":"ui_tab","name":"Advanced Charts","icon":"dashboard","disabled":false,"hidden":false}]