{
  "name": "ChirpStack uplink converter for TA692FC-L-5",
  "type": "UPLINK",
  "debugMode": true,
  "configuration": {
    "scriptLang": "JS",
    "decoder": "// Avantec Manufacturing Limited\n// https://www.avantec.com.hk/\n// for TA692FC-L-5\n// T.C. Liang\n// v1.0.0-2023-06-15\n\n// 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\n////var payloadStr = decodeToString(payload);\n\n// decode payload to JSON\nvar data = decodeToJson(payload);\n\nvar deviceLabel = data.deviceName; // \"Sales-Office\"\nvar deviceName =  base64ToHexWithoutUppercase(data.devEUI); //'0012bdfffe02ad04', unique\nvar deviceType = data.deviceProfileName; //\"TA692FC-L-5-868 Thermostat\"\n////var customerName = 'Customer C';\n//// var groupName = 'thermostat devices';\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\n// for downlink confirm\nif (data.data === null || data.data === undefined) {\n    return {\n       deviceName:  deviceName,\n       deviceType:  deviceType,\n       deviceLabel: deviceLabel,\n       attributes: { },\n       telemetry: {}\n    };\n}\n\n\nvar fanModeStateMeta = {\n        0: \"OFF\",\n        1: \"LOW\",\n        2: \"MED\",\n        3: \"HIGH\",\n        4: \"AUTO\"\n    };\nvar systemModeMeta = {\n        0: \"OFF\",\n        1: \"COOL\",\n        2: \"FAN-ONLY\"\n    };\n\nvar incomingHexData = base64ToHex(data.data);\n\n//var flags = parseInt(incomingHexData.substring(0, 2), 16);\n//var battery = parseInt(incomingHexData.substring(2, 4), 16);\n//var light = parseInt(incomingHexData.substring(4, 6), 16);\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   deviceLabel: deviceLabel,\n// assetName: assetName,\n// assetType: assetType,\n// customerName: customerName,\n    //// groupName: groupName,\n    attributes: {\n       //// model: 'Model A',\n       //// serialNumber: 'SN111'\n       applicationId: data.applicationID, // \"1\"\n       applicationName: data.applicationName, // \"TA692FC-L-5-Application\"\n       devEUI: base64ToHexWithoutUppercase(data.devEUI),\n       integrationName: metadata['integrationName'],\n       txInfo: data.txInfo,\n       fPort: data.fPort,\n       devAddr: base64ToHex(data.devAddr),\n       dr: data.dr,\n\n       ////incomingHexData: incomingHexData,\n       setTemperature: parseInt(incomingHexData.substring(4, 8), 16)/10,\n       coolProportionalOutput: parseInt(incomingHexData.substring(8, 10), 16)/100,\n       fanMode: fanModeStateMeta[parseInt(incomingHexData.substring(10, 12), 16)],\n       fanState: fanModeStateMeta[parseInt(incomingHexData.substring(12, 14), 16)],\n       threshold: parseInt(incomingHexData.substring(14, 16), 16)/10,\n       systemMode: systemModeMeta[parseInt(incomingHexData.substring(16, 18), 16)],\n       coolPBand: parseInt(incomingHexData.substring(18, 20), 16)/10,\n       coolITime: parseInt(incomingHexData.substring(20, 24), 16),\n       kFactor: parseInt(incomingHexData.substring(24, 26), 16)\n    },\n    telemetry: {\n       //// temperature: 42,\n       //// humidity: 80,\n       //// rawData: payloadStr\n       //flags: flags,\n       //battery: battery,\n       //light: light,\n\n       roomTemperature: parseInt(incomingHexData.substring(0, 4), 16)/10\n    }\n};\n\n/** Helper functions **/\n\nfunction decodeToString(payload) {\n   return String.fromCharCode.apply(String, payload);\n}\n\nfunction decodeToJson(payload) {\n   // covert payload to string.\n   var str = decodeToString(payload);\n\n   // parse string to JSON\n   var data = JSON.parse(str);\n   return data;\n}\n\nfunction base64ToHex(str) {\n  var raw = atob(str);\n  var res = \"\";\n  for (var i = 0; i < raw.length; i++) {\n    var hex = raw.charCodeAt(i).toString(16);\n    res += (hex.length === 2 ? hex : '0' + hex);\n  }\n  return res.toUpperCase();\n}\n\nfunction base64ToHexWithoutUppercase(str) {\n  var raw = atob(str);\n  var res = \"\";\n  for (var i = 0; i < raw.length; i++) {\n    var hex = raw.charCodeAt(i).toString(16);\n    res += (hex.length === 2 ? hex : '0' + hex);\n  }\n  return res; //.toUpperCase();\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';\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   },\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
  },
  "additionalInfo": {
    "description": "Avantec, v1.0.0, 2023-06-15"
  },
  "edgeTemplate": false,
  "externalId": null
}