UNPKG

@ifp-software/node-red-contrib-oee-ai-connector

Version:

Easily connect your production machines to oee.ai – The Industry 4.0 solution for OEE optimization.

866 lines 24.1 kB
[ { "id": "d75dd96899f2f8c0", "type": "subflow", "name": "Get Products from MIP", "info": "", "category": "", "in": [ { "x": 40, "y": 80, "wires": [ { "id": "85081c4f92039982" } ] } ], "out": [ { "x": 1560, "y": 80, "wires": [ { "id": "b7b57f63e3f252fb", "port": 0 } ] } ], "env": [], "meta": {}, "color": "#DDAA99" }, { "id": "d4f2b19af0006d7e", "type": "http request", "z": "d75dd96899f2f8c0", "name": "service call to MIP", "method": "POST", "ret": "obj", "paytoqs": "ignore", "url": "", "tls": "", "persist": false, "proxy": "", "authType": "", "senderr": false, "x": 370, "y": 80, "wires": [ [ "468aba4576d29785" ] ] }, { "id": "85081c4f92039982", "type": "function", "z": "d75dd96899f2f8c0", "name": "build request", "func": "msg.payload = { \n \"params\": [], \n \"columns\": [ \n \"operation.article\", \n \"operation.cycle.target\"\n ], \n \"returnAsObject\": true,\n \"languageKey\": msg.languageKey\n}\n\nmsg.url = msg.baseUrl + \"/data/BOOperation/list?X-Access-Id=\" + msg.xAccessId\n\nlet basic_encrypted = \"Basic \" + new Buffer(msg.user + ':' + msg.password).toString('base64')\n\nmsg.headers = { \n \"Content-Type\": \"application/json\",\n \"Authorization\": basic_encrypted\n}\n\nreturn msg;", "outputs": 1, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 190, "y": 80, "wires": [ [ "d4f2b19af0006d7e" ] ] }, { "id": "781afa9d17c05f7d", "type": "split", "z": "d75dd96899f2f8c0", "name": "", "splt": "\\n", "spltType": "str", "arraySplt": 1, "arraySpltType": "len", "stream": false, "addname": "", "x": 1230, "y": 80, "wires": [ [ "b7b57f63e3f252fb" ] ] }, { "id": "468aba4576d29785", "type": "change", "z": "d75dd96899f2f8c0", "name": "Clean up for next requests", "rules": [ { "t": "delete", "p": "headers", "pt": "msg" }, { "t": "delete", "p": "url", "pt": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 600, "y": 80, "wires": [ [ "e0df0481fabecdac" ] ] }, { "id": "e0df0481fabecdac", "type": "change", "z": "d75dd96899f2f8c0", "name": "Delete META data", "rules": [ { "t": "delete", "p": "payload[0]", "pt": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 830, "y": 80, "wires": [ [ "0eaf3e7b6e0a45b5" ] ] }, { "id": "0eaf3e7b6e0a45b5", "type": "function", "z": "d75dd96899f2f8c0", "name": "Remove doubles", "func": "const uniqueData = msg.payload.filter((v, i, a) => {\n const operationArticle = v.obj['operation.article'];\n // Check if operation.article exists and is unique\n return operationArticle && a.findIndex(t => t.obj['operation.article'] === operationArticle) === i;\n});\n\nmsg.payload = uniqueData;\n\nreturn msg;", "outputs": 1, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1050, "y": 80, "wires": [ [ "781afa9d17c05f7d" ] ] }, { "id": "b7b57f63e3f252fb", "type": "function", "z": "d75dd96899f2f8c0", "name": "calculate target-speed", "func": "const time_for_1k = msg.payload.obj[\"operation.cycle.target\"];\n// MIP saves time for 1000 products in seconds\nif(time_for_1k){\n msg[\"target-speed\"] = time_for_1k / 1000; \n}else{\n msg[\"target-speed\"] = 1;\n}\n\nreturn msg;", "outputs": 1, "timeout": "", "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1400, "y": 80, "wires": [ [] ] }, { "id": "add565707d291876", "type": "subflow", "name": "Post products", "info": "", "category": "", "in": [ { "x": 220, "y": 220, "wires": [ { "id": "7ef5e7c148cf0a7b" } ] } ], "out": [ { "x": 800, "y": 220, "wires": [ { "id": "db341d98f56b996c", "port": 0 } ] } ], "env": [], "meta": {}, "color": "#DDAA99" }, { "id": "7ef5e7c148cf0a7b", "type": "function", "z": "add565707d291876", "name": "Formatting json payload", "func": "msg.headers = {\n \"Content-Type\": \"application/vnd.api+json\",\n \"Authorization\": \"Bearer \" + msg.bearerToken\n}\n\nmsg.payload = {\n \"data\": {\n \"type\": \"products\",\n \"attributes\": {\n \"code\": msg.code,\n \"description\": msg.description,\n \"color\": msg.color,\n \"production-unit\": msg[\"production-unit\"],\n \"cycle-time-mode\": msg[\"cycle-time-mode\"],\n \"cycle-time-unit\": msg[\"cycle-time-unit\"],\n \"target-speed\": msg[\"target-speed\"],\n \"units-multiplier\": msg[\"units-multiplier\"],\n \"units-divisor\": msg[\"units-divisor\"],\n \"info\": msg.info\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"type\": \"locations\",\n \"id\": msg.location\n }\n }\n }\n }\n}\n\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 370, "y": 220, "wires": [ [ "db341d98f56b996c" ] ] }, { "id": "db341d98f56b996c", "type": "http request", "z": "add565707d291876", "name": "POST product to oee.ai", "method": "POST", "ret": "obj", "paytoqs": "ignore", "url": "https://api.oee.ai/products", "tls": "", "persist": false, "proxy": "", "authType": "", "senderr": false, "x": 630, "y": 220, "wires": [ [] ] }, { "id": "f51662145c16c667", "type": "subflow", "name": "Patch products", "info": "", "category": "", "in": [ { "x": 180, "y": 160, "wires": [ { "id": "ee5989b6e6bd58a3" } ] } ], "out": [ { "x": 2220, "y": 160, "wires": [ { "id": "b5ec8138a6de0f03", "port": 0 }, { "id": "6d0db9f101177a9c", "port": 1 } ] } ], "env": [], "meta": {}, "color": "#DDAA99" }, { "id": "084fb25d157ed9ce", "type": "http request", "z": "f51662145c16c667", "name": "Get existing product", "method": "GET", "ret": "obj", "paytoqs": "ignore", "url": "https://api.oee.ai/products?filter[code-or-description]={{{code}}}&filter[location]={{{location}}}", "tls": "", "persist": false, "proxy": "", "authType": "", "senderr": false, "x": 840, "y": 160, "wires": [ [ "6d0db9f101177a9c" ] ] }, { "id": "d82019c0b8785004", "type": "function", "z": "f51662145c16c667", "name": "Formatting json payload", "func": "msg.headers = {\n \"Content-Type\": \"application/vnd.api+json\",\n \"Authorization\": \"Bearer \" + msg.bearerToken\n};\n\nmsg.method = \"PATCH\";\n\nmsg.oldProductId = msg.payload.data[0].id;\n\nmsg.payload = {\n \"data\": {\n \"id\": msg.oldProductId,\n \"type\": \"products\",\n \"attributes\": {\n \"code\": msg.code,\n \"description\": msg.description,\n \"color\": msg.color,\n \"production-unit\": msg[\"production-unit\"],\n \"cycle-time-mode\": msg[\"cycle-time-mode\"],\n \"cycle-time-unit\": msg[\"cycle-time-unit\"],\n \"target-speed\": msg[\"target-speed\"],\n \"units-multiplier\": msg[\"units-multiplier\"],\n \"units-divisor\": msg[\"units-divisor\"],\n \"info\": msg.info\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"type\": \"locations\",\n \"id\": msg.location\n }\n }\n }\n }\n};\n\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1570, "y": 140, "wires": [ [ "73946bc6e044dc90" ] ] }, { "id": "73946bc6e044dc90", "type": "http request", "z": "f51662145c16c667", "name": "Patch product", "method": "use", "ret": "obj", "paytoqs": "ignore", "url": "https://api.oee.ai/products/{{{oldProductId}}}", "tls": "", "persist": false, "proxy": "", "authType": "", "senderr": false, "x": 1780, "y": 140, "wires": [ [ "b5ec8138a6de0f03" ] ] }, { "id": "ee5989b6e6bd58a3", "type": "change", "z": "f51662145c16c667", "name": "delete response header", "rules": [ { "t": "delete", "p": "headers", "pt": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 370, "y": 160, "wires": [ [ "0e90fa88568de2a6" ] ] }, { "id": "5794069f51aa5752", "type": "change", "z": "f51662145c16c667", "name": "delete response header", "rules": [ { "t": "delete", "p": "headers", "pt": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1330, "y": 140, "wires": [ [ "d82019c0b8785004" ] ] }, { "id": "0e90fa88568de2a6", "type": "function", "z": "f51662145c16c667", "name": "Set Authorization header", "func": "msg.headers = {\n \"Authorization\": \"Bearer \" + msg.bearerToken\n}\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 610, "y": 160, "wires": [ [ "084fb25d157ed9ce" ] ] }, { "id": "6d0db9f101177a9c", "type": "function", "z": "f51662145c16c667", "name": "Check if product changed", "func": "function compareProperties(a, b, properties) {\n return properties.every(prop => {\n if (prop == 'target-speed'){\n if (parseFloat(a[prop]) == parseFloat(b[prop])){\n return true;\n }else{\n return false;\n }\n }else{\n if(a[prop] == b[prop]){\n return true;\n }else{\n return false;\n }\n }});\n}\n\nlet existingProduct = {}\n// potential bug when product code is substring of other product i.e. h123 and h123-02\nif (msg.payload.data.length > 1){\n existingProduct = msg.payload.data.find(entry => entry.attributes.code == msg.code).attributes;\n}else{\n existingProduct = msg.payload.data[0].attributes;\n}\n\nlet propertiesToCompare = [\n 'code',\n 'description',\n 'target-speed',\n 'info',\n 'color',\n 'production-unit',\n 'cycle-time-mode',\n 'units-multiplier',\n 'units-divisor'\n];\n\nif (compareProperties(existingProduct, msg, propertiesToCompare)) {\n return [null, msg];\n}\n\nreturn [msg, null]", "outputs": 2, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 1090, "y": 160, "wires": [ [ "5794069f51aa5752" ], [] ] }, { "id": "b5ec8138a6de0f03", "type": "change", "z": "f51662145c16c667", "name": "delete response header and method", "rules": [ { "t": "delete", "p": "headers", "pt": "msg" }, { "t": "delete", "p": "method", "pt": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 2030, "y": 140, "wires": [ [] ] }, { "id": "d644b32827ab5ff7", "type": "subflow", "name": "Send products to oee.ai", "info": "", "category": "", "in": [ { "x": 140, "y": 260, "wires": [ { "id": "c989c8789ff6d538" } ] } ], "out": [ { "x": 1060, "y": 260, "wires": [ { "id": "81d1d177247aa9df", "port": 1 }, { "id": "a575dcb265c27b3d", "port": 0 } ] } ], "env": [], "meta": {}, "color": "#DDAA99" }, { "id": "81d1d177247aa9df", "type": "switch", "z": "d644b32827ab5ff7", "name": "Check if product already exists", "property": "statusCode", "propertyType": "msg", "rules": [ { "t": "eq", "v": "422", "vt": "num" }, { "t": "else" } ], "checkall": "false", "repair": false, "outputs": 2, "x": 530, "y": 260, "wires": [ [ "a575dcb265c27b3d" ], [ "4f0f204355cbaa5e" ] ] }, { "id": "a575dcb265c27b3d", "type": "subflow:f51662145c16c667", "z": "d644b32827ab5ff7", "name": "", "x": 780, "y": 220, "wires": [ [ "91effa9eddfb437c" ] ] }, { "id": "c989c8789ff6d538", "type": "subflow:add565707d291876", "z": "d644b32827ab5ff7", "name": "", "x": 290, "y": 260, "wires": [ [ "81d1d177247aa9df" ] ] }, { "id": "91effa9eddfb437c", "type": "debug", "z": "d644b32827ab5ff7", "name": "PATCH", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 1120, "y": 200, "wires": [] }, { "id": "4f0f204355cbaa5e", "type": "debug", "z": "d644b32827ab5ff7", "name": "POST", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 1110, "y": 320, "wires": [] }, { "id": "086fd29526322b8c", "type": "tab", "label": "MIP synchronizing products", "disabled": false, "info": "", "env": [] }, { "id": "c278c920c52a1349", "type": "comment", "z": "086fd29526322b8c", "name": "^^ enter your oee.ai API token", "info": "You can find your API Token on oee.ai", "x": 1200, "y": 340, "wires": [] }, { "id": "af161a2441ca5b23", "type": "inject", "z": "086fd29526322b8c", "name": "Every day", "props": [], "repeat": "86400", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "x": 230, "y": 300, "wires": [ [ "89484017d0956c14" ] ] }, { "id": "b29ba189327b6eff", "type": "change", "z": "086fd29526322b8c", "name": "Set API Token", "rules": [ { "t": "set", "p": "bearerToken", "pt": "msg", "to": "", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1160, "y": 300, "wires": [ [ "20deeb57a8500fa5" ] ] }, { "id": "70338f0a7c377091", "type": "change", "z": "086fd29526322b8c", "name": "Mapping product attributes", "rules": [ { "t": "set", "p": "code", "pt": "msg", "to": "payload.obj[\"operation.article\"]", "tot": "msg" }, { "t": "set", "p": "description", "pt": "msg", "to": "payload.obj[\"operation.article\"]", "tot": "msg" }, { "t": "set", "p": "color", "pt": "msg", "to": "red", "tot": "str" }, { "t": "set", "p": "production-unit", "pt": "msg", "to": "parts", "tot": "str" }, { "t": "set", "p": "cycle-time-mode", "pt": "msg", "to": "time_per_part", "tot": "str" }, { "t": "set", "p": "cycle-time-unit", "pt": "msg", "to": "seconds", "tot": "str" }, { "t": "set", "p": "target-speed", "pt": "msg", "to": "target-speed", "tot": "msg" }, { "t": "set", "p": "units-multiplier", "pt": "msg", "to": "1", "tot": "num" }, { "t": "set", "p": "units-divisor", "pt": "msg", "to": "1", "tot": "num" }, { "t": "set", "p": "info", "pt": "msg", "to": "", "tot": "str" }, { "t": "set", "p": "location", "pt": "msg", "to": "", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 920, "y": 300, "wires": [ [ "b29ba189327b6eff" ] ] }, { "id": "922a3dcbfd4210f3", "type": "comment", "z": "086fd29526322b8c", "name": "^^ set product attributes", "info": "Format your message to the data model of oee.ai\nThen map your message values to the predefined\nmessage values in the change node", "x": 910, "y": 340, "wires": [] }, { "id": "20deeb57a8500fa5", "type": "subflow:d644b32827ab5ff7", "z": "086fd29526322b8c", "name": "", "x": 1450, "y": 300, "wires": [ [] ] }, { "id": "89484017d0956c14", "type": "change", "z": "086fd29526322b8c", "name": "set settings", "rules": [ { "t": "set", "p": "baseUrl", "pt": "msg", "to": "", "tot": "str" }, { "t": "set", "p": "user", "pt": "msg", "to": "", "tot": "str" }, { "t": "set", "p": "password", "pt": "msg", "to": "", "tot": "str" }, { "t": "set", "p": "xAccessId", "pt": "msg", "to": "", "tot": "str" }, { "t": "set", "p": "languageKey", "pt": "msg", "to": "en", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 410, "y": 300, "wires": [ [ "82c5a3ed0338ddcd" ] ] }, { "id": "82c5a3ed0338ddcd", "type": "subflow:d75dd96899f2f8c0", "z": "086fd29526322b8c", "name": "Get Products from MIP", "x": 630, "y": 300, "wires": [ [ "70338f0a7c377091" ] ] }, { "id": "5061268859da56e2", "type": "comment", "z": "086fd29526322b8c", "name": "^^ configure settings", "info": "", "x": 440, "y": 340, "wires": [] } ]