Code: Select all
[{"id":"17010ea5.44ab11","type":"tab","label":"mqtt traductor salva","disabled":false,"info":""},{"id":"2f099dcf.665432","type":"comment","z":"17010ea5.44ab11","name":"Version: v.1.0.0","info":"","x":200,"y":140,"wires":[]},{"id":"e3fd556.de12ba8","type":"comment","z":"17010ea5.44ab11","name":"ABOUT","info":"This software originate from https://github.com/kungknut/Domoticz-MQTT-Translator\n\nIf you find a bug or want to contribute to make this software better? Feel \nfree to open an issue or a pull request.","x":170,"y":180,"wires":[]},{"id":"de6a25fe.da91c8","type":"mqtt out","z":"17010ea5.44ab11","name":"To 3rd party","topic":"","qos":"","retain":"","broker":"8bc033be.f9277","x":730,"y":480,"wires":[]},{"id":"4f21a53f.99596c","type":"mqtt in","z":"17010ea5.44ab11","name":"From 3rd party","topic":"#","qos":"0","broker":"8bc033be.f9277","x":200,"y":420,"wires":[["813bffcb.6c1a1"]]},{"id":"cc5613c.108d2f","type":"http request","z":"17010ea5.44ab11","name":"To Domoticz","method":"GET","ret":"txt","url":"","tls":"","x":730,"y":420,"wires":[[]]},{"id":"5e1ae03c.9df0b","type":"mqtt in","z":"17010ea5.44ab11","name":"From Domoticz","topic":"domoticz/out","qos":"0","broker":"8bc033be.f9277","x":200,"y":480,"wires":[["3a5786d1.d605ca"]]},{"id":"3a5786d1.d605ca","type":"function","z":"17010ea5.44ab11","name":"Format MQTT","func":"var domoticzServer = \"http://localhost\";\nvar userVarValues = flow.get(\"userVarValues\");\n\n// Find what row in the userVarValues array that hold the settings for the reporting device\nvar mqttPayload = JSON.parse(msg.payload);\nvar arrI = null;\nfor (var i = 0; i < userVarValues.length; i++){\n if(mqttPayload.idx == userVarValues[i].devIdx){\n arrI = i;\n }\n}\n\n// If no match is found, exit this function and return null\nif(arrI !== null){\n // Find out which type of device that submitted the value\n var userVar = userVarValues[arrI];\n if(typeof userVar.slope === 'undefined') userVar.slope = 1;\n if(typeof userVar.intercept === 'undefined') userVar.intercept = 0;\n if(userVar.type != \"switch\") var aval = (mqttPayload.svalue1 - userVar.intercept) / userVar.slope;\n \n switch(userVar.type) {\n case \"dimmer\":\n // DIMMER 0-100%\n msg.topic = userVar.outTopic;\n msg.payload = aval;\n switch(mqttPayload.nvalue) {\n case 0:\n msg.payload = 0;\n break;\n case 1:\n msg.payload = context.get(userVar.outTopic)||50;\n break;\n case 2:\n context.set(userVar.outTopic, aval);\n break;\n }\n break;\n case \"switch\":\n // SWITCH ON/OFF\n // OBS - Domoticz is case sensitive\n msg.topic = userVar.outTopic;\n if(mqttPayload.nvalue == \"1\"){\n msg.payload = \"ON\";\n } else if (mqttPayload.nvalue == \"0\"){\n msg.payload = \"OFF\";\n }\n break;\n case \"shutter\":\n // SHUTTER 0-100%\n msg.topic = userVar.outTopic;\n msg.payload = aval;\n switch(mqttPayload.nvalue) {\n case 0:\n msg.payload = 0;\n break;\n case 1:\n msg.payload = 100;\n break;\n case 2:\n context.set(userVar.outTopic, aval);\n break;\n }\n break;\n case \"svalue1\":\n // Thermostat setpoint\n msg.topic = userVar.outTopic;\n msg.payload = aval;\n break;\n default:\n msg.topic = null;\n }\n}else {\n msg.topic = null;\n}\n\nif(msg.topic !== null){\n return msg;\n}","outputs":1,"noerr":0,"x":380,"y":480,"wires":[["cf7bf70d.710d38"]]},{"id":"813bffcb.6c1a1","type":"function","z":"17010ea5.44ab11","name":"Convert to url","func":"var domoticzServer = \"http://localhost:8080\";\nvar userVarValues = flow.get(\"userVarValues\");\n\n// Find what row in the userVarValues array that hold the settings for the reporting device\nvar arrI = null;\nfor (var i = 0; i < userVarValues.length; i++){\n if(msg.topic == userVarValues[i].inTopic){\n arrI = i;\n }\n}\n\n// If no match is found, exit this function and return null\nif(arrI !== null){\n // Find out which type of device that submitted the value\n var userVar = userVarValues[arrI];\n if(typeof userVar.limits === 'undefined') userVar.limits = \"0,0\";\n if(typeof userVar.slope === 'undefined') userVar.slope = 1;\n if(typeof userVar.intercept === 'undefined') userVar.intercept = 0;\n if(userVar.type != \"switch\") var aval = (msg.payload * userVar.slope) + userVar.intercept;\n \n switch(userVar.type) {\n case \"svalue\": // Temperature, Percent, Pressure, Voltage, Text, Distance\n case \"svalue1\": // Thermostat setpoint\n msg.url = domoticzServer + \"/json.htm?type=command¶m=udevice&idx=\" + userVar.devIdx + \"&nvalue=0&svalue=\" + aval;\n break;\n case \"shutter_old\": // Thermostat setpoint\n msg.url = domoticzServer + \"/json.htm?type=command¶m=udevice&idx=\" + userVar.devIdx + \"&nvalue=2&svalue=\" + aval;\n break;\n case \"humidity\":\n // Humidity level\n var humStat = 0; // 0 = Normal, 1 = Comfortable, 2 = Dry, 3 = Wet\n var lims = userVar.limits.split(\";\");\n var limits = [];\n for (var i = 0; i < lims.length; i++){\n var obj = lims[i].split(\",\");\n if(aval >= obj[1]) humStat = obj[0];\n }\n msg.url = domoticzServer + \"/json.htm?type=command¶m=udevice&idx=\" + userVar.devIdx + \"&nvalue=\" + aval + \"&svalue=\" + humStat;\n break;\n case \"switch\":\n // Binary switch (ON/OFF)\n // Domoticz is case sensitive\n if(msg.payload == \"ON\" || msg.payload == \"OFF\"){\n msg.payload = msg.payload.toLowerCase();\n msg.payload = msg.payload.charAt(0).toUpperCase() + msg.payload.slice(1);\n msg.url = domoticzServer + \"/json.htm?type=command¶m=switchlight&idx=\" + userVar.devIdx + \"&switchcmd=\" + msg.payload;\n }\n break;\n case \"dimmer\":\n // Dimmer 0-100%\n var level = parseInt(aval) + 1; // Bug in Domoticz require the \"in\" message to be 1 higher than actual value.\n msg.url = domoticzServer + \"/json.htm?type=command¶m=switchlight&idx=\" + userVar.devIdx + \"&switchcmd=Set%20Level&level=\" + level;\n if(msg.payload == \"0\"){\n msg.url = domoticzServer + \"/json.htm?type=command¶m=switchlight&idx=\" + userVar.devIdx + \"&switchcmd=Off\";\n }\n break;\n case \"shutter\":\n // Shutter 0-100%\n var level = parseInt(aval); // Bug in Domoticz require the \"in\" message to be 1 higher than actual value.\n msg.url = domoticzServer + \"/json.htm?type=command¶m=switchlight&idx=\" + userVar.devIdx + \"&switchcmd=Set%20Level&level=\" + level;\n if(msg.payload == \"0\"){\n msg.url = domoticzServer + \"/json.htm?type=command¶m=switchlight&idx=\" + userVar.devIdx + \"&switchcmd=Off\";\n }\n break;\n default:\n msg.url = null;\n break;\n }\n} else {\n msg.url = null;\n}\n\nif(msg.url !== null){\n return msg;\n}","outputs":1,"noerr":0,"x":380,"y":420,"wires":[["f1960ba6.853bb8"]]},{"id":"65eafdbd.a7c764","type":"comment","z":"17010ea5.44ab11","name":"GET USER VARIABLES FROM DOMOTICZ","info":"","x":290,"y":240,"wires":[]},{"id":"e412dc01.a3452","type":"comment","z":"17010ea5.44ab11","name":"TRANSLATION FUNCTIONS","info":"","x":240,"y":380,"wires":[]},{"id":"5167d1a1.edf9e","type":"http request","z":"17010ea5.44ab11","name":"Read user variables","method":"GET","ret":"txt","url":"http://localhost:8080/json.htm?type=command¶m=getuservariables","tls":"","x":380,"y":320,"wires":[["537a1ec2.9b5ba"]]},{"id":"537a1ec2.9b5ba","type":"function","z":"17010ea5.44ab11","name":"Cache to flow context","func":"msg.payload = JSON.parse(msg.payload);\nvar userVarRes = msg.payload.result,\n userVarValues = [],\n hueStats = {};\n\n\nfor (var i = 0; i < userVarRes.length; i++){\n var obj = userVarRes[i];\n for (var key in obj){\n if(key == \"Value\"){\n var val = JSON.parse(obj[key]);\n if(val.MQTT !== undefined) {\n userVarValues.push(val.MQTT);\n }\n }\n }\n}\n\nflow.set(\"userVarValues\", userVarValues);\n\n//msg.payload = flow.get(\"userVarValues\");\n//return msg;","outputs":1,"noerr":0,"x":600,"y":320,"wires":[[]]},{"id":"9ae0eedd.09a41","type":"mqtt in","z":"17010ea5.44ab11","name":"trigger","topic":"nodered/update-uservar","qos":"2","broker":"8bc033be.f9277","x":170,"y":320,"wires":[["5167d1a1.edf9e"]]},{"id":"b84d9ce3.f5c28","type":"inject","z":"17010ea5.44ab11","name":"trigger","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":170,"y":280,"wires":[["5167d1a1.edf9e"]]},{"id":"f1960ba6.853bb8","type":"delay","z":"17010ea5.44ab11","name":"rateLim 2msg/s","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"2","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":560,"y":420,"wires":[["cc5613c.108d2f"]]},{"id":"cf7bf70d.710d38","type":"delay","z":"17010ea5.44ab11","name":"rateLim 1msg/s","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":560,"y":480,"wires":[["de6a25fe.da91c8"]]},{"id":"8bc033be.f9277","type":"mqtt-broker","z":"17010ea5.44ab11","broker":"localhost","port":"1883","clientid":"MQTTTRANSLATORNODEREDMQTTCLIENT","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","willTopic":"","willQos":"0","willPayload":""}]