smort

NR BC

Aug 20th, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 35.10 KB | None | 0 0
  1. [{"id":"18da0af2.e46eb5","type":"tab","label":"BC","disabled":false,"info":""},{"id":"a9f36525.0d4228","type":"function","z":"18da0af2.e46eb5","name":"parse","func":"node.status({fill:\"green\",shape:\"dot\",text:\"connected\"});\n\nvar inp = msg.payload\nvar s =[];\nvar u = [];\nvar r = [];\nvar d = [];\nvar out = {};\n\nconst numberSorter = (([a, b], [c, d]) => a - c || d - b);\n\nif (inp.indexOf('!') != -1 || inp.indexOf('?') != -1 || inp.indexOf('/') != -1 ) {\n inp = inp.split(/(?=[?!;/])/g)\n\n for (var i = 0; i < inp.length; i++) {\n if (inp[i].indexOf('!') != -1) {\n inp[i] = inp[i].slice(inp[i].indexOf('!')+1)\n u.push (inp[i])\n }\n if (inp[i].indexOf('?') != -1) {\n inp[i] = inp[i].slice(inp[i].indexOf('?')+1)\n s.push (inp[i])\n }\n if (inp[i].indexOf('/') != -1) {\n inp[i] = inp[i].slice(inp[i].indexOf('/')+1)\n r.push (inp[i]+\",\"+\"99\")\n d.push (inp[i])\n }\n } \n\n for (i = 0; i < u.length; i++) {\n u[i] = u[i].split(\",\").map(Number);\n }\n for (i = 0; i < r.length; i++) {\n r[i] = r[i].split(\",\").map(Number);\n \n }\n for (i = 0; i < s.length; i++) {\n s[i] = s[i].split(\",\").map(Number);\n }\nu.sort(numberSorter)\n if (u.length > 0 ) {\n node.send([{payload:u}, null])\n }\nr.sort(numberSorter)\n if (r.length > 0 ) {\n //for (i = 0; i < r.length; i++) {\n \n out = r\n node.send([{payload:out}, null])\n }\ns.sort(numberSorter)\nsetTimeout(reply, 200);\n\n} else {\n if (inp.indexOf('*') != -1) {\n out = \"*;\"\n node.send([null, {payload: out}])\n }\n}\n\nfunction reply() {\n for (i = 0; i < s.length; i++) {\n if (isNaN(flow.get(String(s[i]))) === false) {\n s[i] = \"?\" + s[i] + \"=\" + flow.get(String(s[i]))\n }\n else {\n s[i] = \"?\" + s[i]\n }\n }\n\n for ( i = 0; i < u.length; i++) {\n u[i] = \"!\" + u[i]\n }\n for ( i = 0; i < d.length; i++) {\n d[i] = \"/\" + d[i]\n }\n\n u = u.join('')\n s = s.join('')\n out = s+u+d+\";\"\n node.send([null, {payload: out}])\n}\n\n\nmsg.topic = \"tick\"\nmsg.payload = Date.now()\nreturn [ msg, null];\n \n \n\n","outputs":2,"noerr":0,"x":190,"y":640,"wires":[["a471d0e1.f6fe2"],["c32d398f.f15b88"]]},{"id":"a471d0e1.f6fe2","type":"function","z":"18da0af2.e46eb5","name":"config","func":"\nvar u = msg.payload || []\nvar dcpins = flow.get(\"dcpins\") || []\nvar deadTime = 400; // number of milliseconds the valve (or whatever) takes to actuate, 30 seconds\nvar invert = false; \n\ndcpins = Array.from(new Set(dcpins))\ndcpins.sort(function(a, b){return a-b});\n\nfor (var i = 0; i < u.length; i++) {\n var config = u[i][1]\n var pin = u[i][0]\n \n if (config === 1) { //digital out\n flow.set(String(pin)+\"config\", config)\n msg.topic = pin\n msg.payload = u[i][2]\n node.send(msg);\n }\n\n if (config === 4) { //dutycycle\n flow.set(String(pin)+\"config\", config)\n flow.set(String(pin)+\"dcpower\", u[i][2]/100)\n flow.set(String(pin)+\"dctime\", u[i][3])\n dcpins.push(u[i][0]);\n }\n \n if (config === 5) { //hysteresis\n flow.set(String(pin)+\"config\", config)\n flow.set(String(u[i][2])+\"config\", config)\n flow.set(String(pin)+\"pin\", u[i][2])\n flow.set(String(pin)+\"setpoint\", u[i][3])\n flow.set(String(pin)+\"setpoint2\", u[i][4])\n flow.set(String(u[i][2])+\"pin\", pin)\n var cooling\n if (u[i][3] < u[i][4]) {\n cooling = true\n } else {\n cooling = false\n }\n flow.set(String(pin)+\"cooling\", cooling)\n flow.set(String(pin)+\"delay\", u[i][5]*1000)\n }\n\n if (config == 6 ) { //PID\n flow.set(String(pin)+\"config\", config)\n flow.set(String(u[i][2])+\"config\", config)\n flow.set(String(u[i][2])+\"pin\", pin)\n flow.set(String(pin)+\"pin\", u[i][2])\n flow.set(String(pin)+\"pid\", u[i][2])\n flow.set(String(pin)+\"setpoint\", u[i][3])\n flow.set(String(pin)+\"prop_band\", u[i][4] /100)\n flow.set(String(pin)+\"t_integral\", u[i][5] /100)\n flow.set(String(pin)+\"t_derivative\", u[i][6]/ 100)\n flow.set(String(pin)+\"direction\", u[i][7])\n flow.set(String(pin)+\"calctime\", u[i][8]*1000)\n flow.set(String(pin)+\"outtime\", u[i][9])\n flow.set(String(pin)+\"maxout\", u[i][11])\n msg.payload = [u[i][0],u[i][1],u[i][2],u[i][3],u[i][4],u[i][5],u[i][6],u[i][7],u[i][8],u[i][9],u[i][10],u[i][11]]//flow.get(String(u[i][2]))\n msg.topic = u[i][0]\n msg.enable = 1\n node.send(msg)\n }\n \n if (config === 7) { //pwm\n flow.set(String(pin)+\"config\", config)\n flow.set(String(pin), u[i][2])\n msg.topic = pin\n msg.payload = flow.get(String(pin))\n node.send(msg);\n }\n if (config === 8) { //analoginput\n flow.set(String(pin)+\"pollrate\", u[i][2])\n flow.set(String(pin)+\"awgweight\", u[i][3])\n msg.topic = pin\n msg.payload = [pin, 8, u[i][2], u[i][3]]\n node.send(msg);\n }\n if (config === 99) { //disabled\n previousconfig = flow.get(String(pin)+\"config\") || 0\n flow.set(String(pin)+\"config\", config)\n \n if (previousconfig === 1) {\n msg.topic = pin\n msg.payload = 0\n node.send(msg)\n }\n if (previousconfig === 4) {\n for (i = 0; i < flow.get(\"dcpins\").length; i++) {\n \n if (pin === dcpins[i]) {\n dcpins.splice([i], 1)\n flow.set(String(pin)+\"dcdisabled\", true)\n msg.topic = pin\n msg.payload = 0\n node.send(msg)\n }\n }\n flow.set(String(pin)+\"config\", 99)\n flow.set(String(pin)+\"dcpower\", 0)\n flow.set(String(pin)+\"dctime\", 0)\n }\n \n if (previousconfig === 5) { //hysteresis\n flow.set(String(pin)+\"config\", config)\n //flow.set(String(pin)+\"pin\", 0)\n flow.set(String(pin)+\"setpoint\", 0)\n flow.set(String(pin)+\"setpoint2\", 0)\n flow.set(String(pin)+\"ondelay\", 0)\n msg.topic = pin\n msg.payload = 0\n node.send(msg);\n }\n \n \n if (previousconfig === 6) {\n flow.set(String(pin)+\"config\", 99)\n flow.set(String(u[i][2])+\"config\", 0)\n flow.set(String(u[i][2])+\"pin\", 0)\n flow.set(String(pin)+\"pin\", 0)\n flow.set(String(pin)+\"pid\", 0)\n flow.set(String(pin)+\"setpoint\", 0)\n flow.set(String(pin)+\"prop_band\", 0)\n flow.set(String(pin)+\"t_integral\", 0)\n flow.set(String(pin)+\"t_derivative\",0)\n flow.set(String(pin)+\"direction\", 0)\n flow.set(String(pin)+\"calctime\", 0)\n flow.set(String(pin)+\"outtime\", 0)\n flow.set(String(pin)+\"maxout\", 0)\n msg.topic = pin\n msg.enable = 0\n msg.payload = [msg.payload[0][0], msg.payload[0][1]]\n node.send(msg)\n }\n if (previousconfig === 7) { //pwm\n flow.set(String(pin)+\"config\", 99)\n flow.set(String(pin), 0)\n msg.topic = pin\n msg.payload = flow.get(String(pin))\n node.send(msg);\n }\n if (previousconfig === 8) { //analoginput\n flow.set(String(pin)+\"pollrate\", 0)\n flow.set(String(pin)+\"awgweight\", 0)\n }\n }\n}\n\ndcpins = Array.from(new Set(dcpins))\ndcpins.sort(function(a, b){return a-b});\n\nif (dcpins !== flow.get(\"dcpins\")) {\n flow.set(\"dcpins\", dcpins)\n}\n\nif (msg.topic === \"tick\") {\n for (i = 0; i < dcpins.length; i++) {\n msg.topic = dcpins[i]\n var power = flow.get(String(dcpins[i])+\"dcpower\");\n var dctime = flow.get(String(dcpins[i])+\"dctime\");\n var inn = msg.payload\n // yes, payload is timestamp, calc current wave value between 0 and 1\n var wave = inn % dctime/dctime; // fraction of way through cycle\n var direction;\n // determine direction of travel and convert to triangular wave\n if (wave < 0.5) {\n direction = 1; // on the way up\n wave = wave*2;\n } else {\n direction = -1; // on the way down\n wave = (1 - wave)*2;\n }\n var requestedPower = power || 0;\n // if a dead_time has been supplied for this o/p then adjust power accordingly\n if (deadTime > 0 && requestedPower > 0.0 && requestedPower < 1.0) {\n var dtop = deadTime/dctime;\n power = (1.0-2.0*dtop)*requestedPower + dtop;\n } else {\n power = requestedPower;\n }\n // cope with end cases in case values outside 0..1\n var opState;\n if (power <= 0.0) {\n opState = 0; // no heat\n } else if (power >= 1.0) {\n opState = 1; // full heat\n } else {\n // only allow power to come on on the way down and off on the way up, to reduce short pulses\n if (power >= wave && direction === -1) {\n opState = 1;\n } else if (power <= wave && direction === 1) {\n opState = 0;\n } else {\n // otherwise leave it as it is\n opState = flow.get(String(dcpins[i])+'opState') || 0;\n } \n }\n flow.set(String(dcpins[i])+'opState', opState);\n \n var out = invert ? (1-opState) : opState;\n if ((out !== flow.get(String(dcpins[i])+\"previousout\")) || (flow.get(String(dcpins[i])+\"dcdisabled\") === true)) {\n flow.set(String(dcpins[i])+\"previousout\", out)\n flow.set(String(dcpins[i])+\"dcdisabled\", false)\n flow.set(String(dcpins[i]), out)\n msg.payload = out\n msg.topic = dcpins[i]\n node.send(msg)\n }\n}\n}\n\n \n\n\n\n\n\n","outputs":1,"noerr":0,"x":330,"y":640,"wires":[["e1522e7b.2b295"]]},{"id":"a086af5a.67b23","type":"tcp in","z":"18da0af2.e46eb5","name":"","server":"server","host":"","port":"5000","datamode":"stream","datatype":"utf8","newline":"","topic":"","base64":false,"x":60,"y":640,"wires":[["a9f36525.0d4228"]]},{"id":"c32d398f.f15b88","type":"tcp out","z":"18da0af2.e46eb5","host":"","port":"","beserver":"reply","base64":false,"end":false,"name":"","x":330,"y":700,"wires":[]},{"id":"7fe29439.12837c","type":"PID","z":"18da0af2.e46eb5","name":"","setpoint":21,"pb":"30","ti":9999,"td":0,"integral_default":0.5,"smooth_factor":3,"max_interval":600,"enable":1,"disabled_op":"1","x":1310,"y":60,"wires":[["5f0280aa.98b29","7e120ade.864524"]]},{"id":"4be7e5ef.04445c","type":"switch","z":"18da0af2.e46eb5","name":"out","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"str"},{"t":"eq","v":"2","vt":"str"},{"t":"eq","v":"3","vt":"str"},{"t":"eq","v":"4","vt":"str"},{"t":"eq","v":"5","vt":"str"},{"t":"eq","v":"6","vt":"str"},{"t":"eq","v":"7","vt":"str"},{"t":"eq","v":"8","vt":"str"},{"t":"eq","v":"9","vt":"str"},{"t":"eq","v":"10","vt":"str"},{"t":"eq","v":"11","vt":"str"},{"t":"eq","v":"12","vt":"str"},{"t":"eq","v":"13","vt":"str"},{"t":"eq","v":"14","vt":"str"},{"t":"eq","v":"15","vt":"str"},{"t":"eq","v":"16","vt":"str"},{"t":"eq","v":"17","vt":"str"},{"t":"eq","v":"18","vt":"str"}],"checkall":"true","repair":false,"outputs":18,"x":650,"y":700,"wires":[[],[],[],[],[],["eeeb43b8.0e502"],[],["ace64f1d.e04a3","389f1d1.d3839e2"],[],[],["d177d30b.f8372"],[],[],[],[],["c465b359.a091d","d9f1ec49.c1fc7"],["12464cb5.478483"],["1e6561a8.cd121e"]]},{"id":"cccd83f1.c502e","type":"function","z":"18da0af2.e46eb5","name":"heat/cool","func":"\n/* A function designed to be used with node-red-contrib-pid in applications where both\n * heating and cooling are available to control the system.\n * The node is given a power value in msg.payload in the range 0 to 1, such as is produced by \n * node-red-contrib-pid and splits this into a heat power (o/p 1) and cool power (o/p 2) where\n * each is in the range 0 to 1. These can then be fed directly into an output device, if this\n * is continuously variable, or they may be passed to node-red-contrib-timeprop nodes to generate\n * time proportioned on/off outputs.\n * There are two particular issues to be dealt with in a heat/cool application. Firstly is the fact\n * that the cooling device may be more or less powerful than the heating device. It is necessary\n * therefore to be able to adjust the gain of the system separately for heating and cooling. Secondly\n * is the highly non-linear response of some devices, notably refrigerant systems, that can have a\n * large effect initially, then this tails off. To compensate for this it is useful to have an \n * overlap range where both heat and cool are slightly on.\n *\n * To allow for these requirements two variables can be set below. The value of the power input value\n * where the heating starts to come on is determined by the variable heatMin. Above this value the\n * heating will rise till it is fully on with an input of 1.\n * The cooling is fully on when value of the power input is 0, and falls till the cooling is fully\n * off at an input of coolMin.\n *\n * If the heating and cooling systems are of similar power then set heatMin and coolMin both to 0.5\n * in which case input values of 0.5 to 1.0 will map to heating outputs of 0.0 to 1.0,\n * and 0.5 down to 0.0 will map to cooling 0.0 to 1.0.\n * If, for example, the cooling system is more powerful than heating then they can both be set\n * to something like 0.7 which increases the gain in the heating region and reduces it\n * in the cooling region, to compensate for the different powers in the heating/cooling systems.\n * If some overlap is desired (so that both heat and cool are on slightly near the crossover\n * point) then overlap the two settings so that, for example, heatMin might be 0.45 and coolMin\n * might be 0.55\n */\n\nflow.set(String(msg.topic), Math. round(msg.payload*100))\n \n// set these as described above\nvar heatMin = 0.5; // the value of input corresponding to 0 heat o/p\nvar coolMin = 0.5; // the value of input corresponding to 0 cool o/p\n \nvar power = msg.payload;\nvar heat = (power - heatMin)/(1 - heatMin);\n// limit to range 0 to 1\nheat = Math.min(Math.max(heat, 0), 1);\nvar cool = (coolMin - power) / coolMin;\n// limit to range 0 to 1\ncool = Math.min(Math.max(cool, 0), 1);\n\nmsg.payload = [{payload: heat}, {payload: cool}];\nreturn msg;\n","outputs":2,"noerr":0,"x":1700,"y":40,"wires":[[],[]]},{"id":"53ff05aa.56411c","type":"trigger","z":"18da0af2.e46eb5","op1":"","op2":"-12700","op1type":"nul","op2type":"num","duration":"1200","extend":true,"units":"s","reset":"","bytopic":"topic","name":"","x":730,"y":320,"wires":[["31ac962c.f2f56a","84f0fbb4.8ed4b8"]]},{"id":"88c59430.65f658","type":"mqtt in","z":"18da0af2.e46eb5","name":"Result","topic":"stat/+/RESULT","qos":"2","datatype":"json","broker":"c08dcb15.ad2048","x":50,"y":40,"wires":[["1b125b86.ad2a44"]]},{"id":"5133bd14.c14e94","type":"mqtt in","z":"18da0af2.e46eb5","name":"State","topic":"tele/+/STATE","qos":"2","datatype":"json","broker":"c08dcb15.ad2048","x":50,"y":100,"wires":[["1b125b86.ad2a44"]]},{"id":"1b125b86.ad2a44","type":"switch","z":"18da0af2.e46eb5","name":"topic","property":"topic","propertyType":"msg","rules":[{"t":"regex","v":"4ch","vt":"str","case":false},{"t":"regex","v":"steam","vt":"str","case":false},{"t":"regex","v":"freezer","vt":"str","case":false},{"t":"regex","v":"cooler","vt":"str","case":false},{"t":"regex","v":"S20","vt":"str","case":false}],"checkall":"true","repair":false,"outputs":5,"x":190,"y":60,"wires":[["705e7675.8f0d68"],["9d252fed.354a1"],["e6c90817.7d8518"],["38856687.9a73fa"],["ce194d50.0301e"]]},{"id":"705e7675.8f0d68","type":"change","z":"18da0af2.e46eb5","name":"4","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.POWER1","tot":"msg"},{"t":"change","p":"payload","pt":"msg","from":"ON","fromt":"str","to":"1","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"OFF","fromt":"str","to":"0","tot":"num"},{"t":"set","p":"topic","pt":"msg","to":"4","tot":"str"},{"t":"set","p":"4","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":20,"wires":[[]]},{"id":"9d252fed.354a1","type":"change","z":"18da0af2.e46eb5","name":"8","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.POWER","tot":"msg"},{"t":"change","p":"payload","pt":"msg","from":"ON","fromt":"str","to":"1","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"OFF","fromt":"str","to":"0","tot":"num"},{"t":"set","p":"topic","pt":"msg","to":"8","tot":"str"},{"t":"set","p":"8","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":60,"wires":[[]]},{"id":"e6c90817.7d8518","type":"change","z":"18da0af2.e46eb5","name":"11","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.POWER","tot":"msg"},{"t":"change","p":"payload","pt":"msg","from":"ON","fromt":"str","to":"1","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"OFF","fromt":"str","to":"0","tot":"num"},{"t":"set","p":"topic","pt":"msg","to":"11","tot":"str"},{"t":"set","p":"11","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":100,"wires":[[]]},{"id":"38856687.9a73fa","type":"change","z":"18da0af2.e46eb5","name":"16","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.POWER","tot":"msg"},{"t":"change","p":"payload","pt":"msg","from":"ON","fromt":"str","to":"1","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"OFF","fromt":"str","to":"0","tot":"num"},{"t":"set","p":"topic","pt":"msg","to":"16","tot":"str"},{"t":"set","p":"16","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":140,"wires":[[]]},{"id":"8baad8ac.420748","type":"change","z":"18da0af2.e46eb5","name":"17","rules":[{"t":"change","p":"payload","pt":"msg","from":"on","fromt":"str","to":"1","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"0","tot":"num"},{"t":"set","p":"topic","pt":"msg","to":"17","tot":"str"},{"t":"set","p":"17","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":240,"wires":[[]]},{"id":"2516bf2d.4d9aa","type":"mqtt in","z":"18da0af2.e46eb5","name":"Sensor","topic":"tele/+/SENSOR","qos":"2","datatype":"json","broker":"c08dcb15.ad2048","x":50,"y":320,"wires":[["fb45d2ab.f87f2","c37474d1.162d58","1863fab4.047f55"]]},{"id":"fb45d2ab.f87f2","type":"switch","z":"18da0af2.e46eb5","name":"topic","property":"topic","propertyType":"msg","rules":[{"t":"regex","v":"cooler","vt":"str","case":false},{"t":"regex","v":"freezer","vt":"str","case":false}],"checkall":"true","repair":false,"outputs":2,"x":230,"y":320,"wires":[["c11f663e.d7a9e8"],["f8216184.ff6eb"]]},{"id":"c11f663e.d7a9e8","type":"change","z":"18da0af2.e46eb5","name":"200","rules":[{"t":"set","p":"payload","pt":"msg","to":"$floor(msg.payload.DS18B20.Temperature*100)","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"200","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":280,"wires":[["53ff05aa.56411c","31ac962c.f2f56a"]]},{"id":"f8216184.ff6eb","type":"change","z":"18da0af2.e46eb5","name":"201","rules":[{"t":"set","p":"payload","pt":"msg","to":"$floor(msg.payload.DS18B20.Temperature*100)\t","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"201","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":320,"wires":[["53ff05aa.56411c","31ac962c.f2f56a"]]},{"id":"90f69d54.0015f","type":"change","z":"18da0af2.e46eb5","name":"202","rules":[{"t":"set","p":"payload","pt":"msg","to":"$number(payload)","tot":"jsonata"},{"t":"set","p":"payload","pt":"msg","to":"$floor(msg.payload*100)\t","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"202","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":360,"wires":[["53ff05aa.56411c","31ac962c.f2f56a","5e035027.14e49"]]},{"id":"c465b359.a091d","type":"mqtt out","z":"18da0af2.e46eb5","name":"Cooler ctrl","topic":"cmnd/cooler/POWER","qos":"","retain":"","broker":"c08dcb15.ad2048","x":1070,"y":760,"wires":[]},{"id":"d177d30b.f8372","type":"mqtt out","z":"18da0af2.e46eb5","name":"Freezer ctrl","topic":"cmnd/freezer/POWER","qos":"","retain":"","broker":"c08dcb15.ad2048","x":1070,"y":700,"wires":[]},{"id":"f6c907c7.c01148","type":"mqtt out","z":"18da0af2.e46eb5","name":"Fridge ctrl","topic":"shellies/fridge/relay/0/command","qos":"","retain":"","broker":"c08dcb15.ad2048","x":1060,"y":820,"wires":[]},{"id":"31ac962c.f2f56a","type":"link out","z":"18da0af2.e46eb5","name":"","links":["3a55c9fb.262186"],"x":835,"y":280,"wires":[]},{"id":"3a55c9fb.262186","type":"link in","z":"18da0af2.e46eb5","name":"","links":["31ac962c.f2f56a","1a03dc0b.4ed044"],"x":235,"y":600,"wires":[["f41a7122.a5fb2"]]},{"id":"5f0280aa.98b29","type":"change","z":"18da0af2.e46eb5","name":"100 -> 1","rules":[{"t":"set","p":"topic","pt":"msg","to":"1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1500,"y":60,"wires":[[]]},{"id":"f41a7122.a5fb2","type":"function","z":"18da0af2.e46eb5","name":"input","func":"if (typeof(msg.payload) !== \"undefined\") {\n\n var pin = msg.topic;\n var value = msg.payload;\n flow.set(pin,value)\n\n if (flow.get(String(pin)+\"config\") === 5 && pin >= 100 ){ //hysteresis\n var outpin = flow.get(String(pin)+\"pin\") || 0\n var setpoint = flow.get(String(outpin)+\"setpoint\") || 0\n var setpoint2 = flow.get(String(outpin)+\"setpoint2\") || 0\n var config = flow.get(String(outpin)+\"config\") || 99\n var cooling = flow.get(String(outpin)+\"cooling\") || false\n var delay = flow.get(String(outpin)+\"delay\")\n var out = flow.get(String(outpin)+\"out\")\n \n \n if (value < setpoint) {\n if (cooling === true) {\n out = false\n } else {\n out = true\n }\n }\n if (value > setpoint2) {\n if (cooling === true) {\n out = true\n } else {\n out = false\n }\n }\n \n if (value === -12700) {\n out = false\n }\n \n if (config == 99) {\n out = false\n }\n if (out !== flow.get(String(outpin)+\"out\")) {\n flow.set(String(outpin)+\"out\", out)\n if (out === false) {\n context.set(String(outpin)+\"status\", Number(out))\n msg.topic = outpin\n msg.payload = Number(flow.get(String(outpin)+\"out\"))\n node.send(msg);\n }\n \n if (out === true && config !== 99 && value !== -12700) {\n setTimeout(start, delay)\n }\n }\n setTimeout(mismatch, 2000)\n}\n//PID\n if (flow.get(String(pin)+\"config\") === 6) {\n outpin = flow.get(String(pin)+\"pin\") || 0\n //var config = flow.get(String(outpin)+\"config\") || 99\n var pidsetpoint = flow.get(String(outpin)+\"setpoint\");\n var prop_band = flow.get(String(outpin)+\"prop_band\");\n var t_integral = flow.get(String(outpin)+\"t_integral\");\n var t_derivative = flow.get(String(outpin)+\"t_derivative\");\n \n if (flow.get(String(outpin)+\"config\") === 99 || flow.get(String(pin)) === -12700) {\n msg.topic = pin\n var maxout = flow.get(String(pin)+\"maxout\");\n flow.set(String(pin)+\"oldmaxout\", maxout)\n flow.set(String(pin)+\"maxout\", 0)\n msg.enable = 0\n msg.disabled_op = 0\n node.send(msg)\n }\n \n else {\n var oldmaxout = flow.get(String(pin)+\"oldmaxout\");\n flow.set(String(pin)+\"maxout\", oldmaxout)\n msg.enable = 1\n msg.topic = pin\n msg.payload = flow.get(String(pin))\n msg.setpoint = pidsetpoint\n msg.prop_band = prop_band\n msg.t_integral = t_integral\n msg.t_derivative = t_derivative\n node.send(msg)\n }\n }\n}\n\nfunction start() {\n if (config !== 99 && value !== -12700) {\n context.set(String(outpin)+\"status\", Number(flow.get(String(outpin)+\"out\")))\n msg.topic = outpin\n msg.payload = Number(flow.get(String(outpin)+\"out\"))\n node.send(msg);\n }\n \n}\n\nfunction mismatch() {\n if (context.get(String(outpin)+\"status\") !== flow.get(String(outpin)) ) {\n context.set(String(outpin)+\"status\", Number(flow.get(String(outpin)+\"out\")))\n if (Number(flow.get(String(outpin)+\"out\")) === 1 && config !== 99 && value !== -12700) {\n setTimeout(start, delay)\n }\n if (Number(flow.get(String(outpin)+\"out\")) === 0) {\n msg.payload = Number(flow.get(String(outpin)+\"out\"))\n msg.topic = outpin\n node.send(msg)\n }\n }\n}","outputs":1,"noerr":0,"x":330,"y":600,"wires":[["16a2dcbf.0502c3"]]},{"id":"c37474d1.162d58","type":"link out","z":"18da0af2.e46eb5","name":"influxDB","links":["ca76a16e.d0bff"],"x":135,"y":300,"wires":[]},{"id":"8c427a1a.d02038","type":"change","z":"18da0af2.e46eb5","name":"influxdb","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.DS18B20.Temperature","tot":"msg"},{"t":"set","p":"measurement","pt":"msg","to":"topic","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1300,"y":200,"wires":[["fee28f7d.fb67f"]]},{"id":"fee28f7d.fb67f","type":"delay","z":"18da0af2.e46eb5","name":"","pauseType":"queue","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":1470,"y":200,"wires":[["83d98be3.6eb648"]]},{"id":"83d98be3.6eb648","type":"influxdb out","z":"18da0af2.e46eb5","influxdb":"917d0136.e0f4a","name":"influxDB","measurement":"","precision":"","retentionPolicy":"","x":1640,"y":200,"wires":[]},{"id":"ca76a16e.d0bff","type":"link in","z":"18da0af2.e46eb5","name":"","links":["c37474d1.162d58"],"x":1215,"y":200,"wires":[["8c427a1a.d02038"]]},{"id":"16a2dcbf.0502c3","type":"link out","z":"18da0af2.e46eb5","name":"input","links":["bb9be299.1b3b5","b2cca1d0.57b45"],"x":415,"y":600,"wires":[]},{"id":"e1522e7b.2b295","type":"link out","z":"18da0af2.e46eb5","name":"config","links":["bb9be299.1b3b5"],"x":415,"y":640,"wires":[]},{"id":"bb9be299.1b3b5","type":"link in","z":"18da0af2.e46eb5","name":"outputs","links":["e1522e7b.2b295","16a2dcbf.0502c3","58d6778.cbf3088","b0b0d513.801868"],"x":575,"y":700,"wires":[["4be7e5ef.04445c"]]},{"id":"b2cca1d0.57b45","type":"link in","z":"18da0af2.e46eb5","name":"","links":["16a2dcbf.0502c3"],"x":1215,"y":60,"wires":[["7fe29439.12837c"]]},{"id":"f8290be3.046f48","type":"debug","z":"18da0af2.e46eb5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1690,"y":80,"wires":[]},{"id":"a6d03dd8.c495","type":"blynk-ws-out-notify","z":"18da0af2.e46eb5","name":"","client":"35dd12c9.26034e","queue":false,"rate":5,"x":1050,"y":360,"wires":[]},{"id":"84f0fbb4.8ed4b8","type":"function","z":"18da0af2.e46eb5","name":"offline alarm","func":"if (msg.payload == -12700) {\nswitch(msg.topic) {\n case \"200\":\n msg.topic = \"cooler\"\n break;\n case \"201\":\n msg.topic = \"freezer\"\n break;\n case \"202\":\n msg.topic = \"fridge\"\n break;\n case \"100\":\n msg.topic = \"HEXout\"\n break;\n default:\n msg.topic = \"something\"\n}\nmsg.payload = msg.topic + \" went offline\"\nreturn msg;\n}","outputs":1,"noerr":0,"x":910,"y":360,"wires":[["a6d03dd8.c495"]]},{"id":"ace64f1d.e04a3","type":"mqtt out","z":"18da0af2.e46eb5","name":"Steam","topic":"cmnd/steam/POWER","qos":"","retain":"","broker":"c08dcb15.ad2048","x":1050,"y":640,"wires":[]},{"id":"ee5ef18c.a2431","type":"mqtt out","z":"18da0af2.e46eb5","name":"HEXout","topic":"cmnd/HEXout/CONFIG","qos":"","retain":"","broker":"c08dcb15.ad2048","x":1060,"y":580,"wires":[]},{"id":"db4b3534.0c0a48","type":"mqtt in","z":"18da0af2.e46eb5","name":"HEXout","topic":"stat/HEXout/RESULT","qos":"2","datatype":"json","broker":"c08dcb15.ad2048","x":230,"y":400,"wires":[["a03833db.a1c3a"]]},{"id":"eeeb43b8.0e502","type":"function","z":"18da0af2.e46eb5","name":"arduinoPID","func":"\nvar pin = msg.topic\n\nif (Array.isArray(msg.payload) && msg.topic === pin) {\n if (msg.payload[1] == 6) {\n context.set(\"inpin\", msg.payload[2])\n setTimeout(sendconfig, 500);\n}\nif (msg.payload[1] == 99) {\n flow.set(String(pin)+\"maxout\", 0)\n setTimeout(sendconfig, 500);\n}\n}\n\nif (msg.payload.hasOwnProperty('temp')) {\n var inpin = context.get(\"inpin\")\n if (typeof (context.get(\"inpin\")) !== 'undefined') {\n flow.set(String(pin), msg.payload.out)\n flow.set(String(inpin), msg.payload.temp)\n }\n}\n\nif (msg.payload.hasOwnProperty('start')) {\n setTimeout(sendconfig, 1000);\n}\n\nif (msg.payload.hasOwnProperty('newtunings')) {\n\nif (msg.payload.newtunings === \"tuning\") {\n node.status({fill:\"yellow\",shape:\"dot\",text:\"tuning\"});\n} \nif (msg.payload.newtunings === \"canceled\") {\n node.status({fill:\"red\",shape:\"dot\",text:\"tuning canceled\"});\n}\n\nif (Array.isArray(msg.payload.newtunings)) {\n flow.set(String(6)+\"tunings\", msg.payload.newtunings)\n node.status({fill:\"blue\",text:String(msg.payload.newtunings)});\n}\n}\n\nif (msg.payload.hasOwnProperty('autotune')) {\n msg.payload.autotune = 1\n node.send(msg)\n}\n\nfunction sendconfig() {\n var out = {};\n inpin = context.get(\"inpin\")\n out.Sp = flow.get(String(pin)+\"setpoint\") //|| 0\n out.Tuning = [flow.get(String(pin)+\"prop_band\"), flow.get(String(pin)+\"t_integral\"), flow.get(String(pin)+\"t_derivative\")]\n out.direction = flow.get(String(pin)+\"direction\")\n out.calctime = flow.get(String(pin)+\"calctime\")\n out.maxoutput = flow.get(String(pin)+\"maxout\")\n out.pollrate = flow.get(String(inpin)+\"pollrate\")\n out.awgweight = flow.get(String(inpin)+\"awgweight\")\n msg.payload = out\n node.send(msg)\n}","outputs":1,"noerr":0,"x":870,"y":600,"wires":[["ee5ef18c.a2431","389f1d1.d3839e2"]]},{"id":"730f288d.eb7a98","type":"inject","z":"18da0af2.e46eb5","name":"Autotune","topic":"6","payload":"{\"autotune\":1}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":240,"y":460,"wires":[["a03833db.a1c3a"]]},{"id":"da656c8f.282d4","type":"change","z":"18da0af2.e46eb5","name":"Get tunings","rules":[{"t":"set","p":"payload","pt":"msg","to":"6tunings","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":850,"y":40,"wires":[["fd283dc6.9e74e"]]},{"id":"c40090db.11002","type":"inject","z":"18da0af2.e46eb5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":700,"y":40,"wires":[["da656c8f.282d4"]]},{"id":"fd283dc6.9e74e","type":"debug","z":"18da0af2.e46eb5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":1010,"y":40,"wires":[]},{"id":"b0b0d513.801868","type":"link out","z":"18da0af2.e46eb5","name":"","links":["bb9be299.1b3b5"],"x":555,"y":400,"wires":[]},{"id":"a03833db.a1c3a","type":"change","z":"18da0af2.e46eb5","name":"6","rules":[{"t":"set","p":"topic","pt":"msg","to":"6","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":400,"wires":[["b0b0d513.801868"]]},{"id":"5b53d898.5b1888","type":"mqtt in","z":"18da0af2.e46eb5","name":"fridge","topic":"shellies/fridge/relay/0","qos":"2","datatype":"auto","broker":"c08dcb15.ad2048","x":230,"y":240,"wires":[["8baad8ac.420748","c8e1c5b7.4b0068"]]},{"id":"1669ddda.ee2c82","type":"mqtt in","z":"18da0af2.e46eb5","name":"fridge","topic":"shellies/fridge/ext_temperature/0","qos":"2","datatype":"utf8","broker":"c08dcb15.ad2048","x":230,"y":360,"wires":[["90f69d54.0015f","5e035027.14e49"]]},{"id":"5e035027.14e49","type":"debug","z":"18da0af2.e46eb5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":690,"y":440,"wires":[]},{"id":"12464cb5.478483","type":"change","z":"18da0af2.e46eb5","name":"17","rules":[{"t":"change","p":"payload","pt":"msg","from":"1","fromt":"num","to":"on","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"0","fromt":"num","to":"off","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":830,"y":800,"wires":[["d9f1ec49.c1fc7"]]},{"id":"389f1d1.d3839e2","type":"debug","z":"18da0af2.e46eb5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":940,"y":520,"wires":[]},{"id":"ce194d50.0301e","type":"change","z":"18da0af2.e46eb5","name":"18","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.POWER","tot":"msg"},{"t":"change","p":"payload","pt":"msg","from":"ON","fromt":"str","to":"1","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"OFF","fromt":"str","to":"0","tot":"num"},{"t":"set","p":"topic","pt":"msg","to":"18","tot":"str"},{"t":"set","p":"18","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":180,"wires":[[]]},{"id":"1e6561a8.cd121e","type":"mqtt out","z":"18da0af2.e46eb5","name":"S20 ctrl","topic":"cmnd/S20/POWER","qos":"","retain":"","broker":"c08dcb15.ad2048","x":1060,"y":880,"wires":[]},{"id":"4f8ebde0.5e3e84","type":"inject","z":"18da0af2.e46eb5","name":"","topic":"","payload":"start","payloadType":"str","repeat":"","crontab":"","once":true,"onceDelay":"3","x":230,"y":280,"wires":[["f8216184.ff6eb","c11f663e.d7a9e8"]]},{"id":"c8e1c5b7.4b0068","type":"debug","z":"18da0af2.e46eb5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":610,"y":200,"wires":[]},{"id":"d9f1ec49.c1fc7","type":"debug","z":"18da0af2.e46eb5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":970,"y":940,"wires":[]},{"id":"7e120ade.864524","type":"debug","z":"18da0af2.e46eb5","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":1460,"y":140,"wires":[]},{"id":"1863fab4.047f55","type":"debug","z":"18da0af2.e46eb5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":100,"y":400,"wires":[]},{"id":"c08dcb15.ad2048","type":"mqtt-broker","z":"","name":"","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"917d0136.e0f4a","type":"influxdb","z":"","hostname":"192.168.88.30","port":"8086","protocol":"http","database":"brewery","name":"","usetls":false,"tls":""},{"id":"35dd12c9.26034e","type":"blynk-ws-client","z":"","name":"Roomtemp","path":"ws://blynk-cloud.com/websockets","key":"d-6jb2u_ohwit0qU0PxxwN0npAYwa0KT","dbg_all":false,"dbg_read":false,"dbg_write":false,"dbg_notify":false,"dbg_mail":false,"dbg_prop":false,"dbg_sync":false,"dbg_bridge":false,"dbg_low":false,"dbg_pins":"","multi_cmd":false,"proxy_type":"no","proxy_url":"","enabled":true}]
Add Comment
Please, Sign In to add comment