Cisco CUCM - Get trace files via DIME
Introduction
This flow demonstrates how to use Node-RED to interface with Cisco DIME API. Logs are served to user via API on dashboard.
[{"id":"60644299e58c7c53","type":"subflow","name":"Set Global Variables","info":"","category":"","in":[{"x":40,"y":80,"wires":[{"id":"f08e510bbf870d27"}]}],"out":[{"x":400,"y":80,"wires":[{"id":"f08e510bbf870d27","port":0}]}],"env":[],"meta":{},"color":"#DDAA99"},{"id":"f08e510bbf870d27","type":"change","z":"60644299e58c7c53","name":"Set Global Variables","rules":[{"t":"set","p":"hostname","pt":"global","to":"cucm01-pub.automate.builders","tot":"str"},{"t":"set","p":"username","pt":"global","to":"perfmon","tot":"str"},{"t":"set","p":"password","pt":"global","to":"perfmon","tot":"str"},{"t":"set","p":"version","pt":"global","to":"15.0","tot":"str"},{"t":"set","p":"ciscoAxlOpts","pt":"global","to":"{\"clean\":true,\"removeAttributes\":false,\"dataContainerIdentifierTails\":\"_data\"}","tot":"json"},{"t":"set","p":"debug","pt":"global","to":"false","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":220,"y":80,"wires":[[]]},{"id":"4eb4949a15cfbbf9","type":"tab","label":"DIME - Cisco CallManager","disabled":false,"info":"## SIP Dime\n\nFlow to retrieve Call Manager trace files from the last 5 mins.\n\nUsing 'cisco-dime' package from npmjs.org.","env":[]},{"id":"7c6992d416b14aba","type":"group","z":"4eb4949a15cfbbf9","name":"Set Global Variables Group","style":{"label":true},"nodes":["f253f674aff88e31","9550cf335c64e249","aba4703861d033ab","18bfa4d27be0ae70","7c63745af14ad8fe"],"x":74,"y":59,"w":1152,"h":122},{"id":"9c74ae078987380e","type":"group","z":"4eb4949a15cfbbf9","name":"List Service Logs","style":{"label":true},"nodes":["a6d622eed9041333","55e49a2e32acf307","1b9dc36afdd9b6ad","37f0ef8f8e5471fb"],"x":74,"y":199,"w":1152,"h":82},{"id":"32f116d55dd6b83e","type":"group","z":"4eb4949a15cfbbf9","name":"Get Cisco CallManager Trace Logs via DIME","style":{"label":true},"nodes":["9b94c2199017139f","3d987d7b96751924","4f0881a104210e17","dc33bbcf800047a4","806478d4c6289a35","9f2c3c490ae26c17","6b8144193e205309","e56d02a281362c0b","34c38aa083fdcb7a","8ee6c541bfcd54c8","6f70426c70471104","c649659c9e104909","dbe72dabbb5a3c85","e744139e9c9adac9","c76e4e7587208c76","a8304d42be98c8bb","bae760f4eb3f6697","85cfccf021959b5a","fa4118a442f5d769","56d72aea29089862","cb5b1b032726f2fe","2e38f2c0f4d578af","fe2965e777b22ea0","cbc65e70f6f22c35","08842f73199d1a07","5c93fd169c77e448","e0d260d162282aa7","9ead903e437af5da","71c85c1a7673a9ee","a068219cdee9f31f","6e9f408069debfc6","f2d56abe93564bdf","01f78aa8502cc28b","93c1b35827b830bf","78f423f8f9837e49","5d75eabeb9eb57bc","adb7e2e4a3b20ab3"],"x":74,"y":299,"w":1152,"h":942},{"id":"f253f674aff88e31","type":"inject","z":"4eb4949a15cfbbf9","g":"7c6992d416b14aba","name":"Set Variables","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"{\"variables\":\"set\",\"flow\":\"SIP DIME\"}","payloadType":"json","x":390,"y":140,"wires":[["9550cf335c64e249"]],"outputLabels":["Payload"],"info":"# Introduction\n\nWhere we set the initial payload. This will be the where results are stored as it flows thru nodes."},{"id":"9550cf335c64e249","type":"subflow:60644299e58c7c53","z":"4eb4949a15cfbbf9","g":"7c6992d416b14aba","name":"Set Global Variables","x":680,"y":140,"wires":[["aba4703861d033ab"]],"info":"## Edit\n\nEdit this subflow with your VOS creds."},{"id":"aba4703861d033ab","type":"debug","z":"4eb4949a15cfbbf9","g":"7c6992d416b14aba","name":"Debug payload","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1100,"y":140,"wires":[]},{"id":"a6d622eed9041333","type":"function","z":"4eb4949a15cfbbf9","g":"9c74ae078987380e","name":"listNodeServiceLogs","func":"try {\n var serviceLogsNames = await ciscoDime.listNodeServiceLogs(global.get(\"hostname\"), global.get(\"username\"), global.get(\"password\"));\n\n var newMsg;\n\n msg = {\n payload: serviceLogsNames\n };\n\n return msg;\n} catch (error) {\n let errMsg = null\n errMsg = JSON.stringify(error);\n throw new Error(errMsg)\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[{"var":"ciscoDime","module":"cisco-dime"}],"x":680,"y":240,"wires":[["37f0ef8f8e5471fb"]]},{"id":"55e49a2e32acf307","type":"inject","z":"4eb4949a15cfbbf9","g":"9c74ae078987380e","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{}","payloadType":"str","x":370,"y":240,"wires":[["a6d622eed9041333"]]},{"id":"1b9dc36afdd9b6ad","type":"comment","z":"4eb4949a15cfbbf9","g":"9c74ae078987380e","name":"Press here ->","info":"","x":170,"y":240,"wires":[]},{"id":"37f0ef8f8e5471fb","type":"debug","z":"4eb4949a15cfbbf9","g":"9c74ae078987380e","name":"Debug payload","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1100,"y":240,"wires":[]},{"id":"9b94c2199017139f","type":"catch","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Catch Error","scope":null,"uncaught":false,"x":370,"y":1200,"wires":[["3d987d7b96751924"]]},{"id":"3d987d7b96751924","type":"function","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Error Function","func":"\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":1200,"wires":[["4f0881a104210e17"]]},{"id":"4f0881a104210e17","type":"debug","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Debug error","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"error","targetType":"msg","statusVal":"","statusType":"auto","x":1110,"y":1200,"wires":[]},{"id":"dc33bbcf800047a4","type":"comment","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Error Handling","info":"","x":370,"y":1160,"wires":[]},{"id":"806478d4c6289a35","type":"inject","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Set Duration","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"duration\":180}","payloadType":"json","x":370,"y":360,"wires":[["5c93fd169c77e448"]],"outputLabels":["Payload"],"info":"We set the initial payload to {}. This will be the where results are stored as it flows thru nodes."},{"id":"9f2c3c490ae26c17","type":"function","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Get Operations Tags via AXL","func":"try {\n let service = new ciscoAxl(global.get(\"hostname\"), global.get(\"username\"), global.get(\"password\"), global.get(\"version\"));\n\n var newMsg;\n var operation = msg.payload.operation;\n var tags = await service.getOperationTags(operation);\n\n newMsg = {\n payload: tags,\n topic: operation,\n status: 'Get operations tags via AXL'\n };\n\n return newMsg;\n} catch (error) {\n let errMsg = null\n errMsg = JSON.stringify(error);\n throw new Error(errMsg)\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[{"var":"ciscoAxl","module":"cisco-axl"}],"x":880,"y":460,"wires":[["e56d02a281362c0b","93c1b35827b830bf"]]},{"id":"6b8144193e205309","type":"comment","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Get All Tags needed for operation: 'executeSQLQuery'","info":"This flow will get all the operations available via AXL on this CUCM cluster.\n\nResults returned in array, filtered by keyword.","x":1000,"y":400,"wires":[]},{"id":"e56d02a281362c0b","type":"function","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Return Results from 'executeSQLQuery' via AXL","func":"try {\n let service = new ciscoAxl(global.get(\"hostname\"), global.get(\"username\"), global.get(\"password\"), global.get(\"version\"));\n var newMsg;\n var operation = msg.topic;\n\n msg.payload.sql = \"select name from processnode WHERE name != 'EnterpriseWideData'\";\n\n var results = await service.executeOperation(operation, msg.payload, global.get(\"ciscoAxlOpts\"));\n\n newMsg = {\n payload: results,\n topic: operation,\n status: 'Return results from executeSQLQuery via AXL'\n };\n\n return newMsg;\n} catch (error) {\n let errMsg = null\n errMsg = JSON.stringify(error);\n throw new Error(errMsg)\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[{"var":"ciscoAxl","module":"cisco-axl"}],"x":340,"y":540,"wires":[["6f70426c70471104","f2d56abe93564bdf"]]},{"id":"34c38aa083fdcb7a","type":"comment","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Call 'executeSQLQuery' operation","info":"","x":380,"y":480,"wires":[]},{"id":"8ee6c541bfcd54c8","type":"comment","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Press here ->","info":"","x":170,"y":360,"wires":[]},{"id":"6f70426c70471104","type":"function","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"selectLogFiles via DIME","func":"// Vanilla JS DateTime\nlet duration = flow.get(\"duration\");\nlet date_ob = new Date();\nlet date_ob_past = new Date(date_ob);\ndate_ob_past.setMinutes(date_ob.getMinutes() - duration);\nlet currentCalendar = date_ob.toLocaleString().split(',')[0]\nlet currentTime = date_ob.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true })\nlet futureTime = date_ob_past.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true })\nlet currentDateTime = currentCalendar.concat(\" \", currentTime)\nlet pastDateTime = currentCalendar.concat(\" \", futureTime)\n\nvar serverArr = msg.payload.row;\nvar logArr = [];\nvar newMsg;\n\nfor (const server of serverArr) {\n try {\n let serviceLogsNames = await ciscoDime\n .selectLogFiles(\n server.name,\n global.get(\"username\"),\n global.get(\"password\"),\n \"Cisco CallManager\",\n pastDateTime, // From Date\n currentDateTime, // To Date\n \"Client: (GMT+0:0)Greenwich Mean Time-Europe/London\"\n )\n .catch((err) => {\n return err;\n });\n\n logArr.push(serviceLogsNames);\n } catch (error) {\n let errMsg = null\n errMsg = JSON.stringify(error);\n throw new Error(errMsg)\n }\n}\n\nvar flattened = [].concat.apply([],logArr); // Flatten results\n\nnewMsg ={\n payload: flattened,\n status: 'Collect selectLogFiles via DIME'\n}\n\n\nreturn newMsg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[{"var":"ciscoDime","module":"cisco-dime"}],"x":710,"y":540,"wires":[["c649659c9e104909","a068219cdee9f31f"]]},{"id":"c649659c9e104909","type":"function","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"getOneFile","func":"var resultsArr = msg.payload;\nvar newMsg;\n\n// Let's loop thru the servers and get the files\nvar promises = resultsArr.map(function (result) {\n return ciscoDime\n .getOneFile(\n result.server,\n global.get(\"username\"),\n global.get(\"password\"),\n result.absolutepath\n )\n .catch((err) => {\n let errMsg = null\n errMsg = JSON.stringify(err);\n throw new Error(errMsg)\n });\n})\n\nvar outArr = await Promise.all(promises).then(function (results) {\n return results\n})\n\nnewMsg = {\n payload: outArr,\n status: 'Get file(s) from server using getOneFile via DIME'\n}\n\nreturn newMsg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"ciscoDime","module":"cisco-dime"}],"x":270,"y":620,"wires":[["cb5b1b032726f2fe","01f78aa8502cc28b"]]},{"id":"dbe72dabbb5a3c85","type":"function","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Set base path","func":"//restrict to /data\nvar basePath = \"/data/\";\nvar filename = msg.req.params.fn;\n\n\nif(filename.includes(\"..\\\\\")){\n msg.payload = \"Illegal file path\";\n msg.statusCode = 405;//not allowed\n return [null, msg];//fire output 2\n} else if(filename.includes(\"../\")){\n msg.payload = \"Illegal file path\";\n msg.statusCode = 405;//not allowed\n return [null, msg];//fire output 2\n} \n//TODO: add more checks\n\nmsg.filename = basePath + filename;\nreturn [msg, null];//fire output 1\n\n\n","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":1000,"wires":[["c76e4e7587208c76"],["e744139e9c9adac9"]]},{"id":"e744139e9c9adac9","type":"http response","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"","statusCode":"","headers":{},"x":870,"y":1040,"wires":[]},{"id":"c76e4e7587208c76","type":"file in","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"","filename":"filename","filenameType":"msg","format":"","chunk":false,"sendError":false,"encoding":"none","allProps":false,"x":640,"y":980,"wires":[["e744139e9c9adac9"]]},{"id":"a8304d42be98c8bb","type":"catch","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"","scope":null,"uncaught":false,"x":200,"y":1080,"wires":[["bae760f4eb3f6697","85cfccf021959b5a"]]},{"id":"bae760f4eb3f6697","type":"function","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Set 404","func":"msg.payload = msg.error;\nmsg.statusCode = 404;//resource not found\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":640,"y":1080,"wires":[["e744139e9c9adac9"]]},{"id":"85cfccf021959b5a","type":"debug","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":230,"y":1120,"wires":[]},{"id":"fa4118a442f5d769","type":"comment","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Create http endpoint @ http://<node-red ip add>:<port>/files/data/xxx where xxx is the file name to download","info":"# Example\n\nhttp://localhost:1880/files/data/SDL001_100_000120.txt.gz","x":510,"y":940,"wires":[]},{"id":"56d72aea29089862","type":"http in","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"","url":"/files/data/:fn","method":"get","upload":false,"swaggerDoc":"","x":190,"y":1000,"wires":[["dbe72dabbb5a3c85"]]},{"id":"cb5b1b032726f2fe","type":"split","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Split Results","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":270,"y":700,"wires":[["fe2965e777b22ea0"]]},{"id":"2e38f2c0f4d578af","type":"file","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Create files","filename":"filename","filenameType":"msg","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":530,"y":780,"wires":[["cbc65e70f6f22c35"]]},{"id":"fe2965e777b22ea0","type":"function","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Format Create File Msg","func":"var newMsg;\n\n// Change output file name to whatever you'd like\nvar filename = msg.payload.filename.substring(\n msg.payload.filename.lastIndexOf(\"/\") + 1\n); // Let's get the file name from the full path\n\nvar parts = msg.parts;\nparts.filename = \"/data/\" + filename;\n\nnewMsg = {\n payload: msg.payload.data,\n filename: \"/data/\" + filename,\n parts: parts\n}\n\nreturn newMsg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":780,"wires":[["2e38f2c0f4d578af"]]},{"id":"cbc65e70f6f22c35","type":"join","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"","mode":"custom","build":"array","property":"filename","propertyType":"msg","key":"filename","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":270,"y":860,"wires":[["e0d260d162282aa7"]]},{"id":"08842f73199d1a07","type":"ui-form","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Get Duration","group":"84b7c5aaffe22fcd","label":"Enter duration in minutes to pull Cisco CallManager logs for:","order":0,"width":0,"height":0,"options":[{"label":"Duration","key":"duration","type":"number","required":true,"rows":null}],"formValue":{"duration":""},"payload":"","submit":"submit","cancel":"clear","resetOnSubmit":true,"topic":"topic","topicType":"msg","splitLayout":"","className":"","x":350,"y":420,"wires":[["5c93fd169c77e448"]]},{"id":"5c93fd169c77e448","type":"change","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Set Payload & Flow Variables","rules":[{"t":"set","p":"duration","pt":"flow","to":"payload.duration","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"{\"operation\":\"executeSQLQuery\"}","tot":"json"},{"t":"set","p":"status","pt":"msg","to":"Collecting data....","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":640,"y":380,"wires":[["9f2c3c490ae26c17","6e9f408069debfc6"]],"info":"# Introduction\n\nUse this node to set variables that are unique to this flow within a project. Variables can then be accessed in other nodes with the following:\n\n``\nflow.get(\"variable_name\");\n``"},{"id":"e0d260d162282aa7","type":"function","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Format for VUE template","func":"var newMsg;\nvar fileNames = msg.filename;\nvar output = []\n\nfor (const file of fileNames) {\n var filename = file.substring(\n file.lastIndexOf(\"/\") + 1\n );\n\n let json = {\n link: 'https://nodered.ubuntu.automate.builders/files' + file,\n title: filename\n }\n output.push(json);\n}\n\nnewMsg = {\n payload: output\n}\n\nreturn newMsg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"utils","module":"util"}],"x":490,"y":860,"wires":[["9ead903e437af5da"]]},{"id":"9ead903e437af5da","type":"ui-template","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","group":"84b7c5aaffe22fcd","dashboard":"20412f87db1b0cd7","page":"0a87b32a472e0d54","name":"DIME Links","order":0,"width":0,"height":0,"head":"","format":"<div>\n <v-sheet class=\"pa-md-4 mx-lg-auto\" :elevation=\"24\" border color=\"success\" rounded v-if=\"msg?.status\">{{ msg?.status }}</v-sheet>\n <div v-for=\"(url, index) in msg.payload\" :key=\"index\">\n <a v-if=\"url.link\" :href=\"url.link\" target=\"_blank\">{{ url.title }}</a>\n <span v-else>{{ url.title }}</span>\n </div>\n</div>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"","x":1090,"y":860,"wires":[[]]},{"id":"71c85c1a7673a9ee","type":"link in","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Status Messages In","links":["01f78aa8502cc28b","6e9f408069debfc6","a068219cdee9f31f","f2d56abe93564bdf","93c1b35827b830bf"],"x":725,"y":720,"wires":[["9ead903e437af5da","adb7e2e4a3b20ab3"]]},{"id":"a068219cdee9f31f","type":"link out","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Status Message Out","mode":"link","links":["71c85c1a7673a9ee"],"x":965,"y":540,"wires":[]},{"id":"6e9f408069debfc6","type":"link out","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Status Message Out","mode":"link","links":["71c85c1a7673a9ee"],"x":865,"y":340,"wires":[]},{"id":"f2d56abe93564bdf","type":"link out","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Status Message Out","mode":"link","links":["71c85c1a7673a9ee"],"x":645,"y":620,"wires":[]},{"id":"01f78aa8502cc28b","type":"link out","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Status Message Out","mode":"link","links":["71c85c1a7673a9ee"],"x":475,"y":620,"wires":[]},{"id":"93c1b35827b830bf","type":"link out","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Status Message Out","mode":"link","links":["71c85c1a7673a9ee"],"x":1105,"y":460,"wires":[]},{"id":"78f423f8f9837e49","type":"comment","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Get status messages to update dashboard","info":"","x":680,"y":680,"wires":[]},{"id":"18bfa4d27be0ae70","type":"comment","z":"4eb4949a15cfbbf9","g":"7c6992d416b14aba","name":"CHANGE ME.","info":"# Edit Subflow\n\nUpdate credentials to set global variables.","x":690,"y":100,"wires":[]},{"id":"5d75eabeb9eb57bc","type":"debug","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Debug payload","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1100,"y":800,"wires":[]},{"id":"adb7e2e4a3b20ab3","type":"switch","z":"4eb4949a15cfbbf9","g":"32f116d55dd6b83e","name":"Debug Variable Check","property":"debug","propertyType":"global","rules":[{"t":"eq","v":"true","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":940,"y":720,"wires":[["5d75eabeb9eb57bc"]]},{"id":"7c63745af14ad8fe","type":"comment","z":"4eb4949a15cfbbf9","g":"7c6992d416b14aba","name":"Set to Auto Run ->","info":"First node will initalize flow.\n\nMake sure your AXL settings are correct in the 'Set Global Variables' node.\n\nThis will auto run every time you \"Deploy\" the flow.","x":190,"y":140,"wires":[]},{"id":"84b7c5aaffe22fcd","type":"ui-group","name":"SIP DIME","page":"e1de64c15eccdf16","width":"6","height":"1","order":-1,"disp":true},{"id":"20412f87db1b0cd7","type":"ui-base","name":"Dashboard","path":"/dashboard"},{"id":"0a87b32a472e0d54","type":"ui-page","name":"AXL Dashboard","ui":"20412f87db1b0cd7","path":"/axl","layout":"grid","theme":"e0714ab1e4e245cf","order":-1},{"id":"e1de64c15eccdf16","type":"ui-page","name":"DIME Dashboard","ui":"20412f87db1b0cd7","path":"/dime","layout":"grid","theme":"e0714ab1e4e245cf","order":-1},{"id":"e0714ab1e4e245cf","type":"ui-theme","name":"Normal","colors":{"surface":"#ffffff","primary":"#0094ce","bgPage":"#eeeeee","groupBg":"#ffffff","groupOutline":"#cccccc"}}]