{
  "name": "Uplink Gas Valve",
  "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 deviceType = 'Gas Valve';\nvar res = _base64ToArrayBuffer(data.data);\n\nif (res.length < 6)\n    return null;\n\nvar dateTime = GetCurrentDateTime();\nvar serial = GetSerial(res[3], res[4], res[5]);\nvar valveModel = GetModel(res[2]);\nvar stsValve = GetStsValve(res[2]);\nvar stsValveCode = GetStsValveCode(res[2]);\nvar deviceName = serial;\n\nvar low_bat = GetFlagError(res[1], 1);\nvar motion_detect = GetFlagError(res[1], 2);\nvar magnet_detect = GetFlagError(res[1], 3);\nvar tamper_detect = GetFlagError(res[1], 4);\nvar power_on = GetFlagError(res[1], 5);\nvar power_bat = GetFlagError(res[1], 6);\nvar err_time = GetFlagError(res[1], 7);\nvar cfg_done = GetFlagError(res[1], 8);\n\nvar result = {\n    deviceName: deviceName,\n    deviceType: deviceType,\n    attributes: {\n        integrationName: metadata['integrationName'],\n    },\n    telemetry: {\n        NAME_DEV: \"Gas Shutoff Valve LoRaWAN 'Smartico V-LR'\",\n        REAL_TIME: dateTime,\n        SERIAL: serial,\n        VALVE_MODEL: valveModel,\n        STS_VALVE: stsValve,\n        STS_VALVE_CODE: stsValveCode,\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 _base64ToArrayBuffer(base64) {\n    var binary_string = atob(base64);\n    var len = binary_string.length;\n    var bytes = new Uint8Array(len);\n\n    for (var i = 0; i < len; i++) {\n        bytes[i] = binary_string.charCodeAt(i);\n    }\n    return bytes;\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\n    return date + '.' + month + '.' + year + ' ' + hour + ':' + min + ':' + sec;\n}\n\nfunction GetSerial(byte1, byte2, byte3) {\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 value = value1 + value2 + value3;\n    var res = parseInt(value, 16).toString();\n\n    while (res.length < 7) res = '0' + res;\n\n    return res;\n}\n\nfunction GetModel(byte1) {\n    var value = parseInt(byte1, 10).toString(2);\n    while (value.length < 8) value = '0' + value;\n\n    var val = value[0] + value[1];\n    var res = parseInt(val, 2);\n\n    if (res == 0) return \"Gas\";\n    if (res == 1) return \"Water\";\n    return \"Undefined\";\n}\n\nfunction GetStsValve(byte1) {\n    var value = parseInt(byte1, 10).toString(2);\n    while (value.length < 8) value = '0' + value;\n\n    var val = value[5] + value[6] + value[7];\n    var res = parseInt(val, 2);\n\n    if (res == 0) return \"Undefined\";\n    if (res == 1) return \"Close\";\n    if (res == 2) return \"Ready to open\";\n    if (res == 3) return \"Open\";\n    return \"Error\";\n}\n\nfunction GetStsValveCode(byte1) {\n    var value = parseInt(byte1, 10).toString(2);\n    while (value.length < 8) value = '0' + value;\n\n    var val = value[5] + value[6] + value[7];\n    return parseInt(val, 2);\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
}