Last active
September 9, 2018 16:13
-
-
Save mattbrailsford/4c0241d5a981a302be4eec5390b14651 to your computer and use it in GitHub Desktop.
Node-RED Flow for a plotclock implementation using a Line-us machine
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| [ | |
| { | |
| "id": "1207feb6.6cb2e1", | |
| "type": "tab", | |
| "label": "Line-us", | |
| "disabled": true, | |
| "info": "" | |
| }, | |
| { | |
| "id": "688cc590.31b39c", | |
| "type": "function", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "OK Trigger", | |
| "func": "if(msg.payload.indexOf('ok') === 0 && \n msg.payload !== 'ok X:1000 Y:1000 Z:1000') {\n return { trigger: 1 }; \n}\nreturn null;", | |
| "outputs": 1, | |
| "noerr": 0, | |
| "x": 930, | |
| "y": 300, | |
| "wires": [ | |
| [ | |
| "6f91ae91.2df4d" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "b6d4508.1513db", | |
| "type": "websocket in", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Line-us (in)", | |
| "server": "", | |
| "client": "b0a9d5f5.d992f8", | |
| "x": 760, | |
| "y": 240, | |
| "wires": [ | |
| [ | |
| "688cc590.31b39c", | |
| "2e2cf623.aca12a", | |
| "99effd71.5bfa2", | |
| "2650f90c.13cfa6", | |
| "513b4aec.b2e4a4" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "7499a3e3.be696c", | |
| "type": "websocket out", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Line-us (out)", | |
| "server": "", | |
| "client": "b0a9d5f5.d992f8", | |
| "x": 1410, | |
| "y": 420, | |
| "wires": [] | |
| }, | |
| { | |
| "id": "6f91ae91.2df4d", | |
| "type": "simple-queue", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "GCODE Queue", | |
| "x": 1220, | |
| "y": 180, | |
| "wires": [ | |
| [ | |
| "f09eff9a.1201a" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "d31b1dd8.ea224", | |
| "type": "function", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Enqueue GCODE", | |
| "func": "msg.payload.forEach(function(element) {\n node.send({ payload: element});\n});\nnode.send({ payload: 'G28' });\nnode.send({ trigger: 1 });", | |
| "outputs": 1, | |
| "noerr": 0, | |
| "x": 950, | |
| "y": 180, | |
| "wires": [ | |
| [ | |
| "6f91ae91.2df4d" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "f09eff9a.1201a", | |
| "type": "function", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Cache payload", | |
| "func": "if (msg.hasOwnProperty('replay')) {\n return context.lastMsg;\n}\ncontext.lastMsg = msg;\nreturn msg;", | |
| "outputs": 1, | |
| "noerr": 0, | |
| "x": 1220, | |
| "y": 420, | |
| "wires": [ | |
| [ | |
| "7499a3e3.be696c" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "2e2cf623.aca12a", | |
| "type": "function", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Error Trigger", | |
| "func": "if(msg.payload.indexOf('error') === 0) {\n return { replay: 1 }; \n}\nreturn null;", | |
| "outputs": 1, | |
| "noerr": 0, | |
| "x": 930, | |
| "y": 420, | |
| "wires": [ | |
| [ | |
| "f09eff9a.1201a" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "6d5c6cc.32e2294", | |
| "type": "inject", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Init", | |
| "topic": "", | |
| "payload": "", | |
| "payloadType": "date", | |
| "repeat": "", | |
| "crontab": "", | |
| "once": true, | |
| "onceDelay": 0.1, | |
| "x": 190, | |
| "y": 180, | |
| "wires": [ | |
| [ | |
| "8b2632df.05952" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "8b2632df.05952", | |
| "type": "function", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Init Variables", | |
| "func": "context.flow.numbers = [\n [ // 0\n [1300,0,0],\n [900,0,0],\n [900,300,0],\n [1100,300,0],\n [1300,0,0],\n [1500,0,0],\n [1500,300,0],\n [1100,300,0],\n [1100,300,1000]\n ],\n [ // 1\n [900,200,0],\n [900,300,0],\n [1500,300,0],\n [1500,300,1000]\n ],\n [ // 2\n [900,0,0],\n [900,300,0],\n [1100,300,0],\n [1300,0,0],\n [1500,0,0],\n [1500,300,0],\n [1500,300,1000]\n ],\n [ // 3\n [900,0,0],\n [900,300,0],\n [1200,100,0],\n [1200,300,0],\n [1500,300,0],\n [1500,0,0],\n [1500,0,1000]\n ],\n [ // 4\n [1300,300,0],\n [1300,0,0],\n [900,300,0],\n [1500,300,0],\n [1500,300,1000]\n ],\n [ // 5\n [900,300,0],\n [900,0,0],\n [1100,0,0],\n [1100,300,0],\n [1500,300,0],\n [1500,0,0],\n [1500,0,1000]\n ],\n [ // 6\n [900,300,0],\n [900,0,0],\n [1500,0,0],\n [1500,300,0],\n [1100,300,0],\n [1100,0,0],\n [1100,0,1000]\n ],\n [ // 7\n [900,0,0],\n [900,300,0],\n [1100,300,0],\n [1300,100,0],\n [1500,100,0],\n [1500,100,1000]\n ],\n [ // 8\n [1100,0,0],\n [900,0,0],\n [900,300,0],\n [1100,300,0],\n [1100,0,0],\n [1500,0,0],\n [1500,300,0],\n [1100,300,0],\n [1100,300,1000]\n ],\n [ // 9\n [1300,300,0],\n [1300,0,0],\n [900,0,0],\n [900,300,0],\n [1500,300,0],\n [1500,0,0],\n [1500,0,1000]\n ]\n];\ncontext.flow.erase = [\n [1000,1000,1300],\n [900,1300,1300],\n [900,1300,0],\n [900,-800,0],\n [1100,-800,0],\n [1100,800,0],\n [1300,800,0],\n [1300,-800,0],\n [1500,-800,0],\n [1500,800,0],\n [900,800,0],\n [900,1300,0],\n [900,1300,1300],\n [1000,1000,1300]\n]\nreturn msg;", | |
| "outputs": 1, | |
| "noerr": 0, | |
| "x": 350, | |
| "y": 180, | |
| "wires": [ | |
| [] | |
| ] | |
| }, | |
| { | |
| "id": "a0d7e715.4c6308", | |
| "type": "function", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Build GCode", | |
| "func": "var pad = function (num, len) {\n return (new Array(len+1).join(\"0\") + num).slice(-len);\n}\n\nvar hDigits = pad(msg.payload.hours, 2).split('').map(Number);\nvar mDigits = pad(msg.payload.minutes, 2).split('').map(Number);\n\nvar yOffset = -800;\nvar yInc = 400;\nvar gcode = [];\n\n// Erase previous\nif (msg.hasOwnProperty('trigger') && msg.trigger !== -1) {\n context.flow.erase.forEach(function(cmd){\n gcode.push(cmd);\n });\n}\n\n// Hours\nhDigits.forEach(function (d) {\n context.flow.numbers[d].forEach(function(cmd){\n gcode.push([\n cmd[0], // X\n cmd[1] + yOffset, // Y\n cmd[2] // Z\n ])\n })\n yOffset += yInc;\n});\n\n// Dots\ngcode.push([1100,0,0])\ngcode.push([1100,0,1000])\ngcode.push([1300,0,0])\ngcode.push([1300,0,1000])\nyOffset += 100;\n\n// Minutes\nmDigits.forEach(function (d) {\n context.flow.numbers[d].forEach(function(cmd){\n gcode.push([\n cmd[0], // X\n cmd[1] + yOffset, // Y\n cmd[2] // Z\n ])\n })\n yOffset += yInc;\n});\n\nmsg.payload = gcode;\nreturn msg;", | |
| "outputs": 1, | |
| "noerr": 0, | |
| "x": 590, | |
| "y": 240, | |
| "wires": [ | |
| [ | |
| "5b2ede9d.e9841" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "99effd71.5bfa2", | |
| "type": "debug", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "", | |
| "active": false, | |
| "tosidebar": true, | |
| "console": false, | |
| "tostatus": false, | |
| "complete": "true", | |
| "x": 910, | |
| "y": 480, | |
| "wires": [] | |
| }, | |
| { | |
| "id": "2650f90c.13cfa6", | |
| "type": "function", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Init Trigger", | |
| "func": "// ok X:1000 Y:1000 Z:1000\nif(msg.payload.indexOf('hello') === 0) {\n return { trigger: -1 }; \n}\nreturn null;", | |
| "outputs": 1, | |
| "noerr": 0, | |
| "x": 930, | |
| "y": 240, | |
| "wires": [ | |
| [ | |
| "67dab93a.12c188" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "67dab93a.12c188", | |
| "type": "link out", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "init-trigger", | |
| "links": [ | |
| "7b0054ef.c9b05c" | |
| ], | |
| "x": 1055, | |
| "y": 240, | |
| "wires": [] | |
| }, | |
| { | |
| "id": "5b2ede9d.e9841", | |
| "type": "function", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Format GCode", | |
| "func": "var gcode = [];\nmsg.payload.forEach(function(el) {\n gcode.push(`G01 X${el[0]} Y${el[1]} Z${el[2]}`);\n});\nmsg.payload = gcode;\nreturn msg;", | |
| "outputs": 1, | |
| "noerr": 0, | |
| "x": 740, | |
| "y": 180, | |
| "wires": [ | |
| [ | |
| "d31b1dd8.ea224" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "513b4aec.b2e4a4", | |
| "type": "function", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Home Trigger", | |
| "func": "if (msg.payload === 'ok X:1000 Y:1000 Z:1000') {\n return { trigger: 1 }; \n}\nreturn null;", | |
| "outputs": 1, | |
| "noerr": 0, | |
| "x": 940, | |
| "y": 360, | |
| "wires": [ | |
| [ | |
| "f3137d65.c8219" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "f3137d65.c8219", | |
| "type": "link out", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "home-trigger", | |
| "links": [ | |
| "277a7fe9.ac804", | |
| "7b0054ef.c9b05c" | |
| ], | |
| "x": 1055, | |
| "y": 360, | |
| "wires": [] | |
| }, | |
| { | |
| "id": "7b0054ef.c9b05c", | |
| "type": "link in", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "trigger-in", | |
| "links": [ | |
| "67dab93a.12c188", | |
| "f3137d65.c8219", | |
| "ec8102c3.6537c" | |
| ], | |
| "x": 95, | |
| "y": 240, | |
| "wires": [ | |
| [ | |
| "496d22ed.664a4c" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "70561196.0f73f", | |
| "type": "function", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Time Cache", | |
| "func": "context.lastTime = context.lastTime || \"\";\n\nvar time = `${msg.payload.hours}:${msg.payload.minutes}`;\nif (context.lastTime != time) {\n context.lastTime = time;\n return [msg, null];\n} else {\n return [null, msg];\n}", | |
| "outputs": 2, | |
| "noerr": 0, | |
| "x": 410, | |
| "y": 240, | |
| "wires": [ | |
| [ | |
| "a0d7e715.4c6308" | |
| ], | |
| [ | |
| "32d31101.9737de" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "32d31101.9737de", | |
| "type": "delay", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "", | |
| "pauseType": "delay", | |
| "timeout": "1", | |
| "timeoutUnits": "seconds", | |
| "rate": "1", | |
| "nbRateUnits": "1", | |
| "rateUnits": "second", | |
| "randomFirst": "1", | |
| "randomLast": "5", | |
| "randomUnits": "seconds", | |
| "drop": false, | |
| "x": 580, | |
| "y": 300, | |
| "wires": [ | |
| [ | |
| "ec8102c3.6537c" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "ec8102c3.6537c", | |
| "type": "link out", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "delay-out", | |
| "links": [ | |
| "7b0054ef.c9b05c" | |
| ], | |
| "x": 715, | |
| "y": 300, | |
| "wires": [] | |
| }, | |
| { | |
| "id": "496d22ed.664a4c", | |
| "type": "moment", | |
| "z": "1207feb6.6cb2e1", | |
| "name": "Local Date Time", | |
| "topic": "", | |
| "input": "", | |
| "inputType": "date", | |
| "inTz": "Etc/UTC", | |
| "adjAmount": "0", | |
| "adjType": "hours", | |
| "adjDir": "add", | |
| "format": "object", | |
| "locale": "en_GB", | |
| "output": "payload", | |
| "outputType": "msg", | |
| "outTz": "Europe/London", | |
| "x": 220, | |
| "y": 240, | |
| "wires": [ | |
| [ | |
| "70561196.0f73f" | |
| ] | |
| ] | |
| }, | |
| { | |
| "id": "b0a9d5f5.d992f8", | |
| "type": "websocket-client", | |
| "z": "", | |
| "path": "ws://line-us.local", | |
| "tls": "", | |
| "wholemsg": "false" | |
| } | |
| ] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment