[{"id":"f865518d9aa4229a","type":"tab","label":"Mbus","disabled":false,"info":""},{"id":"d29d442dc1a2b2c0","type":"mbus-out","z":"f865518d9aa4229a","name":"","client":"ce865fca58584146","x":490,"y":200,"wires":[["64aa4b0caf571a05"]]},{"id":"64aa4b0caf571a05","type":"debug","z":"f865518d9aa4229a","name":"","active":true,"console":false,"complete":"false","x":770,"y":200,"wires":[]},{"id":"25391937be70d8d7","type":"mbus-controller","z":"f865518d9aa4229a","name":"","client":"ce865fca58584146","x":530,"y":300,"wires":[["cf63801613c34166","2e8ae61859d45968","886617b12e8c939c"]]},{"id":"ed8cf31caea1dcfb","type":"inject","z":"f865518d9aa4229a","name":"scan","repeat":"","crontab":"","once":false,"topic":"scan","payload":"","payloadType":"str","x":150,"y":100,"wires":[["25391937be70d8d7"]]},{"id":"2e8ae61859d45968","type":"debug","z":"f865518d9aa4229a","name":"","active":true,"console":false,"complete":"false","x":870,"y":360,"wires":[]},{"id":"e27a8a64b7f4a4ad","type":"inject","z":"f865518d9aa4229a","name":"Read ID 1","repeat":"","crontab":"","once":false,"topic":"getDevice","payload":"{\"address\": 1}","payloadType":"json","x":160,"y":180,"wires":[["25391937be70d8d7"]]},{"id":"380b14852e120384","type":"inject","z":"f865518d9aa4229a","name":"Get Devices","repeat":"60","crontab":"","once":true,"onceDelay":"","topic":"getDevices","payload":"","payloadType":"str","x":180,"y":260,"wires":[["25391937be70d8d7"]]},{"id":"cf63801613c34166","type":"ui_template","z":"f865518d9aa4229a","group":"d27938f9935499c1","name":"mbus-table","order":0,"width":"14","height":"10","format":"<table>\n <tr>\n <th>ID</th>\n <th>Primary ID</th>\n <th>Info</th>\n <th>Data</th>\n <th>Last Update</th>\n <th>Status</th>\n </tr>\n <tr style=\"cursor:pointer;\" ng-click=\"showData(device)\" ng-repeat=\"(id, device) in devices\">\n <td>{{ device.secondaryID }}</td>\n <td>{{ device.primaryID }}</td>\n <td ng-bind-html=\"getInfo(device)\"></td>\n <td>{{ device.DataRecord.length }}</td>\n <td>{{ device.lastUpdate }}</td>\n <td>\n <div class=\"online\" ng-style=\"{background: !device.error ? '#4CAF50' : '#f44336'}\">\n <md-tooltip md-direction=\"bottom\">{{ device.error ? device.error : 'OK' }}</md-tooltip>\n </div>\n </td>\n </tr>\n</table>\n\n<style>\ntable {\n border-collapse: collapse;\n width: 100%;\n}\n\nth, td{\n text-align: left;\n padding: 8px;\n background-color: #f2f2f2;\n color: black;\n}\n\nth {\n background-color: #4CAF50;\n color: white;\n}\n\n.online {\n\tbackground:#ff3333;\n\twidth:20px;\n\theight:20px;\n\tmargin:0 auto;\n\t-webkit-border-radius:50%;\n\t-moz-border-radius:50%;\n\tborder-radius:50%;\n}\n</style>\n\n<script>\n\n\n(function(scope) {\n \n scope.send({topic: 'getDevices'});\n scope.devices = [];\n \n scope.showData = function(device){\n scope.send({topic: 'deviceData', payload: device});\n }\n \n scope.getInfo = function(device){\n var text = '';\n var info = device.SlaveInformation;\n \n for(key in info){\n text += `<p><b>${key}</b>: ${info[key]}</p>`;\n }\n \n return text;\n }\n\n scope.$watch('msg', function(data) {\n if(data && data.topic){\n switch(data.topic){\n case \"getDevices\":\n if(data.payload && data.payload.devices)\n scope.devices = data.payload.devices;\n break;\n }\n }\n });\n \n})(scope);\n\n</script>\n","storeOutMessages":false,"fwdInMessages":false,"templateScope":"local","x":730,"y":300,"wires":[["5d439686be0ac4c3"]]},{"id":"54532b5aabe03d97","type":"inject","z":"f865518d9aa4229a","name":"restart","repeat":"","crontab":"","once":false,"topic":"restart","payload":"","payloadType":"num","x":150,"y":140,"wires":[["25391937be70d8d7"]]},{"id":"5d439686be0ac4c3","type":"ui_template","z":"f865518d9aa4229a","group":"076f982652a53bad","name":"data-table","order":0,"width":"14","height":"10","format":"<p><b>Device ID:</b> {{ID}} </p>\n\n<br>\n<br>\n\n<table>\n <tr>\n <th>ID</th>\n <th>Function</th>\n <th>Unit</th>\n <th>Value</th>\n <th>Timestamp</th>\n </tr>\n <tr ng-repeat=\"(key, data) in deviceData\">\n <td>{{ data.id }}</td>\n <td>{{ data.Function }}</td>\n <td>{{ data.Unit }}</td>\n <td>{{ data.Value }}</td>\n <td>{{ data.Timestamp }}</td>\n </tr>\n</table>\n\n<style>\ntable {\n border-collapse: collapse;\n width: 100%;\n}\n\nth, td{\n text-align: left;\n padding: 8px;\n background-color: #f2f2f2;\n color: black;\n}\n\nth {\n background-color: #4CAF50;\n color: white;\n}\n\n.online {\n\tbackground:#ff3333;\n\twidth:20px;\n\theight:20px;\n\tmargin:0 auto;\n\t-webkit-border-radius:50%;\n\t-moz-border-radius:50%;\n\tborder-radius:50%;\n}\n</style>\n\n<script>\n\n\n(function(scope) {\n \n scope.deviceData = [];\n scope.ID = '';\n\n scope.$watch('msg', function(data) {\n if(data && data.topic){\n switch(data.topic){\n case \"deviceData\":\n if(data.payload){\n scope.deviceData = data.payload.DataRecord;\n scope.ID = data.payload.SlaveInformation.Id;\n }\n break;\n }\n }\n });\n \n})(scope);\n\n</script>\n","storeOutMessages":false,"fwdInMessages":false,"templateScope":"local","x":900,"y":300,"wires":[[]]},{"id":"ddd5e60920a23ad5","type":"inject","z":"f865518d9aa4229a","name":"Read ID 2","repeat":"","crontab":"","once":false,"topic":"getDevice","payload":"{\"address\": 2}","payloadType":"json","x":160,"y":220,"wires":[["25391937be70d8d7"]]},{"id":"97fe3cea3dd78893","type":"ui_button","z":"f865518d9aa4229a","name":"Scan","group":"f9c67b3519fdb234","order":3,"width":"2","height":"1","passthru":false,"label":"Scan","color":"","bgcolor":"","icon":"location_searching","payload":"","payloadType":"str","topic":"scan","x":130,"y":340,"wires":[["25391937be70d8d7"]]},{"id":"f4591fad97effe88","type":"ui_button","z":"f865518d9aa4229a","name":"Restart","group":"f9c67b3519fdb234","order":4,"width":"3","height":"1","passthru":false,"label":"Restart","color":"","bgcolor":"","icon":"refresh","payload":"","payloadType":"str","topic":"restart","x":140,"y":380,"wires":[["25391937be70d8d7"]]},{"id":"bf6e8184b1036eae","type":"ui_button","z":"f865518d9aa4229a","name":"GetDevices","group":"f9c67b3519fdb234","order":5,"width":"3","height":"1","passthru":false,"label":"Update Devices","color":"","bgcolor":"","icon":"refresh","payload":"","payloadType":"str","topic":"getDevices","x":150,"y":420,"wires":[["25391937be70d8d7"]]},{"id":"56835618461e0449","type":"ui_button","z":"f865518d9aa4229a","name":"readAddress","group":"f9c67b3519fdb234","order":2,"width":"3","height":"1","passthru":false,"label":"Read Device","color":"","bgcolor":"","icon":"","payload":"deviceID","payloadType":"flow","topic":"getDevice","x":151,"y":457,"wires":[["55994e356bc01d41"]]},{"id":"509e91d18c57d3a9","type":"ui_text_input","z":"f865518d9aa4229a","name":"Device_ID","label":"ID: ","group":"f9c67b3519fdb234","order":1,"width":"3","height":"1","passthru":true,"mode":"text","delay":300,"topic":"","x":149,"y":618,"wires":[["4ff922eb25f7b57b"]]},{"id":"4ff922eb25f7b57b","type":"function","z":"f865518d9aa4229a","name":"storeID","func":"\nflow.set('deviceID', msg.payload);\n\nreturn msg;","outputs":0,"noerr":0,"x":325,"y":618,"wires":[]},{"id":"55994e356bc01d41","type":"function","z":"f865518d9aa4229a","name":"readAddr","func":"var data = {address: msg.payload}\n\nmsg.payload = data;\n\nreturn msg;","outputs":1,"noerr":0,"x":309,"y":457,"wires":[["25391937be70d8d7"]]},{"id":"d8f8f4e78e68774f","type":"status","z":"f865518d9aa4229a","name":"controller_status","scope":["25391937be70d8d7"],"x":420,"y":60,"wires":[["2db5223e4cf95d6c"]]},{"id":"645047f2aaeb7378","type":"status","z":"f865518d9aa4229a","name":"mbus_status","scope":["d29d442dc1a2b2c0"],"x":413,"y":105,"wires":[["dcd216406a52d663"]]},{"id":"2db5223e4cf95d6c","type":"ui_text","z":"f865518d9aa4229a","group":"6c2bd694a5b1c9b1","order":0,"width":0,"height":0,"name":"controller_status","label":"Controller","format":"{{msg.status.text}}","layout":"row-spread","x":632,"y":60,"wires":[]},{"id":"dcd216406a52d663","type":"ui_text","z":"f865518d9aa4229a","group":"6c2bd694a5b1c9b1","order":0,"width":0,"height":0,"name":"mbus_status","label":"M-Bus","format":"{{msg.status.text}}","layout":"row-spread","x":622,"y":105,"wires":[]},{"id":"08b78e2be720569d","type":"inject","z":"f865518d9aa4229a","name":"setPrimary","repeat":"","crontab":"","once":false,"topic":"setPrimary","payload":"{\"newAddr\":3,\"oldAddr\":2}","payloadType":"json","x":160,"y":60,"wires":[["25391937be70d8d7"]]},{"id":"39645a72e0ff3142","type":"ui_text_input","z":"f865518d9aa4229a","name":"Old_ID","label":"Old ID","group":"f9c67b3519fdb234","order":6,"width":"3","height":"1","passthru":true,"mode":"text","delay":300,"topic":"","x":140,"y":660,"wires":[["0f77be8baa6345ce"]]},{"id":"0f77be8baa6345ce","type":"function","z":"f865518d9aa4229a","name":"storeID","func":"\nflow.set('oldID', msg.payload);\n\nreturn msg;","outputs":0,"noerr":0,"x":323,"y":658,"wires":[]},{"id":"d6746a0df0d11197","type":"ui_text_input","z":"f865518d9aa4229a","name":"New_ID","label":"New ID","group":"f9c67b3519fdb234","order":7,"width":"3","height":"1","passthru":true,"mode":"text","delay":300,"topic":"","x":140,"y":700,"wires":[["6f8ec5a64c4a1eda"]]},{"id":"6f8ec5a64c4a1eda","type":"function","z":"f865518d9aa4229a","name":"storeID","func":"\nflow.set('newID', msg.payload);\n\nreturn msg;","outputs":0,"noerr":0,"x":321,"y":698,"wires":[]},{"id":"4aea57191255b73a","type":"ui_button","z":"f865518d9aa4229a","name":"SetPrimary","group":"f9c67b3519fdb234","order":8,"width":"3","height":"1","passthru":false,"label":"Set Primary ID","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"setPrimary","x":150,"y":498,"wires":[["4e0a2109506b7dda"]]},{"id":"4e0a2109506b7dda","type":"function","z":"f865518d9aa4229a","name":"setPrimary","func":"var data = {\n oldAddr: flow.get('oldID'), \n newAddr:flow.get('newID')\n }\n\nmsg.payload = data;\n\nreturn msg;","outputs":1,"noerr":0,"x":319,"y":498,"wires":[["25391937be70d8d7"]]},{"id":"47a2bd0559046e6a","type":"inject","z":"f865518d9aa4229a","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"30","crontab":"","once":false,"onceDelay":"","topic":"getDevice","payload":"counter","payloadType":"flow","x":169,"y":558,"wires":[["adb705ccff8afe0e"]]},{"id":"adb705ccff8afe0e","type":"function","z":"f865518d9aa4229a","name":"scanPrimary","func":"\nif(msg.payload == null) msg.payload = 1;\n\nif(msg.payload >= 76) msg.payload = 1;\n\nmsg.payload++;\n\nflow.set(\"counter\",msg.payload);\n\nmsg.payload = {address: msg.payload};\n\nreturn msg;","outputs":1,"noerr":0,"x":349,"y":558,"wires":[[]]},{"id":"d2a6dc6098cf3c6f","type":"inject","z":"f865518d9aa4229a","name":"setDevices","repeat":"","crontab":"","once":false,"topic":"setDevices","payload":"","payloadType":"date","x":159,"y":298,"wires":[["f9ae155449fbc95f"]]},{"id":"f9ae155449fbc95f","type":"function","z":"f865518d9aa4229a","name":"devices","func":"var devices = [\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\"];\n\nmsg.payload = devices;\n\nreturn msg;","outputs":1,"noerr":0,"x":297,"y":298,"wires":[["25391937be70d8d7"]]},{"id":"886617b12e8c939c","type":"function","z":"f865518d9aa4229a","name":"Extract + Format Kamstrup 302","func":"let TotalHeatEnergy = msg.payload.devices[\"67525649\"].DataRecord[1].Value; \nlet TotalCoolEnergy = msg.payload.devices[\"67525649\"].DataRecord[2].Value;\nlet FlowTemperature = msg.payload.devices[\"67525649\"].DataRecord[8].Value /100;\nlet ReturnTemperature = msg.payload.devices[\"67525649\"].DataRecord[9].Value /100;\nlet DiffTemperature = msg.payload.devices[\"67525649\"].DataRecord[10].Value /100;\nvar PowerInstValue = Math.round((msg.payload.devices[\"67525649\"].DataRecord[11].Value *100)*1)/1;\nlet FlowInstValue = msg.payload.devices[\"67525649\"].DataRecord[13].Value;\nvar FlowValuelm = Number((FlowInstValue/60).toFixed(2));\n\nlet _msg = {\n payload: []\n};\n\n_msg.payload=\n {\n measurement: \"HeatEnergy\",\n\t\tfields: {\n\t\t\ttotalheatenergy: TotalHeatEnergy,\t\t\t\n\t\t\ttotalcoolenergy: TotalCoolEnergy,\t\n\t\t\tflowtemperature: FlowTemperature,\t\n\t\t returntemperature: ReturnTemperature,\t\n\t\t difftemperature: DiffTemperature,\n\t\t power: PowerInstValue,\n\t\t\tflow: FlowInstValue,\n flowlm: FlowValuelm, \n\n\t\t},\n\t\ttags:{\n\t\t device: \"Kamstrup\",\n\t\t},\n\t\ttimestamp: flow.get('timestamp')\n\t}\n\n\nreturn _msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":610,"y":420,"wires":[["6a76d82250d0560f","f860708d6c26e154","2e8ae61859d45968"]]},{"id":"ea41b023b25e56d5","type":"comment","z":"f865518d9aa4229a","name":"Change the device ID number!","info":"","x":600,"y":380,"wires":[]},{"id":"06d7575b69f88670","type":"comment","z":"f865518d9aa4229a","name":"Change the adapter's serial port","info":"","x":570,"y":160,"wires":[]},{"id":"71dc81853bf538b6","type":"comment","z":"f865518d9aa4229a","name":"Change the adapter's serial port","info":"","x":570,"y":260,"wires":[]},{"id":"1e31e39475d98a78","type":"mqtt out","z":"f865518d9aa4229a","name":"","topic":"","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"f935c11c.41462","x":1170,"y":500,"wires":[]},{"id":"a3a5ba333963288f","type":"mqtt in","z":"f865518d9aa4229a","name":"kamstrup","topic":"kamstrup","qos":"2","datatype":"json","broker":"f935c11c.41462","inputs":0,"x":960,"y":560,"wires":[["908d10050f4b04d2"]]},{"id":"908d10050f4b04d2","type":"debug","z":"f865518d9aa4229a","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1130,"y":560,"wires":[]},{"id":"0c53ba8d7284969a","type":"join","z":"f865518d9aa4229a","name":"","mode":"custom","build":"merged","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"2","count":"8","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":1030,"y":500,"wires":[[]]},{"id":"6a76d82250d0560f","type":"change","z":"f865518d9aa4229a","name":"move to msg","rules":[{"t":"move","p":"payload.fields","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"topic","pt":"msg","to":"kamstrup","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":500,"wires":[["0c53ba8d7284969a"]]},{"id":"e58fc1effc685d53","type":"influxdb batch","z":"f865518d9aa4229a","influxdb":"a934c8eecb729d7d","precision":"","retentionPolicy":"","name":"","database":"","retentionPolicyV18Flux":"","org":"","bucket":"","x":1100,"y":420,"wires":[]},{"id":"f860708d6c26e154","type":"join","z":"f865518d9aa4229a","name":"","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"8","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":851,"y":422,"wires":[[]]},{"id":"ce865fca58584146","type":"mbus-client","name":"","clienttype":"serial","tcpHost":"127.0.0.1","tcpPort":"10001","tcpTimeout":"4000","serialPort":"/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A105W07X-if00-port0","serialBaudrate":"2400","reconnectTimeout":"10000","autoScan":true,"storeDevices":true,"disableLogs":true},{"id":"d27938f9935499c1","type":"ui_group","name":"M-Bus Devices","tab":"910d4d4b27dd7881","order":3,"disp":true,"width":"14"},{"id":"076f982652a53bad","type":"ui_group","name":"Data","tab":"910d4d4b27dd7881","order":4,"disp":true,"width":"14"},{"id":"f9c67b3519fdb234","type":"ui_group","name":"Commands","tab":"910d4d4b27dd7881","order":2,"disp":true,"width":"14"},{"id":"6c2bd694a5b1c9b1","type":"ui_group","name":"Status","tab":"910d4d4b27dd7881","order":1,"disp":true,"width":"14"},{"id":"f935c11c.41462","type":"mqtt-broker","name":"MQTT","broker":"core-mosquitto","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"a934c8eecb729d7d","type":"influxdb","hostname":"127.0.0.1","port":"8086","protocol":"http","database":"energy","name":"","usetls":false,"tls":"","influxdbVersion":"1.x","url":"","rejectUnauthorized":false},{"id":"910d4d4b27dd7881","type":"ui_tab","name":"M-Bus","icon":"plug","order":1}]