Server-Rack Monitor

I was prompted to try to find this old project, I created a few years ago, when someone on the forum asked about placing led-icons on an image on the dashboard. It took a while to find the Node-RED flow and remember "what-on-earth-did-I do-to-create-that".

So the situation is I have a server rack of four Raspberry Pi(es) that report their core temperatures to a central flow that uses the SVG node to show a background photo overlaid with "led style" icons.


Here's what my dashboard looks like...

As you can see I have four Raspberry Pi(es) reporting the core temperature of their CPUs.
This is the small flow that needs to go in each RPi to get 'hostname', 'ip-address' and 'core-temperature'.


Here's the Node-RED flow.

[{"id":"99d4c0e1.eee498","type":"tab","label":"CPU_monitor","disabled":false,"info":""},{"id":"924bc78b.c20908","type":"inject","z":"99d4c0e1.eee498","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":130,"y":140,"wires":[["a2eea626.f1e0f","710a3afc.f71904"]]},{"id":"553be582.1c7494","type":"mqtt out","z":"99d4c0e1.eee498","name":"Publish to RPI_156 server","topic":"","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"5c6cd83f.1ecc6","x":840,"y":340,"wires":[]},{"id":"f533e424.ca28e8","type":"debug","z":"99d4c0e1.eee498","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":770,"y":400,"wires":[]},{"id":"a2eea626.f1e0f","type":"exec","z":"99d4c0e1.eee498","command":"hostname","addpay":false,"append":"","useSpawn":"","timer":"","name":"Get hostname","x":300,"y":140,"wires":[["e19032d8.86765"],[],[]]},{"id":"e19032d8.86765","type":"function","z":"99d4c0e1.eee498","name":"Store hostname","func":"msg.payload = msg.payload.replace(/(\\r\\n|\\n|\\r)/gm,\"\");\nflow.set('hostname',msg.payload);\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":120,"wires":[["9eb34d835a31568b"]]},{"id":"7421f1d7.fc604","type":"exec","z":"99d4c0e1.eee498","command":"vcgencmd","addpay":false,"append":"measure_temp","useSpawn":"false","timer":"","oldrc":false,"name":"Get CPU temperature","x":360,"y":360,"wires":[["ecdda20c.2a51e"],[],[]]},{"id":"ecdda20c.2a51e","type":"function","z":"99d4c0e1.eee498","name":"Create JS object","func":"var temp = msg.payload.replace(/(\\r\\n|\\n|\\r)/gm,\"\");\ntemp = temp.split(\"=\");\ntemp = temp[1];\ntemp = temp.split(\"'\");\ntemp = temp[0];\n\ndelete msg.rc;\n\nvar ip_address = flow.get('ip_address');\nvar hostname = flow.get('hostname');\nmsg.topic=\"pitemp/\"+hostname;\nmsg.payload ={'hostname':hostname,'ip_address':ip_address,'temperature':temp};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":340,"wires":[["f533e424.ca28e8","553be582.1c7494"]]},{"id":"710a3afc.f71904","type":"exec","z":"99d4c0e1.eee498","command":"hostname","addpay":false,"append":"-I","useSpawn":"","timer":"","name":"Get IP address","x":300,"y":200,"wires":[["d612c406.6a2ae"],[],[]]},{"id":"d612c406.6a2ae","type":"function","z":"99d4c0e1.eee498","name":"Store IP address","func":"// var ip_address = msg.payload.replace(/(\\s+\\r\\n|\\n|\\r)/gm,\"\");\n// ip_address = ip_address.trim();\n\nvar ip_address=msg.payload.split(\" \");\nip_address = ip_address[0];\nip_address = ip_address.trim();\nflow.set('ip_address',ip_address);\n\nreturn msg;","outputs":1,"noerr":0,"x":510,"y":180,"wires":[["640406e8899e7044"]]},{"id":"41ddcbd4.00ad4c","type":"inject","z":"99d4c0e1.eee498","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"60","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":360,"wires":[["7421f1d7.fc604"]]},{"id":"9eb34d835a31568b","type":"debug","z":"99d4c0e1.eee498","name":"debug 3388","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":710,"y":120,"wires":[]},{"id":"640406e8899e7044","type":"debug","z":"99d4c0e1.eee498","name":"debug 3389","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":710,"y":180,"wires":[]},{"id":"da2cbabcdce2ad35","type":"comment","z":"99d4c0e1.eee498","name":" Find out hostname and IP address","info":"","x":200,"y":80,"wires":[]},{"id":"0da684ac9434c513","type":"comment","z":"99d4c0e1.eee498","name":"Report temperature, hostname and IP every 60 secstname and IP address","info":"","x":320,"y":300,"wires":[]},{"id":"5c6cd83f.1ecc6","type":"mqtt-broker","name":"RPi_156 server","broker":"192.168.1.156","port":"1883","clientid":"","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}]

The main Node-RED flow to process and display the results looks like this...

Here's the code...

[{"id":"b6e3ce214e2a9f5a","type":"tab","label":"Monitor_Server_Rack","disabled":false,"info":"","env":[]},{"id":"9781071c.3143c8","type":"debug","z":"b6e3ce214e2a9f5a","name":"Floorplan output","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1070,"y":240,"wires":[]},{"id":"c81729b4.921cb","type":"ui_svg_graphics","z":"b6e3ce214e2a9f5a","group":"351ece72.3b27c2","order":1,"width":"6","height":"8","svgString":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"none\" x=\"0\" y=\"0\" viewBox=\"0 0 300 400\" width=\"100%\" height=\"100%\">\n  <image id=\"svgEditorBackgroundImage\" x=\"0\" y=\"0\" width=\"800\" height=\"600\" xlink:href=\"ui_svg_graphics/image/2399b014.7c6ad/acme_logon_screen.png\" />\n  <rect id=\"svgEditorBackground\" x=\"0\" y=\"0\" width=\"600\" height=\"900\" style=\"fill:none;stroke:none;\" />\n  <defs>\n    <g id=\"led\">\n      <filter id=\"ledBlur\">\n        <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"6\" />\n      </filter>\n      <circle cx=\"0\" cy=\"0\" r=\"16\" fill=\"var(--ledColor)\" filter=\"url(#ledBlur)\" />\n      <circle cx=\"0\" cy=\"0\" r=\"10\" fill=\"var(--ledColor)\" display=\"block\" />\n    </g>\n  </defs>\n  <image width=\"300\" height=\"400\" id=\"background\" xlink:href=\"https://www.resources-area.co.uk/pics_of_places/mini_tower.jpg\" x=\"0\" y=\"0\" />\n  \n  <use id=\"led_1\" xlink:href=\"#led\" href=\"#led\" x=\"175\" y= \"96\" style=\"--ledColor:red;\" />\n  <use id=\"led_2\" xlink:href=\"#led\" href=\"#led\" x=\"175\" y=\"176\" style=\"--ledColor:red;\" />\n  <use id=\"led_3\" xlink:href=\"#led\" href=\"#led\" x=\"175\" y=\"248\" style=\"--ledColor:red;\" />\n  <use id=\"led_4\" xlink:href=\"#led\" href=\"#led\" x=\"175\" y=\"312\" style=\"--ledColor:red;\" />\n \n  <text id=\"temp_1\" x=\"200\" y=\"102\" fill=\"white\" stroke=\"black\" font-size=\"18\" text-anchor=\"left\" font-weight=\"bold\" alignment-baseline=\"middle\" stroke-width=\"1px\">Temp: 21.5</text>\n  <text id=\"temp_2\" x=\"200\" y=\"182\" fill=\"white\" stroke=\"black\" font-size=\"18\" text-anchor=\"left\" font-weight=\"bold\" alignment-baseline=\"middle\" stroke-width=\"1px\">Temp: 21.5</text>\n  <text id=\"temp_3\" x=\"200\" y=\"256\" fill=\"white\" stroke=\"black\" font-size=\"18\" text-anchor=\"left\" font-weight=\"bold\" alignment-baseline=\"middle\" stroke-width=\"1px\">Temp: 21.5</text>\n  <text id=\"temp_4\" x=\"200\" y=\"318\" fill=\"white\" stroke=\"black\" font-size=\"18\" text-anchor=\"left\" font-weight=\"bold\" alignment-baseline=\"middle\" stroke-width=\"1px\">Temp: 21.5</text>\n\n  <text id=\"ip_1\" x=\"10\" y=\"102\" fill=\"white\" stroke=\"black\" font-size=\"18\" text-anchor=\"left\" font-weight=\"bold\" alignment-baseline=\"middle\" stroke-width=\"1px\">IP: 192.168.1.158</text>\n  <text id=\"ip_2\" x=\"10\" y=\"182\" fill=\"white\" stroke=\"black\" font-size=\"18\" text-anchor=\"left\" font-weight=\"bold\" alignment-baseline=\"middle\" stroke-width=\"1px\">IP: 192.168.1.156</text>\n  <text id=\"ip_3\" x=\"10\" y=\"256\" fill=\"white\" stroke=\"black\" font-size=\"18\" text-anchor=\"left\" font-weight=\"bold\" alignment-baseline=\"middle\" stroke-width=\"1px\">IP: 192.168.1.154</text>\n  <text id=\"ip_4\" x=\"10\" y=\"318\" fill=\"white\" stroke=\"black\" font-size=\"18\" text-anchor=\"left\" font-weight=\"bold\" alignment-baseline=\"middle\" stroke-width=\"1px\">IP: 192.168.1.152</text>\n\n</svg>\n","clickableShapes":[{"targetId":"#led_1","action":"click","payload":"RPI_158","payloadType":"str","topic":"#led_1"},{"targetId":"#led_2","action":"click","payload":"RPI_156","payloadType":"str","topic":"#led_2"},{"targetId":"#led_3","action":"click","payload":"RPI_154","payloadType":"str","topic":"#led_3"},{"targetId":"#led_4","action":"click","payload":"RPI_152","payloadType":"str","topic":"#led_4"}],"javascriptHandlers":[],"smilAnimations":[],"bindings":[{"selector":"#banner","bindSource":"payload.title","bindType":"text","attribute":""},{"selector":"#led_one","bindSource":"payload.position.x","bindType":"attr","attribute":"x"},{"selector":"#led_one","bindSource":"payload.camera.colour","bindType":"attr","attribute":"fill"}],"showCoordinates":true,"autoFormatAfterEdit":true,"showBrowserErrors":false,"showBrowserEvents":false,"enableJsDebugging":false,"sendMsgWhenLoaded":false,"noClickWhenDblClick":false,"outputField":"","editorUrl":"//drawsvg.org/drawsvg.html","directory":"","panning":"disabled","zooming":"disabled","panOnlyWhenZoomed":false,"doubleClickZoomEnabled":false,"mouseWheelZoomEnabled":false,"dblClickZoomPercentage":"150","cssString":"div.ui-svg svg{\n    color: var(--nr-dashboard-widgetColor);\n    fill: currentColor !important;\n}\ndiv.ui-svg path {\n    fill: inherit;\n}","name":"","x":840,"y":300,"wires":[["9781071c.3143c8","44298b84.29261c"]]},{"id":"67a66fba.6dbb2","type":"ui_chart","z":"b6e3ce214e2a9f5a","name":"","group":"9dca326c.f6eb1","order":1,"width":"14","height":"8","label":"Last report was from: {{msg.topic}}","chartType":"line","legend":"true","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"x":810,"y":240,"wires":[[]]},{"id":"990ef637.21b658","type":"mqtt in","z":"b6e3ce214e2a9f5a","name":"","topic":"pitemp/#","qos":"2","datatype":"auto-detect","broker":"4d205d20.69c8ac","nl":false,"rap":false,"inputs":0,"x":120,"y":240,"wires":[["3dec799e.c6c926","d8f54178.033cb"]]},{"id":"fc80149d.b7565","type":"debug","z":"b6e3ce214e2a9f5a","name":"Debug_AA","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":510,"y":200,"wires":[]},{"id":"3dec799e.c6c926","type":"function","z":"b6e3ce214e2a9f5a","name":"","func":"// let temperature = msg.payload.split('=')[1].split(\"'\")[0];\nvar temperature = msg.payload.temperature;\nlet topic = msg.topic.split('/')[1];\nmsg.topic = topic;\n\nswitch (msg.topic) {\n    case \"dev-super-server\":\n    case \"raspberrypi\":\n    case \"vpn-super-server\":\n    case \"fun-super-server\":\n        temperature = parseFloat(temperature);\n        msg.temperature = temperature\n        msg.payload = temperature;\n        return msg;\n    default :\n}\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":300,"y":240,"wires":[["fc80149d.b7565","e4707eaf.4013c","846e3e1a.96d91"]]},{"id":"24d8ddde.af5b1a","type":"inject","z":"b6e3ce214e2a9f5a","name":"Clear the chart","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":100,"wires":[["a39ccdc9.c5839"]]},{"id":"a39ccdc9.c5839","type":"function","z":"b6e3ce214e2a9f5a","name":"Clear the chart","func":"msg.payload = [];\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":520,"y":100,"wires":[["67a66fba.6dbb2"]]},{"id":"846e3e1a.96d91","type":"smooth","z":"b6e3ce214e2a9f5a","name":"","property":"payload","action":"mean","count":"10","round":"1","mult":"multi","reduce":false,"x":500,"y":240,"wires":[["67a66fba.6dbb2"]]},{"id":"7e4ec46d.c63c24","type":"debug","z":"b6e3ce214e2a9f5a","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":810,"y":360,"wires":[]},{"id":"e4707eaf.4013c","type":"function","z":"b6e3ce214e2a9f5a","name":"Store values and send to SVG","func":"// msg coming in is msg.topic, msg.temperature\n\nif (msg.temperature < 30.0){\n    msg.color = 'blue';\n}\nelse if (msg.temperature < 40.0) {\n    msg.color = \"green\";\n}\nelse if (msg.temperature < 50.0) {\n    msg.color = \"brown\";\n}\nelse {\n    msg.color = \"red\";\n}\n\nvar content = \"Temp: \" + msg.temperature.toString();\n\nif (msg.topic == \"dev-super-server\") {\n    flow.set('led_1_color',msg.color);\n    delete msg.topic;\n    msg.payload = ({'command':\"update_style\", 'selector':\"#led_1\",'attributeName':\"--ledColor\",\"attributeValue\":msg.color})\n    node.send (msg);\n    \n    flow.set('temp_1_temp',content);\n    msg.payload = ({'command':\"update_text\",  'selector':\"#temp_1\",'textContent':content});\n    node.send(msg);\n}\nelse if (msg.topic == \"raspberrypi\") {\n    flow.set('led_2_color',msg.color);\n    delete msg.topic;\n    msg.payload = ({'command':\"update_style\", 'selector':\"#led_2\",'attributeName':\"--ledColor\",\"attributeValue\":msg.color})\n    node.send (msg);\n    \n    flow.set('temp_2_temp',content);\n    msg.payload = ({'command':\"update_text\",  'selector':\"#temp_2\",'textContent':content});\n    node.send(msg);\n}\nelse if (msg.topic == \"vpn-super-server\") {\n    flow.set('led_3_color',msg.color);\n    delete msg.topic;\n    msg.payload = ({'command':\"update_style\", 'selector':\"#led_3\",'attributeName':\"--ledColor\",\"attributeValue\":msg.color})\n    node.send (msg);\n    \n    flow.set('temp_3_temp',content);\n    msg.payload = ({'command':\"update_text\",  'selector':\"#temp_3\",'textContent':content});\n    node.send(msg);\n}\nelse if (msg.topic == \"fun-super-server\") {\n    flow.set('led_4_color',msg.color);\n    delete msg.topic;\n    msg.payload = ({'command':\"update_style\", 'selector':\"#led_4\",'attributeName':\"--ledColor\",\"attributeValue\":msg.color})\n    node.send (msg);\n    \n    flow.set('temp_4_temp',content);\n    msg.payload = ({'command':\"update_text\",  'selector':\"#temp_4\",'textContent':content});\n    node.send(msg);\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":300,"wires":[["c81729b4.921cb","7e4ec46d.c63c24"]]},{"id":"44298b84.29261c","type":"ui_ui_control","z":"b6e3ce214e2a9f5a","name":"","events":"all","x":1040,"y":300,"wires":[[]]},{"id":"e25fac46.50c508","type":"ui_ui_control","z":"b6e3ce214e2a9f5a","name":"","events":"all","x":120,"y":400,"wires":[["2af6e8a5.c47478"]]},{"id":"2af6e8a5.c47478","type":"function","z":"b6e3ce214e2a9f5a","name":"Read variables and send to SVG","func":"var content; \n\nmsg.color =flow.get('led_1_color') || \"grey\";\nmsg.payload = ({'command':\"update_style\", 'selector':\"#led_1\",'attributeName':\"--ledColor\",\"attributeValue\":msg.color})\nnode.send (msg);\n    \ncontent = flow.get('temp_1_temp')||0.0;\nmsg.payload = ({'command':\"update_text\",  'selector':\"#temp_1\",'textContent':content});\nnode.send(msg);\n\n\nmsg.color = flow.get('led_2_color') || \"grey\";\nmsg.payload = ({'command':\"update_style\", 'selector':\"#led_2\",'attributeName':\"--ledColor\",\"attributeValue\":msg.color})\nnode.send (msg);\n    \ncontent = flow.get('temp_2_temp') || 0.0;\nmsg.payload = ({'command':\"update_text\",  'selector':\"#temp_2\",'textContent':content});\nnode.send(msg);\n\n\nmsg.color = flow.get('led_3_color') || \"grey\";\nmsg.payload = ({'command':\"update_style\", 'selector':\"#led_3\",'attributeName':\"--ledColor\",\"attributeValue\":msg.color})\nnode.send (msg);\n    \ncontent = flow.get('temp_3_temp') || 0.0;\nmsg.payload = ({'command':\"update_text\",  'selector':\"#temp_3\",'textContent':content});\nnode.send(msg);\n\n\nmsg.color = flow.get('led_4_color') || \"grey\";\nmsg.payload = ({'command':\"update_style\", 'selector':\"#led_4\",'attributeName':\"--ledColor\",\"attributeValue\":msg.color})\nnode.send (msg);\n    \ncontent = flow.get('temp_4_temp') || 0.0;\nmsg.payload = ({'command':\"update_text\",  'selector':\"#temp_4\",'textContent':content});\nnode.send(msg);","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":400,"wires":[["c81729b4.921cb"]]},{"id":"c67be195.8c2ed8","type":"comment","z":"b6e3ce214e2a9f5a","name":"This section is triggered when you return to this page/tab","info":"","x":270,"y":360,"wires":[]},{"id":"d8f54178.033cb","type":"debug","z":"b6e3ce214e2a9f5a","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":310,"y":180,"wires":[]},{"id":"33d2b8c4.d8b238","type":"ui_svg_graphics","z":"b6e3ce214e2a9f5a","group":"95c5d2ef.84601","order":0,"width":"15","height":"15","svgString":"<svg preserveAspectRatio=\"none\" x=\"0\" y=\"0\" viewBox=\"0 0 900 710\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n    <text id=\"my_text\" x=\"100\" y=\"30\" fill=\"blue\" font-size=\"25\" text-anchor=\"middle\" alignment-baseline=\"middle\" font-weight=\"bold\">10°C</text>\n    <text id=\"my_icon\" x=\"160\" y=\"50\" font-family=\"FontAwesome\" fill=\"blue\" font-size=\"80\" text-anchor=\"middle\" alignment-baseline=\"middle\" stroke-width=\"1\">fa-thermometer-empty</text>\n</svg>","clickableShapes":[],"javascriptHandlers":[],"smilAnimations":[],"bindings":[],"showCoordinates":true,"autoFormatAfterEdit":false,"showBrowserErrors":false,"showBrowserEvents":false,"enableJsDebugging":false,"sendMsgWhenLoaded":false,"noClickWhenDblClick":false,"outputField":"anotherField","editorUrl":"","directory":"","panning":"disabled","zooming":"disabled","panOnlyWhenZoomed":false,"doubleClickZoomEnabled":false,"mouseWheelZoomEnabled":false,"dblClickZoomPercentage":"150","cssString":"div.ui-svg svg{\n    color: var(--nr-dashboard-widgetColor);\n    fill: currentColor !important;\n}\ndiv.ui-svg path {\n    fill: inherit;\n}","name":"Thermometer","x":860,"y":580,"wires":[[]]},{"id":"f5cea410.d11948","type":"function","z":"b6e3ce214e2a9f5a","name":"Color interpolation","func":"const color1 = [0, 0, 255]; // blude\nconst color2 = [255, 0, 0]; // red\n\nvar temperature = msg.payload;\nvar factor = msg.payload / 100;\n\nvar red   = Math.round(color1[0] + factor * (color2[0] - color1[0]));\nvar green = Math.round(color1[1] + factor * (color2[1] - color1[1]));\nvar blue  = Math.round(color1[2] + factor * (color2[2] - color1[2]));\n\nvar interpolatedColor = \"rgb(\" + red + \",\" + green + \",\" + blue + \")\"; \n\nmsg.payload = [{\n    \"command\": \"update_text\",\n    \"selector\": \"#my_text\",\n    \"textContent\": temperature + \"°C\"\n},{\n    \"command\": \"update_attribute\",\n    \"selector\": \"#my_text\",\n    \"attributeName\": \"fill\",\n    \"attributeValue\": interpolatedColor\n},{\n    \"command\": \"update_attribute\",\n    \"selector\": \"#my_icon\",\n    \"attributeName\": \"fill\",\n    \"attributeValue\": interpolatedColor\n}]\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":580,"wires":[["33d2b8c4.d8b238"]]},{"id":"a90255d4.4ac008","type":"ui_slider","z":"b6e3ce214e2a9f5a","name":"","label":"Temperature","tooltip":"","group":"95c5d2ef.84601","order":3,"width":"6","height":"1","passthru":true,"outs":"all","topic":"","topicType":"str","min":0,"max":"100","step":1,"className":"","x":150,"y":580,"wires":[["f5cea410.d11948"]]},{"id":"351ece72.3b27c2","type":"ui_group","name":"Mini Tower - current status","tab":"a8c4b70.2a663c8","order":2,"disp":true,"width":"6","collapse":false},{"id":"9dca326c.f6eb1","type":"ui_group","name":"Temp v Time","tab":"a8c4b70.2a663c8","order":1,"disp":true,"width":"14","collapse":false},{"id":"4d205d20.69c8ac","type":"mqtt-broker","name":"RPi_156_server","broker":"192.168.1.156","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"95c5d2ef.84601","type":"ui_group","name":"Home Floor Plan","tab":"c411008f.d8abc","order":1,"disp":true,"width":"15","collapse":false},{"id":"a8c4b70.2a663c8","type":"ui_tab","name":"CPU monitoring","icon":"dashboard","order":2,"disabled":false,"hidden":false},{"id":"c411008f.d8abc","type":"ui_tab","name":"Home Floor Plan","icon":"dashboard","disabled":false,"hidden":false}]

I hope someone finds this useful.

7 Likes

I have zero use for this but wish I did...

Neat :grinning: