-
Notifications
You must be signed in to change notification settings - Fork 1
/
Discovery_Communication_Flow.json
1 lines (1 loc) · 45.4 KB
/
Discovery_Communication_Flow.json
1
[{"id":"272e932f.b3772c","type":"tab","label":"Discovery + Communication Integrated","disabled":false,"info":""},{"id":"7d1fbb16.03e9d4","type":"inject","z":"272e932f.b3772c","name":"Trigger Auto Discovery","topic":"","payload":"{\"to\":\"node1\",\"from\":\"trigger\",\"data\":{\"action\":\"start_discovery\"}}","payloadType":"json","repeat":"2","crontab":"","once":true,"onceDelay":0.1,"x":530,"y":100,"wires":[["ef79e6b7.1fee38","ee604341.fd865","2d2e2a0d.7c84e6","a0badebf.3a779","80561831.c99798","84759d49.71388"]]},{"id":"ef79e6b7.1fee38","type":"function","z":"272e932f.b3772c","name":"Node 1","func":"context.set('id', 'node1');\nlet eResId = 'eRes' + context.get('id');\nflow.set(eResId, flow.get(eResId)*0.9999 );\n\nfunction getInitDiscoveryPayload() {\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'INIT_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\n\nfunction getInitDiscoveryACKPayload(to) {\n return {\n from: context.get('id'),\n to: to,\n data: {\n type: 'ACK_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\n\nfunction updateNeighborTable(payload) {\n var neighborTable = flow.get(context.get('id')) || {};\n neighborTable[payload.from] = {\n eRes: payload.data.eRes,\n sinkHops: payload.data.sinkHops\n };\n\n flow.set(context.get('id'), neighborTable);\n}\n\nfunction updateCurrentMinHop(newHops){\n var currentHop = context.get('sinkHops');\n var isUpdated = false;\n if(currentHop === -1){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }else if(newHops < currentHop){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }\n return isUpdated;\n}\n\nfunction getUpdateDistancePayload(){\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'UPDATE_DISTANCE',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\nfunction calculateCost(eRes,sinkHop) {\n let cost = (0.5*(100-eRes)/100) + (0.5*sinkHop/10);\n return cost;\n};\n\nfunction getNextHopId(){\n var neighborTable = flow.get(context.get('id'));\n\n var sortedNeighbors = Object.entries(neighborTable).sort((object1, object2) => calculateCost(object1[1].eRes , object1[1].sinkHops) - calculateCost(object2[1].eRes , object2[1].sinkHops))\n\n\n return sortedNeighbors[0][0];\n}\n\nfunction getForwardPayload(payload){\n return {\n from: payload.from,\n dest: payload.dest,\n to: getNextHopId(),\n path: payload.path.concat(context.get('id')),\n data: payload.data\n }\n}\n\n\nfunction computeCostAndDrainBattery() {\n flow.set(eResId, flow.get(eResId)*0.9999 );\n}\n\nfunction getDataPayload(){\n return {\n from: context.get('id'),\n dest: 'sink',\n to: getNextHopId(),\n path: [context.get('id')],\n data: {\n type: \"FORWARD_PAYLOAD\",\n value: msg.payload.data.value\n }\n }\n}\n\nvar payload = {};\n\nif (msg.payload.from === context.get('id')) {\n payload = {};\n} else if (msg.payload.data.action === 'start_discovery') {\n payload = getInitDiscoveryPayload();\n context.set('sinkHops', -1);\n} else if (msg.payload.data.type === 'INIT_DISCOVERY' && msg.payload.from !== context.get('id')) {\n updateNeighborTable(msg.payload)\n payload = getInitDiscoveryACKPayload(msg.payload.from);\n} else if (msg.payload.data.type === 'ACK_DISCOVERY') {\n updateNeighborTable(msg.payload);\n\n if(msg.payload.data.isSink){\n var isUpdated = updateCurrentMinHop(1);\n if(isUpdated){\n payload = getUpdateDistancePayload();\n }\n }\n} else if(msg.payload.data.type === 'UPDATE_DISTANCE'){\n updateNeighborTable(msg.payload);\n var isUpdated = updateCurrentMinHop(msg.payload.data.sinkHops + 1);\n if (isUpdated){\n payload = getUpdateDistancePayload();\n }\n}\nelse if(msg.payload.data.type === 'FORWARD_PAYLOAD'){\n payload = getForwardPayload(msg.payload);\n computeCostAndDrainBattery();\n\n}\nelse if(msg.payload.data.type === 'ACTION_GENERATE_PAYLOAD'){\n payload = getDataPayload();\n}\n\nreturn {\n payload\n};","outputs":1,"noerr":0,"x":920,"y":200,"wires":[["8b8f3234.46be","9c3e316b.4c78b"]]},{"id":"8b8f3234.46be","type":"mqtt out","z":"272e932f.b3772c","name":"Channel1 Out","topic":"channel1","qos":"","retain":"","broker":"71b2d5b1.d94dbc","x":1480,"y":260,"wires":[]},{"id":"c51aa544.136c88","type":"mqtt in","z":"272e932f.b3772c","name":"Channel1 In","topic":"channel1","qos":"2","datatype":"auto","broker":"71b2d5b1.d94dbc","x":130,"y":240,"wires":[["973c8bb9.c16aa8","68ebb3d0.7bce6c"]]},{"id":"ee604341.fd865","type":"function","z":"272e932f.b3772c","name":"Node 2","func":"context.set('id', 'node2');\nlet eResId = 'eRes' + context.get('id');\nflow.set(eResId, flow.get(eResId)*0.9999 );\n\nfunction getInitDiscoveryPayload() {\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'INIT_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\n\nfunction getInitDiscoveryACKPayload(to) {\n return {\n from: context.get('id'),\n to: to,\n data: {\n type: 'ACK_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\n\nfunction updateNeighborTable(payload) {\n var neighborTable = flow.get(context.get('id')) || {};\n neighborTable[payload.from] = {\n eRes: payload.data.eRes,\n sinkHops: payload.data.sinkHops\n };\n\n flow.set(context.get('id'), neighborTable);\n}\n\nfunction updateCurrentMinHop(newHops){\n var currentHop = context.get('sinkHops');\n var isUpdated = false;\n if(currentHop === -1){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }else if(newHops < currentHop){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }\n return isUpdated;\n}\n\nfunction getUpdateDistancePayload(){\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'UPDATE_DISTANCE',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\nfunction calculateCost(eRes,sinkHop) {\n let cost = (0.5*(100-eRes)/100) + (0.5*sinkHop/10);\n return cost;\n};\n\nfunction getNextHopId(){\n var neighborTable = flow.get(context.get('id'));\n\n var sortedNeighbors = Object.entries(neighborTable).sort((object1, object2) => calculateCost(object1[1].eRes , object1[1].sinkHops) - calculateCost(object2[1].eRes , object2[1].sinkHops))\n\n\n return sortedNeighbors[0][0];\n}\n\nfunction getForwardPayload(payload){\n return {\n from: payload.from,\n dest: payload.dest,\n to: getNextHopId(),\n path: payload.path.concat(context.get('id')),\n data: payload.data.value\n }\n}\n\n\nfunction computeCostAndDrainBattery() {\n flow.set(eResId, flow.get(eResId)*0.9999 );\n}\n\nfunction getDataPayload(){\n return {\n from: context.get('id'),\n dest: 'sink',\n to: getNextHopId(),\n path: [context.get('id')],\n data: {\n type: \"FORWARD_PAYLOAD\",\n value: msg.payload.data.value\n }\n }\n}\n\nvar payload = {};\n\nif (msg.payload.from === context.get('id')) {\n payload = {};\n} else if (msg.payload.data.action === 'start_discovery') {\n payload = getInitDiscoveryPayload();\n context.set('sinkHops', -1);\n} else if (msg.payload.data.type === 'INIT_DISCOVERY' && msg.payload.from !== context.get('id')) {\n updateNeighborTable(msg.payload)\n payload = getInitDiscoveryACKPayload(msg.payload.from);\n} else if (msg.payload.data.type === 'ACK_DISCOVERY') {\n updateNeighborTable(msg.payload);\n\n if(msg.payload.data.isSink){\n var isUpdated = updateCurrentMinHop(1);\n if(isUpdated){\n payload = getUpdateDistancePayload();\n }\n }\n} else if(msg.payload.data.type === 'UPDATE_DISTANCE'){\n updateNeighborTable(msg.payload);\n var isUpdated = updateCurrentMinHop(msg.payload.data.sinkHops + 1);\n if (isUpdated){\n payload = getUpdateDistancePayload();\n }\n}\nelse if(msg.payload.data.type === 'FORWARD_PAYLOAD'){\n payload = getForwardPayload(msg.payload);\n computeCostAndDrainBattery();\n\n}\nelse if(msg.payload.data.type === 'ACTION_GENERATE_PAYLOAD'){\n payload = getDataPayload();\n}\n\nreturn {\n payload\n};","outputs":1,"noerr":0,"x":920,"y":260,"wires":[["8b8f3234.46be","bc454ae8.6c41e8","5781c778.b3cc18"]]},{"id":"2d2e2a0d.7c84e6","type":"function","z":"272e932f.b3772c","name":"Node 3","func":"context.set('id', 'node3');\nlet eResId = 'eRes' + context.get('id');\nflow.set(eResId, flow.get(eResId)*0.9999 );\n\nfunction getInitDiscoveryPayload() {\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'INIT_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\n\nfunction getInitDiscoveryACKPayload(to) {\n return {\n from: context.get('id'),\n to: to,\n data: {\n type: 'ACK_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\n\nfunction updateNeighborTable(payload) {\n var neighborTable = flow.get(context.get('id')) || {};\n neighborTable[payload.from] = {\n eRes: payload.data.eRes,\n sinkHops: payload.data.sinkHops\n };\n\n flow.set(context.get('id'), neighborTable);\n}\n\nfunction updateCurrentMinHop(newHops){\n var currentHop = context.get('sinkHops');\n var isUpdated = false;\n if(currentHop === -1){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }else if(newHops < currentHop){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }\n return isUpdated;\n}\n\nfunction getUpdateDistancePayload(){\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'UPDATE_DISTANCE',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\nfunction calculateCost(eRes,sinkHop) {\n let cost = (0.5*(100-eRes)/100) + (0.5*sinkHop/10);\n return cost;\n};\n\nfunction getNextHopId(){\n var neighborTable = flow.get(context.get('id'));\n\n var sortedNeighbors = Object.entries(neighborTable).sort((object1, object2) => calculateCost(object1[1].eRes , object1[1].sinkHops) - calculateCost(object2[1].eRes , object2[1].sinkHops))\n\n\n return sortedNeighbors[0][0];\n}\n\nfunction getForwardPayload(payload){\n return {\n from: payload.from,\n dest: payload.dest,\n to: getNextHopId(),\n path: payload.path.concat(context.get('id')),\n data: payload.data\n }\n}\n\n\nfunction computeCostAndDrainBattery() {\n flow.set(eResId, flow.get(eResId)*0.9999 );\n}\n\nfunction getDataPayload(){\n return {\n from: context.get('id'),\n dest: 'sink',\n to: getNextHopId(),\n path: [context.get('id')],\n data: {\n type: \"FORWARD_PAYLOAD\",\n value: msg.payload.data.value\n }\n }\n}\n\nvar payload = {};\n\nif (msg.payload.from === context.get('id')) {\n payload = {};\n} else if (msg.payload.data.action === 'start_discovery') {\n payload = getInitDiscoveryPayload();\n context.set('sinkHops', -1);\n} else if (msg.payload.data.type === 'INIT_DISCOVERY' && msg.payload.from !== context.get('id')) {\n updateNeighborTable(msg.payload)\n payload = getInitDiscoveryACKPayload(msg.payload.from);\n} else if (msg.payload.data.type === 'ACK_DISCOVERY') {\n updateNeighborTable(msg.payload);\n\n if(msg.payload.data.isSink){\n var isUpdated = updateCurrentMinHop(1);\n if(isUpdated){\n payload = getUpdateDistancePayload();\n }\n }\n} else if(msg.payload.data.type === 'UPDATE_DISTANCE'){\n updateNeighborTable(msg.payload);\n var isUpdated = updateCurrentMinHop(msg.payload.data.sinkHops + 1);\n if (isUpdated){\n payload = getUpdateDistancePayload();\n }\n}\nelse if(msg.payload.data.type === 'FORWARD_PAYLOAD'){\n payload = getForwardPayload(msg.payload);\n computeCostAndDrainBattery();\n\n}\nelse if(msg.payload.data.type === 'ACTION_GENERATE_PAYLOAD'){\n payload = getDataPayload();\n}\n\nreturn {\n payload\n};","outputs":1,"noerr":0,"x":920,"y":320,"wires":[["8b8f3234.46be","bc454ae8.6c41e8","882d6087.9db95"]]},{"id":"53b5df22.a3f9a","type":"debug","z":"272e932f.b3772c","name":"Debug Channel 1","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":490,"y":320,"wires":[]},{"id":"182522ce.65ac4d","type":"switch","z":"272e932f.b3772c","name":"Network Router 1","property":"payload.to","propertyType":"msg","rules":[{"t":"eq","v":"node1","vt":"str"},{"t":"eq","v":"node2","vt":"str"},{"t":"eq","v":"node3","vt":"str"},{"t":"eq","v":"*","vt":"str"}],"checkall":"false","repair":false,"outputs":4,"x":490,"y":240,"wires":[["ef79e6b7.1fee38"],["ee604341.fd865"],["2d2e2a0d.7c84e6"],["ef79e6b7.1fee38","ee604341.fd865","2d2e2a0d.7c84e6"]]},{"id":"973c8bb9.c16aa8","type":"json","z":"272e932f.b3772c","name":"","property":"payload","action":"","pretty":false,"x":310,"y":240,"wires":[["182522ce.65ac4d"]]},{"id":"68ebb3d0.7bce6c","type":"json","z":"272e932f.b3772c","name":"","property":"payload","action":"","pretty":false,"x":310,"y":320,"wires":[["53b5df22.a3f9a"]]},{"id":"a0badebf.3a779","type":"function","z":"272e932f.b3772c","name":"Node 4","func":"context.set('id', 'node4');\nlet eResId = 'eRes' + context.get('id');\nflow.set(eResId, flow.get(eResId)*0.9999 );\n\nfunction getInitDiscoveryPayload() {\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'INIT_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\n\nfunction getInitDiscoveryACKPayload(to) {\n return {\n from: context.get('id'),\n to: to,\n data: {\n type: 'ACK_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\n\nfunction updateNeighborTable(payload) {\n var neighborTable = flow.get(context.get('id')) || {};\n neighborTable[payload.from] = {\n eRes: payload.data.eRes,\n sinkHops: payload.data.sinkHops\n };\n\n flow.set(context.get('id'), neighborTable);\n}\n\nfunction updateCurrentMinHop(newHops){\n var currentHop = context.get('sinkHops');\n var isUpdated = false;\n if(currentHop === -1){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }else if(newHops < currentHop){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }\n return isUpdated;\n}\n\nfunction getUpdateDistancePayload(){\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'UPDATE_DISTANCE',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\nfunction calculateCost(eRes,sinkHop) {\n let cost = (0.5*(100-eRes)/100) + (0.5*sinkHop/10);\n return cost;\n};\n\nfunction getNextHopId(){\n var neighborTable = flow.get(context.get('id'));\n\n var sortedNeighbors = Object.entries(neighborTable).sort((object1, object2) => calculateCost(object1[1].eRes , object1[1].sinkHops) - calculateCost(object2[1].eRes , object2[1].sinkHops))\n\n\n return sortedNeighbors[0][0];\n}\n\nfunction getForwardPayload(payload){\n return {\n from: payload.from,\n dest: payload.dest,\n to: getNextHopId(),\n path: payload.path.concat(context.get('id')),\n data: payload.data\n }\n}\n\n\nfunction computeCostAndDrainBattery() {\n flow.set(eResId, flow.get(eResId)*0.9999 );\n}\n\nfunction getDataPayload(){\n return {\n from: context.get('id'),\n dest: 'sink',\n to: getNextHopId(),\n path: [context.get('id')],\n data: {\n type: \"FORWARD_PAYLOAD\",\n value: msg.payload.data.value\n }\n }\n}\n\nvar payload = {};\n\nif (msg.payload.from === context.get('id')) {\n payload = {};\n} else if (msg.payload.data.action === 'start_discovery') {\n payload = getInitDiscoveryPayload();\n context.set('sinkHops', -1);\n} else if (msg.payload.data.type === 'INIT_DISCOVERY' && msg.payload.from !== context.get('id')) {\n updateNeighborTable(msg.payload)\n payload = getInitDiscoveryACKPayload(msg.payload.from);\n} else if (msg.payload.data.type === 'ACK_DISCOVERY') {\n updateNeighborTable(msg.payload);\n\n if(msg.payload.data.isSink){\n var isUpdated = updateCurrentMinHop(1);\n if(isUpdated){\n payload = getUpdateDistancePayload();\n }\n }\n} else if(msg.payload.data.type === 'UPDATE_DISTANCE'){\n updateNeighborTable(msg.payload);\n var isUpdated = updateCurrentMinHop(msg.payload.data.sinkHops + 1);\n if (isUpdated){\n payload = getUpdateDistancePayload();\n }\n}\nelse if(msg.payload.data.type === 'FORWARD_PAYLOAD'){\n payload = getForwardPayload(msg.payload);\n computeCostAndDrainBattery();\n\n}\nelse if(msg.payload.data.type === 'ACTION_GENERATE_PAYLOAD'){\n payload = getDataPayload();\n}\n\nreturn {\n payload\n};","outputs":1,"noerr":0,"x":920,"y":500,"wires":[["bc454ae8.6c41e8","b35a4a9c.2ae368","6cf97367.3e7d5c"]]},{"id":"bc454ae8.6c41e8","type":"mqtt out","z":"272e932f.b3772c","name":"Channel2 Out","topic":"channel2","qos":"","retain":"","broker":"71b2d5b1.d94dbc","x":1480,"y":500,"wires":[]},{"id":"24b7e871.6c2cf8","type":"mqtt in","z":"272e932f.b3772c","name":"Channel2 In","topic":"channel2","qos":"2","datatype":"auto","broker":"71b2d5b1.d94dbc","x":110,"y":540,"wires":[["5acfec33.a22b34","7ac0b672.8514d8"]]},{"id":"80561831.c99798","type":"function","z":"272e932f.b3772c","name":"Node 5","func":"context.set('id', 'node5');\nlet eResId = 'eRes' + context.get('id');\nflow.set(eResId, flow.get(eResId)*0.9999 );\n\nfunction getInitDiscoveryPayload() {\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'INIT_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\n\nfunction getInitDiscoveryACKPayload(to) {\n return {\n from: context.get('id'),\n to: to,\n data: {\n type: 'ACK_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\n\nfunction updateNeighborTable(payload) {\n var neighborTable = flow.get(context.get('id')) || {};\n neighborTable[payload.from] = {\n eRes: payload.data.eRes,\n sinkHops: payload.data.sinkHops\n };\n\n flow.set(context.get('id'), neighborTable);\n}\n\nfunction updateCurrentMinHop(newHops){\n var currentHop = context.get('sinkHops');\n var isUpdated = false;\n if(currentHop === -1){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }else if(newHops < currentHop){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }\n return isUpdated;\n}\n\nfunction getUpdateDistancePayload(){\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'UPDATE_DISTANCE',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\nfunction calculateCost(eRes,sinkHop) {\n let cost = (0.5*(100-eRes)/100) + (0.5*sinkHop/10);\n return cost;\n};\n\nfunction getNextHopId(){\n var neighborTable = flow.get(context.get('id'));\n\n var sortedNeighbors = Object.entries(neighborTable).sort((object1, object2) => object1[1].sinkHops - object2[1].sinkHops)\n\n return sortedNeighbors[0][0];\n}\n\nfunction getForwardPayload(payload){\n return {\n from: payload.from,\n dest: payload.dest,\n to: getNextHopId(),\n path: payload.path.concat(context.get('id')),\n data: payload.data\n }\n}\n\n\nfunction computeCostAndDrainBattery() {\n flow.set(eResId, flow.get(eResId)*0.9999 );\n}\n\nfunction getDataPayload(){\n return {\n from: context.get('id'),\n dest: 'sink',\n to: getNextHopId(),\n path: [context.get('id')],\n data: {\n type: \"FORWARD_PAYLOAD\",\n value: msg.payload.data.value\n }\n }\n}\n\nvar payload = {};\n\nif (msg.payload.from === context.get('id')) {\n payload = {};\n} else if (msg.payload.data.action === 'start_discovery') {\n payload = getInitDiscoveryPayload();\n context.set('sinkHops', -1);\n} else if (msg.payload.data.type === 'INIT_DISCOVERY' && msg.payload.from !== context.get('id')) {\n updateNeighborTable(msg.payload)\n payload = getInitDiscoveryACKPayload(msg.payload.from);\n} else if (msg.payload.data.type === 'ACK_DISCOVERY') {\n updateNeighborTable(msg.payload);\n\n if(msg.payload.data.isSink){\n var isUpdated = updateCurrentMinHop(1);\n if(isUpdated){\n payload = getUpdateDistancePayload();\n }\n }\n} else if(msg.payload.data.type === 'UPDATE_DISTANCE'){\n updateNeighborTable(msg.payload);\n var isUpdated = updateCurrentMinHop(msg.payload.data.sinkHops + 1);\n if (isUpdated){\n payload = getUpdateDistancePayload();\n }\n}\nelse if(msg.payload.data.type === 'FORWARD_PAYLOAD'){\n payload = getForwardPayload(msg.payload);\n computeCostAndDrainBattery();\n\n}\nelse if(msg.payload.data.type === 'ACTION_GENERATE_PAYLOAD'){\n payload = getDataPayload();\n}\n\nreturn {\n payload\n};","outputs":1,"noerr":0,"x":920,"y":560,"wires":[["bc454ae8.6c41e8","b35a4a9c.2ae368","13fce3ef.3d080c"]]},{"id":"5b4121ff.e5c6b","type":"debug","z":"272e932f.b3772c","name":"Debug Channel 2","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":510,"y":640,"wires":[]},{"id":"18f09188.b69b0e","type":"switch","z":"272e932f.b3772c","name":"Network Router 2","property":"payload.to","propertyType":"msg","rules":[{"t":"eq","v":"node2","vt":"str"},{"t":"eq","v":"node3","vt":"str"},{"t":"eq","v":"node4","vt":"str"},{"t":"eq","v":"node5","vt":"str"},{"t":"eq","v":"*","vt":"str"}],"checkall":"false","repair":false,"outputs":5,"x":510,"y":540,"wires":[["ee604341.fd865"],["2d2e2a0d.7c84e6"],["a0badebf.3a779"],["80561831.c99798"],["a0badebf.3a779","80561831.c99798","2d2e2a0d.7c84e6","ee604341.fd865"]]},{"id":"5acfec33.a22b34","type":"json","z":"272e932f.b3772c","name":"","property":"payload","action":"","pretty":false,"x":310,"y":540,"wires":[["18f09188.b69b0e"]]},{"id":"7ac0b672.8514d8","type":"json","z":"272e932f.b3772c","name":"","property":"payload","action":"","pretty":false,"x":310,"y":640,"wires":[["5b4121ff.e5c6b"]]},{"id":"84759d49.71388","type":"function","z":"272e932f.b3772c","name":"Sink","func":"context.set('id', 'node6');\nlet eResId = 'eRes' + context.get('id');\nflow.set(eResId, flow.get(eResId)*0.9999 );\n\nfunction getInitDiscoveryPayload() {\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'INIT_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\n\nfunction getInitDiscoveryACKPayload(to) {\n return {\n from: context.get('id'),\n to: to,\n data: {\n type: 'ACK_DISCOVERY',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops'),\n isSink: true\n }\n }\n}\n\nfunction updateNeighborTable(payload) {\n var neighborTable = flow.get(context.get('id')) || {};\n neighborTable[payload.from] = {\n eRes: payload.data.eRes,\n sinkHops: payload.data.sinkHops\n };\n\n flow.set(context.get('id'), neighborTable);\n}\n\nfunction updateCurrentMinHop(newHops){\n var currentHop = context.get('sinkHops');\n var isUpdated = false;\n if(currentHop === -1){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }else if(newHops < currentHop){\n isUpdated = true;\n context.set('sinkHops', newHops);\n }\n return isUpdated;\n}\n\nfunction getUpdateDistancePayload(){\n return {\n from: context.get('id'),\n to: '*',\n data: {\n type: 'UPDATE_DISTANCE',\n eRes: flow.get(eResId),\n sinkHops: context.get('sinkHops')\n }\n }\n}\nfunction calculateCost(eRes,sinkHop) {\n let cost = (0.5*(100-eRes)/100) + (0.5*sinkHop/10);\n return cost;\n};\n\nfunction getNextHopId(){\n var neighborTable = flow.get(context.get('id'));\n\n var sortedNeighbors = Object.entries(neighborTable).sort((object1, object2) => calculateCost(object1[1].eRes , object1[1].sinkHops) - calculateCost(object2[1].eRes , object2[1].sinkHops))\n\n\n return sortedNeighbors[0][0];\n}\n\nfunction getForwardPayload(payload){\n return {\n from: payload.from,\n dest: payload.dest,\n to: getNextHopId(),\n path: payload.path.concat(context.get('id')),\n data: payload.data\n }\n}\n\n\nfunction computeCostAndDrainBattery() {\n flow.set(eResId, flow.get(eResId)*0.9999);\n}\n\nfunction getDataPayload(){\n return {\n from: context.get('id'),\n dest: 'sink',\n to: getNextHopId(),\n path: [context.get('id')],\n data: {\n type: \"FORWARD_PAYLOAD\",\n value: msg.payload.data.value\n }\n }\n}\n\nvar payload = {};\n\nif (msg.payload.from === context.get('id')) {\n payload = {};\n} else if (msg.payload.data.action === 'start_discovery') {\n payload = getInitDiscoveryPayload();\n context.set('sinkHops', 0);\n} else if (msg.payload.data.type === 'INIT_DISCOVERY' && msg.payload.from !== context.get('id')) {\n updateNeighborTable(msg.payload)\n payload = getInitDiscoveryACKPayload(msg.payload.from);\n} else if (msg.payload.data.type === 'ACK_DISCOVERY') {\n updateNeighborTable(msg.payload);\n\n if(msg.payload.data.isSink){\n var isUpdated = updateCurrentMinHop(1);\n if(isUpdated){\n payload = getUpdateDistancePayload();\n }\n }\n} else if(msg.payload.data.type === 'UPDATE_DISTANCE'){\n updateNeighborTable(msg.payload);\n var isUpdated = updateCurrentMinHop(msg.payload.data.sinkHops + 1);\n if (isUpdated){\n payload = getUpdateDistancePayload();\n }\n}\nelse if(msg.payload.data.type === 'FORWARD_PAYLOAD'){\n payload = getForwardPayload(msg.payload);\n computeCostAndDrainBattery();\n\n}\nelse if(msg.payload.data.type === 'ACTION_GENERATE_PAYLOAD'){\n payload = getDataPayload();\n}\n\nreturn {\n payload\n};","outputs":1,"noerr":0,"x":910,"y":740,"wires":[["5c540cae.7ad144","954d89d4.fb0028"]]},{"id":"b35a4a9c.2ae368","type":"mqtt out","z":"272e932f.b3772c","name":"Channel3 Out","topic":"channel3","qos":"","retain":"","broker":"71b2d5b1.d94dbc","x":1480,"y":700,"wires":[]},{"id":"4c3956f6.e0fbd8","type":"mqtt in","z":"272e932f.b3772c","name":"Channel3 In","topic":"channel3","qos":"2","datatype":"auto","broker":"71b2d5b1.d94dbc","x":110,"y":760,"wires":[["3872e92e.897356","59a0d4e6.5b169c"]]},{"id":"bd9a3e86.35205","type":"debug","z":"272e932f.b3772c","name":"Debug Channel 3","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":510,"y":860,"wires":[]},{"id":"130873c6.43be1c","type":"switch","z":"272e932f.b3772c","name":"Network Router 3","property":"payload.to","propertyType":"msg","rules":[{"t":"eq","v":"node6","vt":"str"},{"t":"eq","v":"node4","vt":"str"},{"t":"eq","v":"node5","vt":"str"},{"t":"eq","v":"*","vt":"str"}],"checkall":"false","repair":false,"outputs":4,"x":510,"y":760,"wires":[["84759d49.71388"],["a0badebf.3a779"],["80561831.c99798"],["84759d49.71388","80561831.c99798","a0badebf.3a779"]]},{"id":"3872e92e.897356","type":"json","z":"272e932f.b3772c","name":"","property":"payload","action":"","pretty":false,"x":310,"y":760,"wires":[["130873c6.43be1c"]]},{"id":"59a0d4e6.5b169c","type":"json","z":"272e932f.b3772c","name":"","property":"payload","action":"","pretty":false,"x":310,"y":860,"wires":[["bd9a3e86.35205"]]},{"id":"181272f4.68ed0d","type":"function","z":"272e932f.b3772c","name":"Initialize Battery","func":"\nflow.set('eResnode1', 100);\nflow.set('eResnode2', 100);\nflow.set('eResnode3', 100);\nflow.set('eResnode4', 100);\nflow.set('eResnode5', 100);\nflow.set('eResnode6', 100);\nreturn msg;","outputs":1,"noerr":0,"x":300,"y":40,"wires":[[]]},{"id":"19349eb1.f2fc51","type":"inject","z":"272e932f.b3772c","name":"Init","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":90,"y":40,"wires":[["181272f4.68ed0d"]]},{"id":"a96fed50.e8931","type":"debug","z":"272e932f.b3772c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":1470,"y":800,"wires":[]},{"id":"a3d07627.72eb08","type":"function","z":"272e932f.b3772c","name":"Path Display","func":"let p = msg.payload.path.reduce((a,b) => {return a + \"==>\" + b});\nmsg.payload = {\n path: p,\n payload: msg.payload\n}\nreturn msg\n","outputs":1,"noerr":0,"x":1250,"y":800,"wires":[["a96fed50.e8931","5e5375f8.b19fbc"]]},{"id":"5c540cae.7ad144","type":"switch","z":"272e932f.b3772c","name":"","property":"payload.data.type","propertyType":"msg","rules":[{"t":"eq","v":"FORWARD_PAYLOAD","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":1090,"y":740,"wires":[["a3d07627.72eb08"],["b35a4a9c.2ae368"]]},{"id":"d6631c53.f7cef","type":"file in","z":"272e932f.b3772c","name":"Blood Pressure","filename":"C:\\Users\\Sam\\OneDrive - TCDUD.onmicrosoft.com\\Modules\\Scalable Computing\\project4\\v2-demo\\Blood_Pressure.csv","format":"lines","chunk":false,"sendError":false,"encoding":"none","x":320,"y":1140,"wires":[["a8ae5018.70019"]]},{"id":"72c149f2.7976f8","type":"inject","z":"272e932f.b3772c","name":"","topic":"","payload":"","payloadType":"date","repeat":"2","crontab":"","once":true,"onceDelay":0.1,"x":150,"y":1140,"wires":[["d6631c53.f7cef"]]},{"id":"a8ae5018.70019","type":"delay","z":"272e932f.b3772c","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":500,"y":1140,"wires":[["c6544838.b02548","abea5d32.f7393"]]},{"id":"c6544838.b02548","type":"function","z":"272e932f.b3772c","name":"func","func":"msg.payload = Number(msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":650,"y":1160,"wires":[["5b48166c.0929e8"]]},{"id":"5b48166c.0929e8","type":"ui_chart","z":"272e932f.b3772c","name":"","group":"49856a5.03de794","order":0,"width":"0","height":"0","label":"Blood Pressure","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"100","ymax":"180","removeOlder":"30","removeOlderPoints":"","removeOlderUnit":"1","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":800,"y":1160,"wires":[[]]},{"id":"28ea540.22dd3ac","type":"file in","z":"272e932f.b3772c","name":"Heart Rate ","filename":"C:\\Users\\Sam\\OneDrive - TCDUD.onmicrosoft.com\\Modules\\Scalable Computing\\project4\\v2-demo\\Heart_Rate.csv","format":"lines","chunk":false,"sendError":false,"encoding":"none","x":310,"y":1280,"wires":[["a135b3fc.ebf11"]]},{"id":"5dfdaa09.186dc4","type":"inject","z":"272e932f.b3772c","name":"","topic":"","payload":"","payloadType":"date","repeat":"1","crontab":"","once":true,"onceDelay":0.1,"x":150,"y":1280,"wires":[["28ea540.22dd3ac"]]},{"id":"a135b3fc.ebf11","type":"delay","z":"272e932f.b3772c","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":490,"y":1280,"wires":[["6288d93d.1ef428","5ef05ba8.399054"]]},{"id":"6288d93d.1ef428","type":"function","z":"272e932f.b3772c","name":"","func":"msg.payload = Number(msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":650,"y":1300,"wires":[["e687fc4a.8f669"]]},{"id":"e687fc4a.8f669","type":"ui_chart","z":"272e932f.b3772c","name":"","group":"69616839.2e4208","order":0,"width":0,"height":0,"label":"Heart Rate","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"60","ymax":"120","removeOlder":"30","removeOlderPoints":"","removeOlderUnit":"1","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":790,"y":1300,"wires":[[]]},{"id":"1c2f0331.2499ed","type":"file in","z":"272e932f.b3772c","name":"Body Temp","filename":"C:\\Users\\Sam\\OneDrive - TCDUD.onmicrosoft.com\\Modules\\Scalable Computing\\project4\\v2-demo\\Body_Temperature.csv","format":"lines","chunk":false,"sendError":false,"encoding":"none","x":310,"y":1420,"wires":[["f767d62.eb3f028"]]},{"id":"68913b25.0ae0d4","type":"inject","z":"272e932f.b3772c","name":"","topic":"","payload":"","payloadType":"date","repeat":"5","crontab":"","once":true,"onceDelay":0.1,"x":150,"y":1420,"wires":[["1c2f0331.2499ed"]]},{"id":"f767d62.eb3f028","type":"delay","z":"272e932f.b3772c","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":490,"y":1420,"wires":[["146dd5d8.46276a","77ba2505.c8f7ec"]]},{"id":"146dd5d8.46276a","type":"function","z":"272e932f.b3772c","name":"","func":"msg.payload = Number(msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":650,"y":1440,"wires":[["26d6007c.74748"]]},{"id":"26d6007c.74748","type":"ui_chart","z":"272e932f.b3772c","name":"","group":"f311113d.dd217","order":0,"width":0,"height":0,"label":"Body Temp","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"35","ymax":"40","removeOlder":"30","removeOlderPoints":"","removeOlderUnit":"1","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":790,"y":1440,"wires":[[]]},{"id":"abea5d32.f7393","type":"function","z":"272e932f.b3772c","name":"Format Sensor Data","func":"msg.payload = msg.payload.trim()\nif (Number(msg.payload) > 120) {\n \n return {\n payload: {\n data: {\n type: 'ACTION_GENERATE_PAYLOAD',\n value: \"High Blood Pressure: \" + msg.payload\n }\n }\n }\n}\nelse if (Number(msg.payload) < 80) {\n \n return {\n payload: {\n data: {\n type: 'ACTION_GENERATE_PAYLOAD',\n value: \"Low Blood Pressure: \" + msg.payload\n }\n }\n }\n};","outputs":1,"noerr":0,"x":700,"y":1120,"wires":[["ef79e6b7.1fee38"]]},{"id":"5ef05ba8.399054","type":"function","z":"272e932f.b3772c","name":"Format Sensor Data","func":"msg.payload = msg.payload.trim()\n\nreturn {\n payload: {\n data: {\n type: 'ACTION_GENERATE_PAYLOAD',\n value: msg.payload\n }\n }\n};","outputs":1,"noerr":0,"x":700,"y":1260,"wires":[["ee604341.fd865"]]},{"id":"77ba2505.c8f7ec","type":"function","z":"272e932f.b3772c","name":"Format Sensor Data","func":"msg.payload = msg.payload.trim()\n\nif (Number(msg.payload) > 37 || Number(msg.payload) < 34) {\n msg.payload = \"Abnormal Body Temp: \" + msg.payload;\n}\nreturn {\n payload: {\n data: {\n type: 'ACTION_GENERATE_PAYLOAD',\n value: msg.payload\n }\n }\n};","outputs":1,"noerr":0,"x":700,"y":1400,"wires":[["2d2e2a0d.7c84e6"]]},{"id":"9c3e316b.4c78b","type":"function","z":"272e932f.b3772c","name":"Battery","func":"battery = flow.get(\"eResnode1\");\nreturn {\n payload : battery\n}","outputs":1,"noerr":0,"x":1080,"y":180,"wires":[["2e7c6727.f860f8","ae3ad19.9a2503"]]},{"id":"5781c778.b3cc18","type":"function","z":"272e932f.b3772c","name":"Battery","func":"battery = flow.get(\"eResnode2\");\nreturn {\n payload : battery\n}","outputs":1,"noerr":0,"x":1080,"y":280,"wires":[["2457aa42.79f116","b70cfa51.8e1598"]]},{"id":"882d6087.9db95","type":"function","z":"272e932f.b3772c","name":"Battery","func":"battery = flow.get(\"eResnode3\");\nreturn {\n payload : battery\n}","outputs":1,"noerr":0,"x":1080,"y":360,"wires":[["457613b8.c80edc","a468e5fc.af4168"]]},{"id":"6cf97367.3e7d5c","type":"function","z":"272e932f.b3772c","name":"Battery","func":"battery = flow.get(\"eResnode4\");\nreturn {\n payload : battery\n}","outputs":1,"noerr":0,"x":1080,"y":480,"wires":[["db66ed60.fdf1e","d7c100b0.245d4"]]},{"id":"13fce3ef.3d080c","type":"function","z":"272e932f.b3772c","name":"Battery","func":"battery = flow.get(\"eResnode5\");\nreturn {\n payload : battery\n}","outputs":1,"noerr":0,"x":1080,"y":580,"wires":[["7a8e3bc9.c28614","71b34a04.c37a14"]]},{"id":"954d89d4.fb0028","type":"function","z":"272e932f.b3772c","name":"Battery","func":"battery = flow.get(\"eResnode6\");\nreturn {\n payload : battery\n}","outputs":1,"noerr":0,"x":1080,"y":700,"wires":[["7e16b7c0.7e4d38","dd554af6.7151a8"]]},{"id":"ae3ad19.9a2503","type":"ui_gauge","z":"272e932f.b3772c","name":"","group":"c5459ebe.a60fd","order":1,"width":0,"height":0,"gtype":"gage","title":"Node 1","label":"","format":"","min":0,"max":"100","colors":["#b41701","#e6e600","#0db004"],"seg1":"30","seg2":"80","x":1220,"y":160,"wires":[]},{"id":"2e7c6727.f860f8","type":"ui_chart","z":"272e932f.b3772c","name":"","group":"c5459ebe.a60fd","order":2,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"30","removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1210,"y":200,"wires":[[]]},{"id":"457613b8.c80edc","type":"ui_gauge","z":"272e932f.b3772c","d":true,"name":"","group":"fe098485.30e458","order":1,"width":0,"height":0,"gtype":"gage","title":"Node 3","label":"","format":"","min":0,"max":"100","colors":["#b41701","#e6e600","#0db004"],"seg1":"30","seg2":"80","x":1220,"y":340,"wires":[]},{"id":"db66ed60.fdf1e","type":"ui_gauge","z":"272e932f.b3772c","d":true,"name":"","group":"c9b5669d.057138","order":1,"width":0,"height":0,"gtype":"gage","title":"Node 4","label":"","format":"","min":0,"max":"100","colors":["#b41701","#e6e600","#0db004"],"seg1":"30","seg2":"80","x":1220,"y":460,"wires":[]},{"id":"7a8e3bc9.c28614","type":"ui_gauge","z":"272e932f.b3772c","d":true,"name":"","group":"c82c8dff.58bb8","order":1,"width":0,"height":0,"gtype":"gage","title":"Node 5","label":"","format":"","min":0,"max":"100","colors":["#b41701","#e6e600","#0db004"],"seg1":"30","seg2":"80","x":1220,"y":560,"wires":[]},{"id":"7e16b7c0.7e4d38","type":"ui_gauge","z":"272e932f.b3772c","name":"","group":"1fac7a3d.4b76c6","order":1,"width":0,"height":0,"gtype":"gage","title":"Node 6","label":"","format":"","min":0,"max":"100","colors":["#b41701","#e6e600","#0db004"],"seg1":"30","seg2":"80","x":1220,"y":680,"wires":[]},{"id":"2457aa42.79f116","type":"ui_chart","z":"272e932f.b3772c","name":"","group":"79db329f.a570cc","order":2,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"30","removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1210,"y":300,"wires":[[]]},{"id":"a468e5fc.af4168","type":"ui_chart","z":"272e932f.b3772c","d":true,"name":"","group":"fe098485.30e458","order":2,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"30","removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1210,"y":380,"wires":[[]]},{"id":"d7c100b0.245d4","type":"ui_chart","z":"272e932f.b3772c","d":true,"name":"","group":"c9b5669d.057138","order":2,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"30","removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1210,"y":500,"wires":[[]]},{"id":"71b34a04.c37a14","type":"ui_chart","z":"272e932f.b3772c","d":true,"name":"","group":"c82c8dff.58bb8","order":2,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"30","removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1210,"y":600,"wires":[[]]},{"id":"dd554af6.7151a8","type":"ui_chart","z":"272e932f.b3772c","name":"","group":"1fac7a3d.4b76c6","order":2,"width":0,"height":0,"label":"","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"30","removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1210,"y":720,"wires":[[]]},{"id":"7f0197a8.508088","type":"file","z":"272e932f.b3772c","name":"Sink CSV","filename":"C:\\Users\\Sam\\OneDrive - TCDUD.onmicrosoft.com\\Modules\\Scalable Computing\\project4\\v2-demo\\sink.csv","appendNewline":true,"createDir":false,"overwriteFile":"false","encoding":"none","x":1500,"y":860,"wires":[[]]},{"id":"5e5375f8.b19fbc","type":"function","z":"272e932f.b3772c","name":"","func":"msg.payload = msg.payload.payload.from + \",\" +\n msg.payload.payload.data.value + \",\" +\n msg.payload.path \n\nreturn msg\n","outputs":1,"noerr":0,"x":1370,"y":860,"wires":[["7f0197a8.508088"]]},{"id":"71aff8b8.1e4d68","type":"mqtt out","z":"272e932f.b3772c","d":true,"name":"Base Station","topic":"","qos":"","retain":"","broker":"bcb39d83.bf88f","x":1170,"y":1060,"wires":[]},{"id":"18fa28a.2a67fd7","type":"csv","z":"272e932f.b3772c","d":true,"name":"","sep":",","hdrin":"","hdrout":"","multi":"one","ret":"\\n","temp":"","skip":"0","strings":true,"x":1000,"y":1080,"wires":[["71aff8b8.1e4d68"]]},{"id":"b70cfa51.8e1598","type":"ui_gauge","z":"272e932f.b3772c","name":"","group":"79db329f.a570cc","order":1,"width":0,"height":0,"gtype":"gage","title":"Node 2","label":"","format":"","min":0,"max":"100","colors":["#b41701","#e6e600","#0db004"],"seg1":"30","seg2":"80","x":1220,"y":260,"wires":[]},{"id":"71b2d5b1.d94dbc","type":"mqtt-broker","z":"","name":"Localhost","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"49856a5.03de794","type":"ui_group","z":"","name":"Sensor1","tab":"3e3ef7d4.3e98a8","disp":true,"width":"6","collapse":false},{"id":"69616839.2e4208","type":"ui_group","z":"","name":"Sensor2","tab":"3e3ef7d4.3e98a8","disp":true,"width":"6","collapse":false},{"id":"f311113d.dd217","type":"ui_group","z":"","name":"Sensor3","tab":"3e3ef7d4.3e98a8","disp":true,"width":"6","collapse":false},{"id":"c5459ebe.a60fd","type":"ui_group","z":"","name":"Battery1","tab":"c9e1b3d1.1c7c4","disp":true,"width":"4","collapse":false},{"id":"fe098485.30e458","type":"ui_group","z":"","name":"Battery3","tab":"c9e1b3d1.1c7c4","disp":true,"width":"4","collapse":false},{"id":"c9b5669d.057138","type":"ui_group","z":"","name":"Battery4","tab":"c9e1b3d1.1c7c4","disp":true,"width":"4","collapse":false},{"id":"c82c8dff.58bb8","type":"ui_group","z":"","name":"Battery5","tab":"c9e1b3d1.1c7c4","disp":true,"width":"4","collapse":false},{"id":"1fac7a3d.4b76c6","type":"ui_group","z":"","name":"Battery6","tab":"c9e1b3d1.1c7c4","disp":true,"width":"4","collapse":false},{"id":"79db329f.a570cc","type":"ui_group","z":"","name":"Battery2","tab":"c9e1b3d1.1c7c4","disp":true,"width":"4","collapse":false},{"id":"bcb39d83.bf88f","type":"mqtt-broker","z":"","name":"","broker":"amqo10ymhc6nv-ats.iot.eu-west-1.amazonaws.com/","port":"8883","tls":"c8c6e3b8.e5149","clientid":"","usetls":true,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"3e3ef7d4.3e98a8","type":"ui_tab","z":"","name":"Sensor Data","icon":"dashboard","order":1,"disabled":false,"hidden":false},{"id":"c9e1b3d1.1c7c4","type":"ui_tab","z":"","name":"Battery","icon":"dashboard","disabled":false,"hidden":false},{"id":"c8c6e3b8.e5149","type":"tls-config","z":"","name":"","cert":"","key":"","ca":"","certname":"ebd927bbe1-certificate.pem.crt","keyname":"ebd927bbe1-private.pem.key","caname":"rootCA.pem","servername":"","verifyservercert":true}]