Kamstrup MULTICAL® x03 Modbus TCP

Get the values of am Kamstrup Multical® x03 (403/603/803) via Modbus TCP. I used the IEEE Float registers to get the values.

For simpler debugging and customization, i split the query of the values and the units and join them later.

In production, you propaply don't need all registers.

You need a installed and working modbus-modul from Kamstrup! hc-003-82-modbus-kmp-tcpip

[{"id":"34ab19bacc69b2d1","type":"modbus-flex-getter","z":"44368c7cfeed9aa6","name":"","showStatusActivities":true,"showErrors":true,"showWarnings":true,"logIOActivities":false,"server":"d39367e1a3415ae9","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"startDelayTime":"","x":500,"y":140,"wires":[[],["5706cec697c5749c"]]},{"id":"105c86a14723af07","type":"function","z":"44368c7cfeed9aa6","name":"values","func":"msg.payload = {\n'fc': 3,\n'unitid': 1,\n'address': 0 ,\n'quantity': 82\n }\n msg.topic = \"values\"\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":120,"wires":[["34ab19bacc69b2d1"]]},{"id":"5706cec697c5749c","type":"switch","z":"44368c7cfeed9aa6","name":"","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"values","vt":"str"},{"t":"eq","v":"units","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":690,"y":200,"wires":[["a9328c9c3d781cd9"],["714d80b4e45eb405"]]},{"id":"ccdd9140cc3cfa11","type":"function","z":"44368c7cfeed9aa6","name":"units","func":"msg.payload = {\n'fc': 3,\n'unitid': 1,\n'address': 82 ,\n'quantity': 41\n }\n msg.topic = \"units\"\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":160,"wires":[["34ab19bacc69b2d1"]]},{"id":"714d80b4e45eb405","type":"buffer-parser","z":"44368c7cfeed9aa6","name":"","data":"payload.buffer","dataType":"msg","specification":"spec","specificationType":"ui","items":[{"type":"uint16be","name":"Flow V1 actual","offset":0,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Flow V2 actual","offset":2,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Actual Power","offset":4,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"t1 actual","offset":6,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"t2 actual","offset":8,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"t3 actual","offset":10,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"t4 actual","offset":12,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"t1-t2 diff. temp.","offset":14,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"P1 actual","offset":16,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"P2 actual","offset":18,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Heat energy E1","offset":20,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Heat energy E2","offset":22,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Cooling energy E3","offset":24,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Inlet energy E4","offset":26,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Outlet energy E5","offset":28,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Tap water energy E6","offset":30,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Tap water energy E7","offset":32,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Energy E8","offset":34,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Energy E9","offset":36,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Energy E10","offset":38,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Energy E11","offset":40,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Tariff TA2","offset":42,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Tariff TA3","offset":44,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Tariff TA4","offset":46,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Heat energy A1","offset":48,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Heat energy A2","offset":50,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Volume V1","offset":52,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Volume V2","offset":54,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Pulse input A1","offset":56,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Pulse input B1","offset":58,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Pulse input A2","offset":60,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Pulse input B2","offset":62,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"COP","offset":64,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"t5 limit","offset":66,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Power Input B1","offset":68,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"QP average time","offset":70,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Tariff limit TL2","offset":72,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Tariff limit TL3","offset":74,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Tariff limit TL4","offset":76,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Mass M1","offset":78,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"uint16be","name":"Mass M2","offset":80,"length":1,"offsetbit":0,"scale":"1","mask":""}],"swap1":"","swap2":"","swap3":"","swap1Type":"swap","swap2Type":"swap","swap3Type":"swap","msgProperty":"payload","msgPropertyType":"str","resultType":"keyvalue","resultTypeType":"return","multipleResult":false,"fanOutMultipleResult":false,"setTopic":true,"outputs":1,"x":850,"y":240,"wires":[["8b3f09fd25ac71bd"]]},{"id":"8b3f09fd25ac71bd","type":"function","z":"44368c7cfeed9aa6","name":"get SI unit","func":"const units = {\n    0: \"No unit\",\n    1: \"Wh\",\n    2: \"kWh\",\n    3: \"MWh\",\n    4: \"GWh\",\n    5: \"j\",\n    6: \"kj\",\n    7: \"Mj\",\n    8: \"Gj\",\n    21: \"W\",\n    22: \"kW\",\n    23: \"MW\",\n    24: \"GW\",\n    37: \"°C\",\n    38: \"Kelvin\",\n    39: \"l\",\n    40: \"m³\",\n    41: \"l/h\",\n    42: \"M³/h\",\n    43: \"M³ *C\",\n    44: \"ton\",\n    47: \"Time: hh:mm:ss\",\n    48: \"Date: yy:mm:dd\",\n    49: \"Date: yyyy:mm:dd\",\n    52: \"bar\",\n    55: \"M³x10\",\n    58: \"Minutes\",\n    85: \"%RH\",\n    86: \"%O2\",\n    87: \"m/s\",\n    88: \"kJ/kg\",\n    89: \"pH\",\n    90: \"g/kg\"\n};\n\nlet payload = msg.payload\n\nfor (const [key, value] of Object.entries(payload)) {\n    payload[key] = units[value]\n}\n\nmsg.payload = payload\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1040,"y":240,"wires":[["eedb38e299b060e0"]]},{"id":"eedb38e299b060e0","type":"join","z":"44368c7cfeed9aa6","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":1190,"y":160,"wires":[["998c00dfe075a569"]]},{"id":"8b180defdbf240f1","type":"inject","z":"44368c7cfeed9aa6","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":140,"wires":[["ccdd9140cc3cfa11","105c86a14723af07"]]},{"id":"cfcaccd39e8de667","type":"debug","z":"44368c7cfeed9aa6","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload.values_with_units[\"Actual Power\"]","statusType":"msg","x":1500,"y":160,"wires":[]},{"id":"998c00dfe075a569","type":"function","z":"44368c7cfeed9aa6","name":"beautify","func":"let units = msg.payload.units\nlet values = msg.payload.values\nlet values_with_units = {}\n\nfor (const [key, value] of Object.entries(values)) {\n    let register = key\n    let unit = units[key]\n    let value_with_unit = value.toFixed(3) + ' ' +  unit\n\n    values_with_units[key] = value_with_unit\n}\nmsg.payload.values_with_units = values_with_units\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1340,"y":160,"wires":[["cfcaccd39e8de667"]]},{"id":"a9328c9c3d781cd9","type":"buffer-parser","z":"44368c7cfeed9aa6","name":"","data":"payload.buffer","dataType":"msg","specification":"spec","specificationType":"ui","items":[{"type":"floatbe","name":"Flow V1 actual","offset":0,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Flow V2 actual","offset":4,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Actual Power","offset":8,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"t1 actual","offset":12,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"t2 actual","offset":16,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"t3 actual","offset":20,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"t4 actual","offset":24,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"t1-t2 diff. temp.","offset":28,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"P1 actual","offset":32,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"P2 actual","offset":36,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Heat energy E1","offset":40,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Heat energy E2","offset":44,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Cooling energy E3","offset":48,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Inlet energy E4","offset":52,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Outlet energy E5","offset":56,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Tap water energy E6","offset":60,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Tap water energy E7","offset":64,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Energy E8","offset":68,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Energy E9","offset":72,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Energy E10","offset":76,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Energy E11","offset":80,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Tariff TA2","offset":84,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Tariff TA3","offset":88,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Tariff TA4","offset":92,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Heat energy A1","offset":96,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Heat energy A2","offset":100,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Volume V1","offset":104,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Volume V2","offset":108,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Pulse input A1","offset":112,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Pulse input B1","offset":116,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Pulse input A2","offset":120,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Pulse input B2","offset":124,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"COP","offset":128,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"t5 limit","offset":132,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Power Input B1","offset":136,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"QP average time","offset":140,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Tariff limit TL2","offset":144,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Tariff limit TL3","offset":148,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Tariff limit TL4","offset":152,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Mass M1","offset":156,"length":1,"offsetbit":0,"scale":"1","mask":""},{"type":"floatbe","name":"Mass M2","offset":160,"length":1,"offsetbit":0,"scale":"1","mask":""}],"swap1":"","swap2":"","swap3":"","swap1Type":"swap","swap2Type":"swap","swap3Type":"swap","msgProperty":"payload","msgPropertyType":"str","resultType":"keyvalue","resultTypeType":"return","multipleResult":false,"fanOutMultipleResult":false,"setTopic":true,"outputs":1,"x":850,"y":160,"wires":[["eedb38e299b060e0"]]},{"id":"d39367e1a3415ae9","type":"modbus-client","name":"Kamstrup Heat","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"failureLogEnabled":true,"tcpHost":"127.0.0.1","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","serialAsciiResponseStartDelimiter":"0x3A","unit_id":"1","commandDelay":"1","clientTimeout":"1000","reconnectOnTimeout":true,"reconnectTimeout":"2000","parallelUnitIdsAllowed":true,"showErrors":false,"showWarnings":true,"showLogs":true}]

Flow Info

Created 1 year, 2 months ago
Rating: not yet rated

Owner

Actions

Rate:

Node Types

Core
  • debug (x1)
  • function (x4)
  • inject (x1)
  • join (x1)
  • switch (x1)
Other

Tags

  • Modbus-TCP
  • Modbus
  • Kamstrup
  • Multical
  • Heat-Meter
  • Heat
  • Meter
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option