{
  "name": "Uplink wM-Bus Reader",
  "type": "UPLINK",
  "integrationType": "MQTT",
  "debugMode": false,
  "debugSettings": {
    "failuresEnabled": true,
    "allEnabled": false,
    "allEnabledUntil": 0
  },
  "configuration": {
    "scriptLang": "JS",
    "decoder": "/** Decoder **/\nvar payloadStr = decodeToString(payload);\nvar data = JSON.parse(payloadStr);\nvar deviceName =  data.deviceName;\nvar deviceType = 'wM-Bus Reader';\nvar res = _base64ToArrayBuffer(data.data);\n\nif (res.length < 9)\n    return null;\n\nvar existSerial = ['66413314','65656691','66413313','66413315'];\n\nvar serialNumber1 = null;\nvar serialNumber2 = null;\nvar serialNumber3 = null;\nvar serialNumber4 = null;\n\nvar serialNumber = GetWMBusSerial(res[1], res[2], res[3], res[4], existSerial);\n\nvar dateTime = GetCurrentDateTime();\n\nvar waterWMBusValue1 = null;\nvar waterWMBusValue2 = null;\nvar waterWMBusValue3 = null;\nvar waterWMBusValue4 = null;\n\nGetWMBusMeterValue(res[7], res[8], res[9], res[10], serialNumber, existSerial);\n\nvar low_bat = GetFlagError(res[0], 1);\nvar motion_detect = GetFlagError(res[0], 2);\nvar magnet_detect = GetFlagError(res[0], 3);\nvar tamper_detect = GetFlagError(res[0], 4);\nvar power_on = GetFlagError(res[0], 5);\nvar power_bat = GetFlagError(res[0], 6);\nvar err_time = GetFlagError(res[0], 7);\nvar cfg_done = GetFlagError(res[0], 8);\n\nvar result = {\n   deviceName: deviceName,\n   deviceType: deviceType,\n   attributes: {\n       integrationName: metadata['integrationName'],\n   },\n   telemetry: {\n       REAL_TIME: dateTime,\n       SERIAL1: serialNumber1,\n       SERIAL2: serialNumber2,\n       SERIAL3: serialNumber3,\n       SERIAL4: serialNumber4,\n\n       WATER_WMBUS_VALUE1: waterWMBusValue1,\n       WATER_WMBUS_VALUE2: waterWMBusValue2,\n       WATER_WMBUS_VALUE3: waterWMBusValue3,\n       WATER_WMBUS_VALUE4: waterWMBusValue4,\n\n       FLG_LOW_BAT: low_bat,\n       FLG_MOTION_DETECT: motion_detect,\n       FLG_MAGNET_DETECT: magnet_detect,\n       FLG_TAMPER_DETECT: tamper_detect,\n       FLG_POWER_ON: power_on,\n       FLG_POWER_BAT: power_bat,\n       FLG_ERR_TIME: err_time,\n       FLG_CFG_DONE: cfg_done\n   }\n};\n\n/** Helper functions **/\n\nfunction decodeToString(payload) {\n   return String.fromCharCode.apply(String, payload);\n}\n\nfunction decodeToJson(payload) {\n   var str = decodeToString(payload);\n   return JSON.parse(str);\n}\n\nfunction GetCurrentDateTime(){\n    var a = new Date();\n    var year = a.getFullYear().toString();\n    var month = (a.getMonth()+1).toString();\n    if(month.length==1) month=\"0\"+month;\n    var date = a.getDate().toString();\n    if(date.length==1) date=\"0\"+date;\n    var hour = a.getHours().toString();\n    if(hour.length==1) hour=\"0\"+hour;\n    var min = a.getMinutes().toString();\n    if(min.length==1) min=\"0\"+min;\n    var sec = a.getSeconds().toString();\n    if(sec.length==1) sec=\"0\"+sec;\n    return date + '.' + month + '.' + year + ' ' + hour + ':' + min + ':' + sec;\n}\n\nfunction _base64ToArrayBuffer(base64) {\n    var binary_string = atob(base64);\n    var len = binary_string.length;\n    var bytes = new Uint8Array(len);\n    for (var i = 0; i < len; i++) {\n        bytes[i] = binary_string.charCodeAt(i);\n    }\n    return bytes;\n}\n\nfunction GetWMBusSerial(byte1, byte2, byte3, byte4, arrSerial) {\n    var value1 = parseInt(byte1, 10).toString(2);\n    while(value1.length<8){value1='0'+value1;}\n\n    var value2 = parseInt(byte2, 10).toString(2);\n    while(value2.length<8){value2='0'+value2;}\n\n    var value3 = parseInt(byte3, 10).toString(2);\n    while(value3.length<8){value3='0'+value3;}\n\n    var value4 = parseInt(byte4, 10).toString(2);\n    while(value4.length<8){value4='0'+value4;}\n\n    var value = value1[4]+value1[5]+value1[6]+value1[7] + value2 + value3 + value4;\n    var res = parseInt(value,2).toString();\n\n    for (k = 0; k < arrSerial.length; k++) {\n        if (arrSerial[k] == res) {\n            if (k % 4 == 0) serialNumber1 = res;\n            if (k % 4 == 1) serialNumber2 = res;\n            if (k % 4 == 2) serialNumber3 = res;\n            if (k % 4 == 3) serialNumber4 = res;\n            return res;\n        }\n    }\n    return null;\n}\n\nfunction GetWMBusMeterValue(byte1, byte2, byte3, byte4, realSerialN, arrSerial) {\n    var value1 = parseInt(byte1, 10).toString(16);\n    while(value1.length<2){value1='0'+value1;}\n\n    var value2 = parseInt(byte2, 10).toString(16);\n    while(value2.length<2){value2='0'+value2;}\n\n    var value3 = parseInt(byte3, 10).toString(16);\n    while(value3.length<2){value3='0'+value3;}\n\n    var value4 = parseInt(byte4, 10).toString(16);\n    while(value4.length<2){value4='0'+value4;}\n\n    var value = value1 + value2 + value3 + value4;\n    var res = parseInt(value,16);\n\n    for (k = 0; k < arrSerial.length; k++) {\n        if (arrSerial[k] == realSerialN) {\n            if (k % 4 == 0) waterWMBusValue1 = res/1000;\n            if (k % 4 == 1) waterWMBusValue2 = res/1000;\n            if (k % 4 == 2) waterWMBusValue3 = res/1000;\n            if (k % 4 == 3) waterWMBusValue4 = res/1000;\n            return null;\n        }\n    }\n    return null;\n}\n\nfunction GetFlagError(byte1, num) {\n    var value = parseInt(byte1, 10).toString(2);\n    while(value.length<8){value='0'+value;}\n\n    if(num==1) return Number(value[7]);\n    if(num==2) return Number(value[6]);\n    if(num==3) return Number(value[5]);\n    if(num==4) return Number(value[4]);\n    if(num==5) return Number(value[3]);\n    if(num==6) return Number(value[2]);\n    if(num==7) return Number(value[1]);\n    if(num==8) return Number(value[0]);\n\n    return null;\n}\n\nreturn result;",
    "tbelDecoder": "// Decode an uplink message from a buffer\n// payload - array of bytes\n// metadata - key/value object\n\n/** Decoder **/\n\n// decode payload to string\nvar payloadStr = decodeToString(payload);\n\n// decode payload to JSON\n// var data = decodeToJson(payload);\n\nvar deviceName = 'Device A';\nvar deviceType = 'thermostat';\nvar customerName = 'Customer C';\nvar groupName = 'thermostat devices';\nvar manufacturer = 'Example corporation';\n// use assetName and assetType instead of deviceName and deviceType\n// to automatically create assets instead of devices.\n// var assetName = 'Asset A';\n// var assetType = 'building';\n\n// Result object with device/asset attributes/telemetry data\nvar result = {\n// Use deviceName and deviceType or assetName and assetType, but not both.\n   deviceName: deviceName,\n   deviceType: deviceType,\n// assetName: assetName,\n// assetType: assetType,\n// customerName: customerName,\n   groupName: groupName,\n   attributes: {\n       model: 'Model A',\n       serialNumber: 'SN111',\n       integrationName: metadata['integrationName'],\n       manufacturer: manufacturer\n   },\n   telemetry: {\n       temperature: 42,\n       humidity: 80,\n       rawData: payloadStr\n   }\n};\n\n/** Helper functions 'decodeToString' and 'decodeToJson' are already built-in **/\n\nreturn result;",
    "encoder": null,
    "tbelEncoder": null,
    "updateOnlyKeys": [
      "manufacturer"
    ]
  },
  "additionalInfo": {
    "description": ""
  },
  "edgeTemplate": false,
  "converterVersion": 1
}