MQTT to HDL BusPro (SmartBus) Gateway

A flow for converting HDL BusPro messages to MQTT. Made for Home Assistant but should work with any software that supports MQTT.

Currently supports: Relays, Dimmers, Universal Switches, Sensors (Lux, Temperature and Humidity), Temprature Sensors, Floorheat Thermostat on DLP, Floorheat Thermostat on Heatingmodule MFH06 and Air Conditioner.

Needs Palette "node-red-contrib-hdlbus" to work.

Check out https://community.home-assistant.io/t/hdl-smartbus-via-nodered-and-mqtt/338974 for examples on how to integrate with HA.

[{"id":"d409d0a29f7f44cf","type":"tab","label":"MQTT - HDL","disabled":false,"info":"","env":[]},{"id":"f7688362d4a6624e","type":"function","z":"d409d0a29f7f44cf","name":"Dimmer or Relay Answer","func":"if (msg.payload.success == true) \n {\n    msg.topic = \"hdl/sc/\" + msg.sender + \"/\" + msg.payload.channel;\n    return msg;\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":100,"wires":[["c60be061e5ba0eac"]]},{"id":"90916b69f59f3b88","type":"function","z":"d409d0a29f7f44cf","name":"Dimmer or Relay Read","func":"var outputMsgs = [];\nif (msg.code == 52) {\n    for (i = 0; i < msg.payload.channels.length; i++) {\n          outputMsgs.push({\n          topic:\"hdl/sc/\" + msg.sender + \"/\" + msg.payload.channels[i].number,\n          payload:{\n              level:msg.payload.channels[i].level\n              \n          }\n      });\n    }\n    return [ outputMsgs ];\n}\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":140,"wires":[["c60be061e5ba0eac"]]},{"id":"e6e91e6c6531d2e7","type":"mqtt out","z":"d409d0a29f7f44cf","name":"Status updates to MQTT","topic":"","qos":"0","retain":"true","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"","x":1090,"y":480,"wires":[]},{"id":"c60be061e5ba0eac","type":"range","z":"d409d0a29f7f44cf","minin":"0","maxin":"100","minout":"0","maxout":"255","action":"scale","round":true,"property":"payload.level","name":"","x":730,"y":100,"wires":[["e6e91e6c6531d2e7"]]},{"id":"7aed38565deb1c0c","type":"function","z":"d409d0a29f7f44cf","name":"Sensor Status Broadcasts","func":"var outputMsgs = [];\nif (msg.code == 5703) \n{\n    {\n        outputMsgs.push\n        ({\n          topic:\"hdl/temp/\" + msg.sender + \"/1\",\n          payload : msg.payload.temperature\n        });\n\n        outputMsgs.push\n        ({\n          topic:\"hdl/lux/\" + msg.sender + \"/lux\",\n           payload : msg.payload.brightness\n        });\n    }\n    return [ outputMsgs ];\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":380,"wires":[["e6e91e6c6531d2e7"]]},{"id":"bc29607c9c88a3a2","type":"hdl-raw-in","z":"d409d0a29f7f44cf","controller":"","name":"From HDL","x":100,"y":480,"wires":[["cf22a85c315dec13"]]},{"id":"f4b85abf981827f6","type":"comment","z":"d409d0a29f7f44cf","name":"Feedback from HDL to MQTT","info":"","x":160,"y":40,"wires":[]},{"id":"102349dc9bae18da","type":"comment","z":"d409d0a29f7f44cf","name":"Single Channel Status","info":"","x":500,"y":60,"wires":[]},{"id":"34ac95eea1ee0cae","type":"comment","z":"d409d0a29f7f44cf","name":"Sensor Status Broadcasts Lux and Temp","info":"","x":560,"y":340,"wires":[]},{"id":"49f79449d95f025a","type":"mqtt in","z":"d409d0a29f7f44cf","name":"From MQTT","topic":"hdl/+/+/+/set","qos":"0","datatype":"auto","broker":"","nl":false,"rap":false,"inputs":0,"x":110,"y":1360,"wires":[["9b2e5f67d92eb556"]]},{"id":"565bad86310d0418","type":"json","z":"d409d0a29f7f44cf","name":"","property":"payload","action":"obj","pretty":true,"x":470,"y":1180,"wires":[["54c54c0e99f07499"]]},{"id":"54c54c0e99f07499","type":"range","z":"d409d0a29f7f44cf","minin":"0","maxin":"255","minout":"0","maxout":"100","action":"scale","round":true,"property":"payload.level","name":"","x":590,"y":1180,"wires":[["12f503b35aeff61c"]]},{"id":"12f503b35aeff61c","type":"function","z":"d409d0a29f7f44cf","name":"Light or Relay","func":"msg.code = 49;\n\nmsg.target = msg.topic.split(\"/\")[2];\nvar time = msg.payload.time;\nvar level = Math.min(Math.max(parseInt(msg.payload.level), 0), 100);\n\nmsg.payload = {\n    channel: msg.topic.split(\"/\")[3],\n    time: time,\n    level: level,\n};\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":760,"y":1180,"wires":[["fef4ca11f287479d"]]},{"id":"48b0310ebeba4ba1","type":"comment","z":"d409d0a29f7f44cf","name":"Commands from MQTT to HDL","info":"","x":170,"y":1100,"wires":[]},{"id":"9b2e5f67d92eb556","type":"switch","z":"d409d0a29f7f44cf","name":"","property":"topic","propertyType":"msg","rules":[{"t":"cont","v":"hdl/sc/","vt":"str"},{"t":"cont","v":"hdl/us/","vt":"str"},{"t":"cont","v":"hdl/fh/","vt":"str"},{"t":"cont","v":"hdl/hm/","vt":"str"},{"t":"cont","v":"hdl/ac/","vt":"str"}],"checkall":"true","repair":false,"outputs":5,"x":250,"y":1360,"wires":[["565bad86310d0418"],["b1b2f5578daf9921"],["b989c322da784388"],["5221b9e27190eefb"],["0277c060ae28fde2"]]},{"id":"94828825b61a85a1","type":"function","z":"d409d0a29f7f44cf","name":"Universal Switch Answer","func":"msg.topic = \"hdl/us/\" + msg.sender + \"/\" + msg.payload.switch;\nvar status = msg.payload.status\nif (status === true) \n    {\n    msg.payload = \"ON\";\n    } \n    else \n    {\n    msg.payload = \"OFF\";\n    }\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":240,"wires":[["e6e91e6c6531d2e7"]]},{"id":"a472cec6ba103b35","type":"comment","z":"d409d0a29f7f44cf","name":"Universal Switch","info":"","x":480,"y":200,"wires":[]},{"id":"b1b2f5578daf9921","type":"function","z":"d409d0a29f7f44cf","name":"Universal Switch","func":"var usswitch = msg.topic.split(\"/\")[3];\nvar command = msg.payload;\nif (command === \"ON\") \n    {\n    hdlcommand = true;\n    } \n    else \n    {\n    hdlcommand = false;\n    }\nmsg.code = 57372;\nmsg.target = msg.topic.split(\"/\")[2];\nmsg.payload = {\n    switch: usswitch,\n    status: hdlcommand,\n};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":740,"y":1280,"wires":[["fef4ca11f287479d"]],"info":"msg.topic = \"hdl/us/\" + msg.sender + \"/\" + msg.payload.switch;\nvar status = msg.payload.status\nif (status === true) \n    {\n    msg.payload = \"ON\";\n    } \n    else \n    {\n    msg.payload = \"OFF\";\n    }\nreturn msg;"},{"id":"cf22a85c315dec13","type":"switch","z":"d409d0a29f7f44cf","name":"","property":"code","propertyType":"msg","rules":[{"t":"eq","v":"50","vt":"str"},{"t":"eq","v":"52","vt":"str"},{"t":"eq","v":"57373","vt":"str"},{"t":"eq","v":"57369","vt":"str"},{"t":"eq","v":"5703","vt":"str"},{"t":"eq","v":"5637","vt":"str"},{"t":"eq","v":"58341","vt":"str"},{"t":"eq","v":"6471","vt":"str"},{"t":"eq","v":"6469","vt":"str"},{"t":"eq","v":"7263","vt":"str"},{"t":"eq","v":"7261","vt":"str"},{"t":"eq","v":"6457","vt":"str"},{"t":"eq","v":"6459","vt":"str"}],"checkall":"false","repair":false,"outputs":13,"x":230,"y":480,"wires":[["f7688362d4a6624e"],["90916b69f59f3b88"],["94828825b61a85a1"],["73fc642b8eb78a77"],["7aed38565deb1c0c"],["b99092c085925c66"],["367301f3fb7d3dae"],["ca3dc95602747d75","723cad02ff85aa77"],["723cad02ff85aa77","ca3dc95602747d75"],["d4c7e2802d3aab8a","945e3545774a5281"],["945e3545774a5281","d4c7e2802d3aab8a"],["05c09355d256695e","0ba22a37d6db866e"],["0ba22a37d6db866e","05c09355d256695e"]]},{"id":"b4977c49ff365c0e","type":"comment","z":"d409d0a29f7f44cf","name":"Temprature Sensors","info":"","x":490,"y":540,"wires":[]},{"id":"367301f3fb7d3dae","type":"function","z":"d409d0a29f7f44cf","name":"Temprature Broadcasts","func":"msg.topic = \"hdl/temp/\" + msg.sender + \"/\" + msg.payload.channel;\nvar temp = msg.payload.temperature\nmsg.payload = temp\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":580,"wires":[["e6e91e6c6531d2e7"]]},{"id":"73fc642b8eb78a77","type":"function","z":"d409d0a29f7f44cf","name":"Universal Switch Read","func":"msg.topic = \"hdl/us/\" + msg.sender + \"/\" + msg.payload.switch;\nvar status = msg.payload.status\nif (status === true) \n    {\n    msg.payload = \"ON\";\n    } \n    else \n    {\n    msg.payload = \"OFF\";\n    }\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":280,"wires":[["e6e91e6c6531d2e7"]]},{"id":"c20fcfd152705dca","type":"comment","z":"d409d0a29f7f44cf","name":"AC / Heatpump","info":"","x":480,"y":920,"wires":[]},{"id":"c27be99c4d110263","type":"comment","z":"d409d0a29f7f44cf","name":"Floorheat Thermostat DLP","info":"","x":510,"y":640,"wires":[]},{"id":"05c09355d256695e","type":"function","z":"d409d0a29f7f44cf","name":"Air condition Unit Command from DLP    ","func":"//Insert MQTT Topic\nmsg.topic = \"hdl/ac/\" + msg.sender + \"/0\" + msg.payload.acno;\n\n//Mode - Change nr to Mode and set current set temprature\nvar amode= msg.payload.setupmode \nif (amode === 0){var Mode = \"cool\"; var Thismodetempset = msg.payload.temperature.cooling}\nif (amode === 1){var Mode = \"heat\"; var Thismodetempset = msg.payload.temperature.heating}\nif (amode === 2){var Mode = \"fan_only\"}\nif (amode === 3){var Mode = \"auto\"; var Thismodetempset = msg.payload.temperature.auto}\nif (amode === 4){var Mode = \"dry\"; var Thismodetempset = msg.payload.temperature.dry}\nmsg.payload.currentmode = Thismodetempset\n\n//Power - Change true to ON and mode to off if off\nvar power = msg.payload.acstatus;\nif (power === false){newpower = \"OFF\"; var Mode = \"off\"}\nmsg.payload.setupmode= Mode\n\n//Change nr to fanspeed\nvar aspeed= msg.payload.setupspeed \nif (aspeed === 0){var Speed = \"auto\"}\nif (aspeed === 1){var Speed = \"high\"}\nif (aspeed === 2){var Speed = \"medium\"}\nif (aspeed === 3){var Speed = \"low\"}\nmsg.payload.setupspeed= Speed\n\n//Change nr to sweep state\nvar sweep = msg.payload.sweep;\nif (sweep === 0){newsweep = \"OFF\"}\nif (sweep === 1){newsweep = \"ON\"}\nmsg.payload.sweep = newsweep\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":1000,"wires":[["e6e91e6c6531d2e7"]]},{"id":"3f50d0f2fdbe5db9","type":"switch","z":"d409d0a29f7f44cf","name":"","property":"topic","propertyType":"msg","rules":[{"t":"cont","v":"/mode/set","vt":"str"},{"t":"cont","v":"/temperature/set","vt":"str"},{"t":"cont","v":"/fan/set","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":530,"y":1820,"wires":[["aebb0c75dd969fca"],["f464921b1f442181"],["6b93b8e98eac4a13"]]},{"id":"ca3dc95602747d75","type":"function","z":"d409d0a29f7f44cf","name":"Floorheat Update/Answer from DLP","func":"//Insert MQTT Topic\nmsg.topic = \"hdl/fh/\" + msg.sender + \"/01\";\n\n//Power Change true/false to ON/OFF\nvar power = msg.payload.status;\nif (power === true){newpower = \"heat\"}\nif (power === false){newpower = \"off\"}\nmsg.payload.status = newpower\n\n//Mode Change from nr to mode 1:Normal 2:Day 3:Night 4:Away 5:Timer. And add current temprature\nvar fhmode= msg.payload.mode \nif (fhmode === 1){var textmode = \"Normal\"; var tempnow = msg.payload.temperature.normal}\nif (fhmode === 2){var textmode = \"Day\"; var tempnow = msg.payload.temperature.day}\nif (fhmode === 3){var textmode = \"Night\"; var tempnow = msg.payload.temperature.night}\nif (fhmode === 4){var textmode = \"Away\"; var tempnow = msg.payload.temperature.away}\nif (fhmode === 5){var textmode = \"Timer\"}\nmsg.payload.textmode= textmode\nmsg.payload.temperature.now = tempnow\n\n//Awaymode\n//if (textmode ==\"Away\"){msg.payload.awaymode = \"On\"}\n//    else{msg.payload.awaymode = \"Off\"}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":560,"y":720,"wires":[["e6e91e6c6531d2e7"]]},{"id":"13cfc0ee1b828507","type":"switch","z":"d409d0a29f7f44cf","name":"","property":"topic","propertyType":"msg","rules":[{"t":"cont","v":"/mode/set","vt":"str"},{"t":"cont","v":"/textmode/set","vt":"str"},{"t":"cont","v":"/temperature/set","vt":"str"}],"checkall":"false","repair":false,"outputs":3,"x":570,"y":1420,"wires":[["234f971b363daf21"],["5d0d05ffb3b48f8f"],["1b3bfb4f62154808"]]},{"id":"723cad02ff85aa77","type":"function","z":"d409d0a29f7f44cf","name":"Save msg to flow variable","func":"//Save to flow variable for later use\nflow.set(\"hdl/fh/\" + msg.sender + \"/hdlstate\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":680,"wires":[[]]},{"id":"b989c322da784388","type":"function","z":"d409d0a29f7f44cf","name":"Flow get","func":"//Get Old status from flow variable for complete message\nmsg.oldhdlstate =flow.get(\"hdl/fh/\" + msg.topic.split(\"/\")[2] + \"/hdlstate\");\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":440,"y":1420,"wires":[["13cfc0ee1b828507"]]},{"id":"fef7564cd271bf53","type":"comment","z":"d409d0a29f7f44cf","name":"Single Channel Status","info":"","x":560,"y":1140,"wires":[]},{"id":"06bae3f5d47d7691","type":"comment","z":"d409d0a29f7f44cf","name":"Universal Switch","info":"","x":540,"y":1240,"wires":[]},{"id":"24e411f3922a9ed1","type":"comment","z":"d409d0a29f7f44cf","name":"Floorheat Thermostat DLP","info":"","x":570,"y":1340,"wires":[]},{"id":"5d0d05ffb3b48f8f","type":"function","z":"d409d0a29f7f44cf","name":"New Preset Mode","func":"// Change from MQTT textmode to HDL nrmode \nvar fhmode = msg.payload\nif (fhmode === \"Normal\"){msg.oldhdlstate.mode = 1}\nif (fhmode === \"Day\"){msg.oldhdlstate.mode = 2}\nif (fhmode === \"Night\"){msg.oldhdlstate.mode = 3}\nif (fhmode === \"Away\"){msg.oldhdlstate.mode = 4}\nif (fhmode === \"Timer\"){msg.oldhdlstate.mode = 5}\n\n//Build new HDL message\nmsg.target = msg.topic.split(\"/\")[2]\nmsg.code = 6470\nmsg.payload = msg.oldhdlstate\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":1420,"wires":[["fef4ca11f287479d"]]},{"id":"234f971b363daf21","type":"function","z":"d409d0a29f7f44cf","name":"New Mode","func":"// Change from Off or heat to true/false\nif (msg.payload === \"off\") {msg.oldhdlstate.status = false}\nif (msg.payload === \"heat\") {msg.oldhdlstate.status = true}\n//Build new HDL message\nmsg.target = msg.topic.split(\"/\")[2]\nmsg.code = 6470\nmsg.payload = msg.oldhdlstate\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":1380,"wires":[["fef4ca11f287479d"]]},{"id":"1b3bfb4f62154808","type":"function","z":"d409d0a29f7f44cf","name":"New Temp","func":"// Check witch mode active and save new temperature to that mode\nnormal = msg.oldhdlstate.temperature.normal \nday = msg.oldhdlstate.temperature.day\nnight = msg.oldhdlstate.temperature.night\naway = msg.oldhdlstate.temperature.away\n\nif (msg.oldhdlstate.mode === 1){normal = msg.payload}\nif (msg.oldhdlstate.mode === 2){day = msg.payload}\nif (msg.oldhdlstate.mode === 3){night = msg.payload}\nif (msg.oldhdlstate.mode === 4){away = msg.payload}\n\nmsg.oldhdlstate.temperature.normal = Number(normal)\nmsg.oldhdlstate.temperature.day = Number(day)\nmsg.oldhdlstate.temperature.night = Number(night)\nmsg.oldhdlstate.temperature.away = Number(away)\n\n//Build new HDL message\nmsg.target = msg.topic.split(\"/\")[2]\nmsg.code = 6470\nmsg.payload = msg.oldhdlstate\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":1460,"wires":[["fef4ca11f287479d"]]},{"id":"e892611df0c139cb","type":"comment","z":"d409d0a29f7f44cf","name":"Air condition","info":"","x":530,"y":1720,"wires":[]},{"id":"0ba22a37d6db866e","type":"function","z":"d409d0a29f7f44cf","name":"Save msg to flow variable","func":"//Save to flow variable for later use\nflow.set(\"hdl/ac/\" + msg.sender + \"/hdlstate\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":960,"wires":[[]]},{"id":"0277c060ae28fde2","type":"function","z":"d409d0a29f7f44cf","name":"Flow get","func":"//Get Old status from flow variable for complete message\nmsg.oldhdlstate =flow.get(\"hdl/ac/\" + msg.topic.split(\"/\")[2] + \"/hdlstate\");\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":1820,"wires":[["3f50d0f2fdbe5db9"]]},{"id":"aebb0c75dd969fca","type":"function","z":"d409d0a29f7f44cf","name":"New Mode","func":"//Set current temperature from oldstate and change mode to nr and not text\nvar acmode = msg.payload\nif (acmode === \"cool\"){var acstatus = true; var accurrenttemp = msg.oldhdlstate.temperature.cooling; var newacmode = 0}\nif (acmode === \"heat\"){var acstatus = true; var accurrenttemp = msg.oldhdlstate.temperature.heating; var newacmode = 1}\nif (acmode === \"fan_only\"){var acstatus = true; var accurrenttemp = 0; var newacmode = 2}\nif (acmode === \"auto\"){var acstatus = true; var accurrenttemp = msg.oldhdlstate.temperature.auto; var newacmode = 3}\nif (acmode === \"dry\"){var acstatus = true; var accurrenttemp = msg.oldhdlstate.temperature.dry; var newacmode = 4}\n\n//If off change acstatus and old mode\nif (acmode === \"off\")\n{\n    var acstatus = false; \n    if (msg.oldhdlstate.setupmode === 0){var accurrenttemp = msg.oldhdlstate.temperature.cooling; var newacmode = 0}\n    if (msg.oldhdlstate.setupmode === 1){var accurrenttemp = msg.oldhdlstate.temperature.heating; var newacmode = 1}\n    if (msg.oldhdlstate.setupmode === 2){var accurrenttemp = 0; var newacmode = 2}\n    if (msg.oldhdlstate.setupmode === 3){var accurrenttemp = msg.oldhdlstate.temperature.auto; var newacmode = 3}\n    if (msg.oldhdlstate.setupmode === 4){var accurrenttemp = msg.oldhdlstate.temperature.dry; var newacmode = 4}\n}\n\n//   - Insert to msg object\nmsg.oldhdlstate.currentmode = accurrenttemp\nmsg.oldhdlstate.setupmode = newacmode\nmsg.oldhdlstate.acstatus = acstatus\n\n//Build new HDL message\nmsg.target = msg.topic.split(\"/\")[2]\nmsg.code = 6458\nmsg.payload = msg.oldhdlstate\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":1760,"wires":[["fef4ca11f287479d"]],"info":"msg.topic = \"hdl/us/\" + msg.sender + \"/\" + msg.payload.switch;\nvar status = msg.payload.status\nif (status === true) \n    {\n    msg.payload = \"ON\";\n    } \n    else \n    {\n    msg.payload = \"OFF\";\n    }\nreturn msg;"},{"id":"c4d3bf2fd3532ed5","type":"function","z":"d409d0a29f7f44cf","name":"Temp","func":"//Set new temperature to HDL message\nvar acurrtemp = msg.payload\nif (msg.oldhdlstate.setupmode === 0){msg.oldhdlstate.temperature.cooling = acurrtemp}\nif (msg.oldhdlstate.setupmode === 1){msg.oldhdlstate.temperature.heating = acurrtemp}\n//if (msg.oldhdlstate.setupmode === 2){var accurrtemp = 0}\nif (msg.oldhdlstate.setupmode === 3){msg.oldhdlstate.temperature.auto = acurrtemp}\nif (msg.oldhdlstate.setupmode === 4){msg.oldhdlstate.temperature.dry = acurrtemp}\n\n// Build AC broadcast\nmsg.target = msg.topic.split(\"/\")[2]\nmsg.code = 6458,\nmsg.payload = msg.oldhdlstate\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":1820,"wires":[["fef4ca11f287479d"]],"info":"msg.topic = \"hdl/us/\" + msg.sender + \"/\" + msg.payload.switch;\nvar status = msg.payload.status\nif (status === true) \n    {\n    msg.payload = \"ON\";\n    } \n    else \n    {\n    msg.payload = \"OFF\";\n    }\nreturn msg;"},{"id":"f464921b1f442181","type":"range","z":"d409d0a29f7f44cf","minin":"0","maxin":"100","minout":"0","maxout":"100","action":"scale","round":true,"property":"payload","name":"Round","x":650,"y":1820,"wires":[["c4d3bf2fd3532ed5"]]},{"id":"6b93b8e98eac4a13","type":"function","z":"d409d0a29f7f44cf","name":"New Fan Mode","func":"//AC fan speed text to speed\nvar acspeed = msg.payload\nif (acspeed === \"auto\"){msg.oldhdlstate.setupspeed = 0}\nif (acspeed === \"high\"){msg.oldhdlstate.setupspeed = 1}\nif (acspeed === \"medium\"){msg.oldhdlstate.setupspeed = 2}\nif (acspeed === \"low\"){msg.oldhdlstate.setupspeed = 3}\n\n// Build AC broadcast\nmsg.target = msg.topic.split(\"/\")[2]\nmsg.code = 6458,\nmsg.payload = msg.oldhdlstate\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":700,"y":1880,"wires":[["fef4ca11f287479d"]],"info":"msg.topic = \"hdl/us/\" + msg.sender + \"/\" + msg.payload.switch;\nvar status = msg.payload.status\nif (status === true) \n    {\n    msg.payload = \"ON\";\n    } \n    else \n    {\n    msg.payload = \"OFF\";\n    }\nreturn msg;"},{"id":"fef4ca11f287479d","type":"hdl-raw-out","z":"d409d0a29f7f44cf","controller":"","name":"","x":1250,"y":1580,"wires":[]},{"id":"924768afbce95647","type":"switch","z":"d409d0a29f7f44cf","name":"","property":"topic","propertyType":"msg","rules":[{"t":"cont","v":"/mode/set","vt":"str"},{"t":"cont","v":"/textmode/set","vt":"str"},{"t":"cont","v":"/temperature/set","vt":"str"}],"checkall":"false","repair":false,"outputs":3,"x":570,"y":1600,"wires":[["0f6e549052100ef1"],["45955344839086c8"],["f9abce9ded39bdf3"]]},{"id":"5221b9e27190eefb","type":"function","z":"d409d0a29f7f44cf","name":"Flow get","func":"//Get Old status from flow variable for complete message\naddressandchannel = msg.topic.split(\"/\")[2]\nmsg.channel = addressandchannel.split(\".\")[2]\nmsg.target = addressandchannel.split(\".\")[0] + \".\" + addressandchannel.split(\".\")[1]\nmsg.oldhdlstate =flow.get(\"hdl/hm/\" + msg.target + \"/\" + msg.channel + \"/hdlstate\");\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":440,"y":1600,"wires":[["924768afbce95647"]]},{"id":"b80b0e2e0e978d7a","type":"comment","z":"d409d0a29f7f44cf","name":"Floorheat Thermostat Heatmodule MFH06","info":"","x":620,"y":1520,"wires":[]},{"id":"45955344839086c8","type":"function","z":"d409d0a29f7f44cf","name":"New Preset Mode","func":"// Change from MQTT textmode to HDL nrmode \nvar fhmode = msg.payload\nif (fhmode === \"Normal\"){msg.oldhdlstate.mode = 1}\nif (fhmode === \"Day\"){msg.oldhdlstate.mode = 2}\nif (fhmode === \"Night\"){msg.oldhdlstate.mode = 3}\nif (fhmode === \"Away\"){msg.oldhdlstate.mode = 4}\nif (fhmode === \"Timer\"){msg.oldhdlstate.mode = 5}\n\n//Build new HDL message\nmsg.code = 7260\nmsg.payload = msg.oldhdlstate\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":750,"y":1600,"wires":[["fef4ca11f287479d"]]},{"id":"0f6e549052100ef1","type":"function","z":"d409d0a29f7f44cf","name":"New Mode","func":"// Change from Off or heat to true/false\nif (msg.payload === \"off\") {msg.oldhdlstate.work.status = false}\nif (msg.payload === \"heat\") {msg.oldhdlstate.work.status = true}\n//Build new HDL message\nmsg.code = 7260\nmsg.payload = msg.oldhdlstate\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":1560,"wires":[["fef4ca11f287479d"]]},{"id":"f9abce9ded39bdf3","type":"function","z":"d409d0a29f7f44cf","name":"New Temp","func":"// Check witch mode active and save new temperature to that mode\nnormal = msg.oldhdlstate.temperature.normal \nday = msg.oldhdlstate.temperature.day\nnight = msg.oldhdlstate.temperature.night\naway = msg.oldhdlstate.temperature.away\n\nif (msg.oldhdlstate.mode === 1){normal = msg.payload}\nif (msg.oldhdlstate.mode === 2){day = msg.payload}\nif (msg.oldhdlstate.mode === 3){night = msg.payload}\nif (msg.oldhdlstate.mode === 4){away = msg.payload}\n\nmsg.oldhdlstate.temperature.normal = Number(normal)\nmsg.oldhdlstate.temperature.day = Number(day)\nmsg.oldhdlstate.temperature.night = Number(night)\nmsg.oldhdlstate.temperature.away = Number(away)\n\n//Build new HDL message\nmsg.code = 7260\nmsg.payload = msg.oldhdlstate\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":1640,"wires":[["fef4ca11f287479d"]]},{"id":"6e360050af29aab2","type":"comment","z":"d409d0a29f7f44cf","name":"Floorheat Thermostat Heatmodule MFH06","info":"","x":560,"y":780,"wires":[]},{"id":"945e3545774a5281","type":"function","z":"d409d0a29f7f44cf","name":"Floorheat Update/Answer from Heatmodule","func":"//Insert MQTT Topic\nmsg.topic = \"hdl/hm/\" + msg.sender + \".\" + msg.payload.channel;\n\n//Power Change true/false to ON/OFF\nvar power = msg.payload.work.status;\nif (power === true){newpower = \"heat\"}\nif (power === false){newpower = \"off\"}\nmsg.payload.status = newpower\n\n//Mode Change from nr to mode 1:Normal 2:Day 3:Night 4:Away 5:Timer. And add current temprature\nvar fhmode= msg.payload.mode \nif (fhmode === 1){var textmode = \"Normal\"; var tempnow = msg.payload.temperature.normal}\nif (fhmode === 2){var textmode = \"Day\"; var tempnow = msg.payload.temperature.day}\nif (fhmode === 3){var textmode = \"Night\"; var tempnow = msg.payload.temperature.night}\nif (fhmode === 4){var textmode = \"Away\"; var tempnow = msg.payload.temperature.away}\nif (fhmode === 5){var textmode = \"Timer\"}\nmsg.payload.textmode= textmode\nmsg.payload.temperature.now = tempnow\n\n//Awaymode\n//if (textmode ==\"Away\"){msg.payload.awaymode = \"On\"}\n//    else{msg.payload.awaymode = \"Off\"}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":860,"wires":[["e6e91e6c6531d2e7"]]},{"id":"d4c7e2802d3aab8a","type":"function","z":"d409d0a29f7f44cf","name":"Save msg to flow variable","func":"//Save to flow variable for later use\nflow.set(\"hdl/hm/\" + msg.sender + \"/\" + msg.payload.channel +\"/hdlstate\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":820,"wires":[[]]},{"id":"90c44096c16dc1c1","type":"comment","z":"d409d0a29f7f44cf","name":"New Sensor Status Broadcasts Lux,Temp and Humid","info":"","x":590,"y":440,"wires":[]},{"id":"b99092c085925c66","type":"function","z":"d409d0a29f7f44cf","name":"Sensor Status Broadcasts","func":"var outputMsgs = [];\nif (msg.code == 5637) \n{\n    {\n        outputMsgs.push\n        ({\n          topic:\"hdl/temp/\" + msg.sender + \"/1\",\n          payload : msg.payload.temperature\n        });\n\n        outputMsgs.push\n        ({\n          topic:\"hdl/lux/\" + msg.sender + \"/Lux\",\n           payload : msg.payload.brightness\n        });\n    \n        outputMsgs.push\n        ({\n          topic:\"hdl/Humidity/\" + msg.sender + \"/Humidity\",\n           payload : msg.payload.humidity\n        });\n        \n    }\n    return [ outputMsgs ];\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":480,"wires":[["e6e91e6c6531d2e7"]]}]

Flow Info

Created 3 years, 6 months ago
Rating: 3.6666666666666665 3

Owner

Actions

Rate:

Node Types

Core
  • comment (x15)
  • function (x27)
  • json (x1)
  • mqtt in (x1)
  • mqtt out (x1)
  • range (x3)
  • switch (x5)
Other
  • hdl-raw-in (x1)
  • hdl-raw-out (x1)
  • tab (x1)

Tags

  • HDL
  • MQTT
  • Home
  • Assistant
  • HomeAssistant
  • HASSIO
  • Gateway
  • hdlbus
  • Smartbus
  • BusPro
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option